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

Last change on this file since 1339 was 1339, checked in by sdipsl, 8 years ago
  • adjust the printed look and feel
  • 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: 73.6 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
[778]19  # Debug Print :
[544]20  echo
21  IGCM_debug_Print 1 "IGCM_comp_Initialize"
22  echo
[2]23
[1244]24  typeset comp compname comptagname auxprint card_UserChoices first_option option i j
[544]25  for comp in ${config_ListOfComponents[*]} ; do
[2]26
[902]27    # Define component
[544]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
[1244]35    # ${compname}.card PATH
[544]36    card=${SUBMIT_DIR}/COMP/${compname}.card
[2]37
[544]38    # Manage component executable
39    IGCM_card_DefineArrayFromOption ${SUBMIT_DIR}/config.card Executable ${comp}
[2]40
[849]41    # Define all options in section [comp]
42    IGCM_debug_Print 3 " DefineArrayFromSection : ${comp}"
43    IGCM_card_DefineArrayFromSection ${SUBMIT_DIR}/config.card ${comp}
44    eval config_comp=\${config_${comp}[*]} > /dev/null 2>&1
45    for option in ${config_comp[*]} ; do
[902]46        IGCM_card_DefineVariableFromOption ${SUBMIT_DIR}/config.card ${comp} ${option}
[849]47    done
48    IGCM_debug_Print 3 " Found in section config_${comp} :  ${config_comp[*]} "
49
[544]50    # Debug Print :
51    eval auxprint=\${config_${comp}_WriteFrequency}
52    IGCM_debug_Print 1 "Write frequency for ${compname} : ${auxprint} "
53    #2> /dev/null
[2]54
[544]55    # Debug Print :
56    IGCM_debug_Print 2 "Initialize following component library"
[522]57
[544]58    # Source drivers in directory DRIVER if it exist
59    # else source them from directory COMP
60    if [ -d ${SUBMIT_DIR}/DRIVER ] ; then
61      IGCM_debug_Print 2 ${SUBMIT_DIR}/DRIVER/${compname}.driver
62      # Source component library
63      . ${SUBMIT_DIR}/DRIVER/${compname}.driver
64    else
65      IGCM_debug_Print 2 ${SUBMIT_DIR}/COMP/${compname}.driver
66      # Source component library
67      . ${SUBMIT_DIR}/COMP/${compname}.driver
68    fi
69    IGCM_debug_Print 3 "With tag : ${comptagname}"
[2]70
[544]71    # Debug Print
72    IGCM_debug_Print 3 "Initialize ${comp} output directory."
[2]73
[544]74    # Define ARCHIVED Dirs
75    eval R_OUT_${comp}=${R_SAVE}/${comp}
76    eval IGCM_sys_MkdirArchive \${R_OUT_${comp}}
[2]77
[544]78    eval R_OUT_${comp}_O=\${R_OUT_${comp}}/Output
79    eval IGCM_sys_MkdirArchive \${R_OUT_${comp}_O}
[2]80
[544]81    eval R_OUT_${comp}_R=\${R_OUT_${comp}}/Restart
[804]82    [ ${config_Post_PackFrequency} = NONE ] && eval IGCM_sys_MkdirArchive \${R_OUT_${comp}_R}
[2]83
[544]84    eval R_OUT_${comp}_D=\${R_OUT_${comp}}/Debug
[804]85    [ ${config_Post_PackFrequency} = NONE ] && eval IGCM_sys_MkdirArchive \${R_OUT_${comp}_D}
[2]86
[544]87    eval R_OUT_${comp}_O_I=\${R_OUT_${comp}_O}/INS
88    eval R_OUT_${comp}_O_H=\${R_OUT_${comp}_O}/HF
89    eval R_OUT_${comp}_O_D=\${R_OUT_${comp}_O}/DA
90    eval R_OUT_${comp}_O_M=\${R_OUT_${comp}_O}/MO
91    eval R_OUT_${comp}_O_Y=\${R_OUT_${comp}_O}/YE
92
93    # Define BUFFERED Dirs
[1022]94    if ( [ ! ${config_Post_PackFrequency} = NONE ] || [ X${config_UserChoices_SpaceName} = XTEST ] ) ; then
[804]95      eval R_BUF_${comp}=${R_BUFR}/${comp}
96      eval IGCM_sys_Mkdir \${R_BUF_${comp}}
[544]97
[804]98      eval R_BUF_${comp}_O=\${R_BUF_${comp}}/Output
99      eval IGCM_sys_Mkdir \${R_BUF_${comp}_O}
[544]100
[804]101      eval R_BUF_${comp}_R=\${R_BUF_${comp}}/Restart
102      eval IGCM_sys_Mkdir \${R_BUF_${comp}_R}
[544]103
[804]104      eval R_BUF_${comp}_D=\${R_BUF_${comp}}/Debug
105      eval IGCM_sys_Mkdir \${R_BUF_${comp}_D}
[544]106
[804]107      eval R_BUF_${comp}_O_I=\${R_BUF_${comp}_O}/INS
108      eval R_BUF_${comp}_O_H=\${R_BUF_${comp}_O}/HF
109      eval R_BUF_${comp}_O_D=\${R_BUF_${comp}_O}/DA
110      eval R_BUF_${comp}_O_M=\${R_BUF_${comp}_O}/MO
111      eval R_BUF_${comp}_O_Y=\${R_BUF_${comp}_O}/YE
112    fi
[544]113
114    # Read UserChoices section of component card
115    IGCM_debug_Print 2 "DefineArrayFromSection : ${compname}_UserChoices ${card}"
116    IGCM_card_DefineArrayFromSection ${card} UserChoices
117    eval first_option=\${${compname}_UserChoices[0]} > /dev/null 2>&1
[804]118
[544]119    # If section is not empty we define corresponding variables
120    if [ X${first_option} != X"Error:" ] ; then
121      if [ X${card_UserChoices[0]} != X ] ; then
[778]122        unset card_UserChoices
[544]123      fi
[833]124      eval set +A card_UserChoices -- \${${compname}_UserChoices[*]} > /dev/null 2>&1
[544]125      IGCM_debug_Print 3 "${compname}_UserChoices_values:"
126      for option in ${card_UserChoices[*]} ; do
[778]127        IGCM_card_DefineVariableFromOption ${card} UserChoices ${option}
128        eval IGCM_debug_Print 3 "${option}=\${${compname}_UserChoices_${option}}"
[544]129      done
130    fi
131
132    # Read and Build Output File stuff
133    IGCM_debug_Print 2 "DefineArrayFromOption  : ${compname}_OutputFiles ${card}"
134    IGCM_card_DefineArrayFromOption ${card} OutputFiles List
135    ListFilesName=${compname}_OutputFiles_List
136    eval FileName0=\${${ListFilesName}[0]} > /dev/null 2>&1
137    #
138    if [ X${FileName0} != X${NULL_STR} ] ; then
139      #
140      #IGCM_debug_Print 1 "Component      : ${compname}"
141      #
142      # INITIALISATION
143      #
144      eval NbFiles=\${#${ListFilesName}[@]} > /dev/null 2>&1
145      #
146      i=2
147      #
148      until [ $i -ge $NbFiles ]; do
[778]149        #
150        eval flag_post=\${${ListFilesName}[$i]} > /dev/null 2>&1
151        #
152        if [ X${flag_post} != XNONE ] ; then
153          #
[544]154          # First of all
155          #
[778]156          IGCM_card_DefineArrayFromSection ${card} ${flag_post}
[1151]157          # This section is mandatory
158          if [ "X$( eval echo \${${compname}_${flag_post}[@]} )" = "X" ] ; then
159            IGCM_debug_Print 1 "IGCM_card_DefineArrayFromSection ${card} ${flag_post}"
160            IGCM_debug_Exit "${flag_post} section do not exist in ${card}. Please check your card."
161            IGCM_debug_Verif_Exit
162          fi
[778]163          #
164          # Seasonal case : If option Seasonal is not found (old cards) put SEASONAL ON by default
165          #
166          # variable option allready typeset above
167          for option in $( eval echo \${${compname}_${flag_post}[*]} ) ; do
168            if [ ${option} = Seasonal ] ; then
169              FoundSeasonal=true
170              IGCM_card_DefineVariableFromOption ${card} ${flag_post} Seasonal
171            fi
172          done
173          #
174          if [ ! X${FoundSeasonal} = Xtrue ] ; then
175            eval ${compname}_${flag_post}_Seasonal=ON
176          fi
177          #
178          if [ $( eval echo \${${compname}_${flag_post}_Seasonal} ) = ON ] ; then
179            Seasonal=true
180          fi
181
182          # Dimension = vide si vieille card.
183          IGCM_card_DefineArrayFromOption ${card} ${flag_post} TimeSeriesVars
184          IGCM_card_DefineArrayFromOption ${card} ${flag_post} Patches
185          if [ X"$( eval echo \${${compname}_${flag_post}_TimeSeriesVars[*]} )" = X"Option not" ] ; then
186            # New TimeSeriesVar description, with 2D, 3D and associate ChunckJob.
187            ListDimension[0]=2D
188            ListDimension[1]=3D
189            TimeSeries=false
190            iLoop=${#ListDimension[*]}
191            j=0
192            until [ $j -ge ${iLoop} ]; do
193              Dimension=${ListDimension[${j}]}
194              IGCM_card_DefineArrayFromOption ${card} ${flag_post} TimeSeriesVars${Dimension}
195              IGCM_card_DefineVariableFromOption ${card} ${flag_post} ChunckJob${Dimension}
[544]196              #
[778]197              # Time series WITHOUT chunk
198              #
199              if [ ! $( eval echo \${${compname}_${flag_post}_TimeSeriesVars${Dimension}} ) = ${NULL_STR} ] ; then
200                if [ $( eval echo \${${compname}_${flag_post}_ChunckJob${Dimension}} ) = NONE ] ; then
201                  IGCM_debug_Print 3 "${Dimension} time series activated for ${flag_post}"
202                  eval TimeSeries${Dimension}=true
203                fi
204              fi
205              #
206              # Time series WITH chunk
207              #
208              if [ ! $( eval echo \${${compname}_${flag_post}_TimeSeriesVars${Dimension}} ) = ${NULL_STR} ] ; then
209                chunck_size=$( eval echo \${${compname}_${flag_post}_ChunckJob${Dimension}} )
210                if [ ! ${chunck_size} = NONE ] &&  [ ! ${chunck_size} = OFF ] ; then
211                  IGCM_debug_Print 3 "${Dimension} time series activated with chunck for ${flag_post}"
212                  eval TimeSeriesChunck${Dimension}=true
[829]213                  eval CHUNCK${Dimension}_COMP[\${#CHUNCK${Dimension}_COMP[*]}]=${comp}
214                  eval CHUNCK${Dimension}_FLAG[\${#CHUNCK${Dimension}_FLAG[*]}]=${i}
215                  eval CHUNCK${Dimension}_NAME[\${#CHUNCK${Dimension}_NAME[*]}]=${flag_post}
216                  eval CHUNCK${Dimension}_SIZE[\${#CHUNCK${Dimension}_SIZE[*]}]=${chunck_size}
[778]217                fi
218              fi
219              (( j=j+1 ))
220            done
221          else
222            ListDimension[0]=""
223            TimeSeries=true
224            TimeSeries2D=false
225            TimeSeries3D=false
226            TimeSeriesChunck2D=false
227            TimeSeriesChunck3D=false
228          fi
229        fi
230        (( i=i+3 ))
[544]231      done
232    fi
233    # Debug Print
234    IGCM_debug_Print 3 "Initialize ${compname} with driver."
235    # INIT component
236    ${comp}_Initialize
237    echo
238  done
[2]239
[544]240  IGCM_debug_PopStack "IGCM_comp_Initialize"
[2]241}
242
243#=======================================================================
244function IGCM_comp_PrepareDeletedFiles
245{
[544]246  IGCM_debug_PushStack "IGCM_comp_PrepareDeletedFiles" $@
[778]247
[544]248  if [ X${2} != X. ] ; then
249    eval FileToBeDeleted[${#FileToBeDeleted[@]}]=$( basename ${2} ) > /dev/null 2>&1
250  else
251    eval FileToBeDeleted[${#FileToBeDeleted[@]}]=$( basename ${1} ) > /dev/null 2>&1
252  fi
[2]253
[544]254  IGCM_debug_PopStack "IGCM_comp_PrepareDeletedFiles"
[2]255}
256
257#=======================================================================
[1338]258function IGCM_comp_PrepareXiosFiles
259{
260  IGCM_debug_PushStack "IGCM_comp_PrepareXiosFiles" $@
261
262  typeset file
263  [ X${2} != X. ] && file=$( basename ${2} ) || file=$( basename ${1} )
264
265  if [ $( echo ${file} | grep "^field_def_" | wc -l ) = 1 ] ; then
266    eval FieldDef[${#FieldDef[@]}]=${file} > /dev/null 2>&1
267  fi
268  if [ $( echo ${file} | grep "^file_def_" | wc -l ) = 1 ] ; then
269    eval FileDef[${#FileDef[@]}]=${file} > /dev/null 2>&1
270  fi
271 
272  IGCM_debug_PopStack "IGCM_comp_PrepareXiosFiles"
273}
274
275#=======================================================================
[2]276function IGCM_comp_GetInputInitialStateFiles
277{
[544]278  IGCM_debug_PushStack "IGCM_comp_GetInputInitialStateFiles"
[2]279
[544]280  # Debug Print :
281  echo
282  IGCM_debug_Print 1 "IGCM_comp_GetInputInitialStateFiles"
283  echo
[2]284
[902]285  # Only the first time step need InitialStateFiles
[544]286  # otherwise it's BoundaryConditions
287  if ( ${FirstInitialize} ) ; then
[902]288    typeset comp compname comptagname card ListFilesName FileName0 NbFiles i i_
289    typeset file_in_ file_in file_out_ file_out do_init
[544]290    for comp in ${config_ListOfComponents[*]} ; do
291      # Initialize
292      do_init="y"
293      # Do we need to bring initial state file for this component
294      if [ "${config_Restarts_OverRule}" = "y" ] ; then
[778]295        eval do_init="n"
[544]296      else
[778]297        # Read component Restarts parameters
298        IGCM_card_DefineVariableFromOption ${SUBMIT_DIR}/config.card ${comp} Restart
299        eval do_start=\${config_${comp}_Restart} > /dev/null 2>&1
300        if [ "${do_start}" = "y" ] ; then
301          do_init="n"
302        else
303          do_init="y"
304        fi
[544]305      fi
[2]306
[544]307      if [ "${do_init}" = "y" ] ; then
[902]308        # Define component
[778]309        eval compname=\${config_ListOfComponents_${comp}[0]} > /dev/null 2>&1
310        eval comptagname=\${config_ListOfComponents_${comp}[1]} > /dev/null 2>&1
[2]311
[778]312        # Debug Print :
313        IGCM_debug_Print 3 "Initialisation files ${compname}"
[2]314
[778]315        card=${SUBMIT_DIR}/COMP/${compname}.card
[2]316
[778]317        IGCM_card_DefineArrayFromOption ${card} InitialStateFiles List
318        ListFilesName=${compname}_InitialStateFiles_List
[2]319
[778]320        eval FileName0=\${${ListFilesName}[0]} > /dev/null 2>&1
321        if [ X${FileName0} != X${NULL_STR} ] ; then
322          eval NbFiles=\${#${ListFilesName}[@]} > /dev/null 2>&1
323          (( i=0 ))
324          until [ $i -ge $NbFiles ]; do
325            eval file_in_=\${${ListFilesName}[$i]} > /dev/null 2>&1
326            eval file_in=${file_in_}
327            (( i_ = i+1 ))
328            eval file_out_=\${${ListFilesName}[$i_]} > /dev/null 2>&1
329            eval file_out=${file_out_}
[2]330
[778]331            IGCM_sys_IsFileArchived ${file_in}
332            if [ $? = 0 ] ; then
333              IGCM_sys_Get ${file_in} ${file_out}
334              #IGCM_comp_PrepareDeletedFiles ${file_in} ${file_out}
335            else
336              IGCM_sys_Cp ${file_in} ${file_out}
337            fi
338            (( i=i+2 ))
339          done
340        fi
[544]341      fi
342    done
343  fi
344  IGCM_debug_PopStack "IGCM_comp_GetInputInitialStateFiles"
[2]345}
346
347#=======================================================================
[247]348# Definition of Smooth modulo function
[902]349# usage :
[247]350# IGCM_SmoothModulo StringModulo value
351#
352# StringModulo : A string of min max and modulo like definition of Scilab vectors.
353# [min]:[modulo:][max]
354# where :
[902]355# [] value are optionnals;
[247]356# empty min equal 1
357# empty max equal infinity
358# modulo not given or empty equal 1
359# empty string or just ':' equal always.
360#
361# value : the value to test with the definition
362#
[902]363# return : true(1)/false(0)
[247]364function IGCM_SmoothModulo
365{
[544]366  IGCM_debug_PushStack "IGCM_SmoothModulo"
367  typeset defVector ModValue
[247]368
[544]369  eval set +A defVector -- $( echo "${1}" | \
370    gawk -F ':' '{print ($1 == "" ? 1 : $1) " " (NF==3 ? ($2 == "" ? 1 : $2) : 1) " " (NF==3 ? ($3 == "" ? -1 : $3) : ($2 == "" ? -1 : $2))}' )
[247]371
[544]372  # Save Smooth Min and Max. Needed to call IGCM_sys_Get when appropriate
373  arr[1]=${defVector[0]}
374  arr[2]=${defVector[2]}
[412]375
[902]376  # Test limits :
377  # ${defVector[0]} <= ${2} <= ${defVector[2]}
[544]378  #          or ${defVector[2]} == -1
379  if ( [ ${2} -ge ${defVector[0]} ] && ( [ ${2} -le ${defVector[2]} ] || [ ${defVector[2]} -lt 0 ] ) ) ; then
380    # Test modulo
381    ModValue=$( expr \( ${2} - ${defVector[0]} \) % ${defVector[1]} )
382    if [ ${ModValue} -eq 0 ] ;  then
383      arr[3]=true
384      echo ${arr[@]}
385      IGCM_debug_PopStack "IGCM_SmoothModulo"
386      return 1
[247]387    else
[544]388      arr[3]=false
389      echo ${arr[@]}
390      IGCM_debug_PopStack "IGCM_SmoothModulo"
391      return 0
[247]392    fi
[544]393  else
394    arr[3]=false
395    echo ${arr[@]}
396    IGCM_debug_PopStack "IGCM_SmoothModulo"
397    return 0
398  fi
[247]399}
400
401#=======================================================================
402function IGCM_comp_GetInputSmoothFiles
403{
[544]404  IGCM_debug_PushStack "IGCM_comp_GetInputSmoothFiles"
[247]405
[544]406  # Debug Print :
407  echo
408  IGCM_debug_Print 1 "IGCM_comp_GetInputSmoothFiles"
409  echo
[247]410
[544]411  typeset comp compname comptagname card ListFilesName FileName0 NbFiles j i i_ i__
412  typeset file_in_ file_in file_out_ file_out ret SmoothDef aux val
[247]413
[544]414  for comp in ${config_ListOfComponents[*]} ; do
415    # Define component
416    eval compname=\${config_ListOfComponents_${comp}[0]} > /dev/null 2>&1
417    eval comptagname=\${config_ListOfComponents_${comp}[1]} > /dev/null 2>&1
[247]418
[544]419    # Debug Print :
420    IGCM_debug_Print 3 "Smooth files ${compname}"
[247]421
[544]422    card=${SUBMIT_DIR}/COMP/${compname}.card
[247]423
[544]424    IGCM_card_DefineArrayFromOption ${card} SmoothFiles List
425    ListFilesName=${compname}_SmoothFiles_List
426    eval FileName0=\${${ListFilesName}[0]} > /dev/null 2>&1
[247]427
[544]428    if ( [ X${FileName0} != X${NULL_STR} ] && [ X${FileName0} != X"Section" ] ) ; then
429      eval NbFiles=\${#${ListFilesName}[@]} > /dev/null 2>&1
[247]430
[544]431      (( i=0 ))
432      until [ $i -ge $NbFiles ]; do
[778]433        eval file_in_=\${${ListFilesName}[$i]} > /dev/null 2>&1
434        eval file_in=${file_in_}
435        (( i_ = i+1 ))
436        eval file_out_=\${${ListFilesName}[$i_]} > /dev/null 2>&1
437        eval file_out=${file_out_}
[247]438
[778]439        # define CumulPeriod definition for this file
440        (( i__ = i+2 ))
441        eval SmoothDef=\${${ListFilesName}[$i__]}
442        IGCM_debug_Print 3 "  ${file_in} ${SmoothDef}"
443        aux=$( IGCM_SmoothModulo ${SmoothDef} ${CumulPeriod} )
444        j=1
445        for val in ${aux} ; do
446          [ ${j} -eq 1 ] && SmoothMin=${val}
447          [ ${j} -eq 2 ] && SmoothMax=${val}
448          [ ${j} -eq 3 ] && ret=${val}
449          (( j=j+1 ))
450        done
451        [ ${SmoothMax} -eq -1 ] && SmoothMax=${CumulPeriod}
452        if ( [ X${ret} = Xtrue ] || ( [ ${Period} -eq 1 ] && [ ${CumulPeriod} -ge ${SmoothMin} ] && [ ${CumulPeriod} -le ${SmoothMax} ] ) ) ; then
[548]453
[778]454          IGCM_sys_IsFileArchived ${file_in}
455          if [ $? = 0 ] ; then
456            IGCM_sys_Get ${file_in} ${file_out}
457            #IGCM_comp_PrepareDeletedFiles ${file_in} ${file_out}
458          else
459            IGCM_sys_Cp ${file_in} ${file_out}
460          fi
461        fi
462        (( i=i+3 ))
[544]463      done
464    fi
465  done
[778]466
[544]467  IGCM_debug_PopStack "IGCM_comp_GetInputSmoothFiles"
[247]468}
469
470#=======================================================================
[2]471function IGCM_comp_GetInputBoundaryFiles
472{
[544]473  IGCM_debug_PushStack "IGCM_comp_GetInputBoundaryFiles"
[2]474
[544]475  # Debug Print :
476  echo
477  IGCM_debug_Print 1 "IGCM_comp_GetInputBoundaryFiles"
478  echo
[2]479
[902]480  typeset comp compname comptagname card ListFilesName FileName0 NbFiles i i_
481  typeset file_in_ file_in file_out_ file_out
[2]482
[544]483  if [ ${Period} = 1 ]; then
484    ListFixBoundary=" "
485  fi
[2]486
[544]487  for comp in ${config_ListOfComponents[*]} ; do
[2]488
[544]489    # Define component
490    eval compname=\${config_ListOfComponents_${comp}[0]} > /dev/null 2>&1
491    eval comptagname=\${config_ListOfComponents_${comp}[1]} > /dev/null 2>&1
[2]492
[544]493    # Debug Print :
494    IGCM_debug_Print 3 "Boundary files ${compname}"
[2]495
[544]496    card=${SUBMIT_DIR}/COMP/${compname}.card
[2]497
[544]498    IGCM_card_DefineArrayFromOption ${card} BoundaryFiles List
499    ListFilesName=${compname}_BoundaryFiles_List
500    eval FileName0=\${${ListFilesName}[0]} > /dev/null 2>&1
[2]501
[544]502    if [ X${FileName0} != X${NULL_STR} ] ; then
503      eval NbFiles=\${#${ListFilesName}[@]} > /dev/null 2>&1
[2]504
[544]505      (( i=0 ))
506      until [ $i -ge $NbFiles ]; do
[778]507        eval file_in_=\${${ListFilesName}[$i]} > /dev/null 2>&1
508        eval file_in=${file_in_}
509        (( i_ = i+1 ))
510        eval file_out_=\${${ListFilesName}[$i_]} > /dev/null 2>&1
511        eval file_out=${file_out_}
[2]512
[778]513        IGCM_sys_IsFileArchived ${file_in}
514        if [ $? = 0 ] ; then
515          IGCM_sys_Get ${file_in} ${file_out}
[809]516          IGCM_comp_PrepareDeletedFiles ${file_in} ${file_out}
[778]517        else
518          IGCM_sys_Cp ${file_in} ${file_out}
519        fi
[2]520
[778]521        (( i=i+2 ))
[544]522      done
523    fi
[2]524
[544]525    # Get non deleted files
526    if [ ${Period} = 1 ]; then
[2]527
[544]528      IGCM_card_DefineArrayFromOption ${card} BoundaryFiles ListNonDel
529      ListFilesName=${compname}_BoundaryFiles_ListNonDel
530      eval FileName0=\${${ListFilesName}[0]} > /dev/null 2>&1
[778]531
[544]532      if [ X${FileName0} != X${NULL_STR} ] ; then
[778]533        eval NbFiles=\${#${ListFilesName}[@]} > /dev/null 2>&1
[2]534
[778]535        (( i=0 ))
536        until [ $i -ge $NbFiles ]; do
537          eval file_in_=\${${ListFilesName}[$i]} > /dev/null 2>&1
538          eval file_in=${file_in_}
539          (( i_ = i+1 ))
540          eval file_out_=\${${ListFilesName}[$i_]} > /dev/null 2>&1
541          eval file_out=${file_out_}
[2]542
[778]543          IGCM_sys_IsFileArchived ${file_in}
544          if [ $? = 0 ] ; then
545            IGCM_sys_Get ${file_in} ${file_out}
546            #IGCM_comp_PrepareDeletedFiles ${file_in} ${file_out}
547          else
548            IGCM_sys_Cp ${file_in} ${file_out}
549          fi
[2]550
[778]551          if [ X${file_out} != X. ] ; then
552            ListFixBoundary=${ListFixBoundary}" "${file_out}
553          else
554            ListFixBoundary=${ListFixBoundary}" "$( basename ${file_in} )
555          fi
556
557          (( i=i+2 ))
558        done
[544]559      fi
560    fi
561  done
[778]562
[544]563  IGCM_debug_PopStack "IGCM_comp_GetInputBoundaryFiles"
[2]564}
565
566#=======================================================================
567function IGCM_comp_DelFixeBoundaryFiles
568{
[544]569  IGCM_debug_PushStack "IGCM_comp_DelFixeBoundaryFiles"
[2]570
[544]571  # Debug Print :
572  echo
573  IGCM_debug_Print 1 "IGCM_comp_DelFixeBoundaryFiles"
574  echo
[2]575
[544]576  ls -l ${ListFixBoundary}
577  rm -f ${ListFixBoundary}
[2]578
[544]579  IGCM_debug_PopStack "IGCM_comp_DelFixeBoundaryFiles"
[2]580}
581
582#=======================================================================
583function IGCM_comp_GetInputParametersFiles
584{
[544]585  IGCM_debug_PushStack "IGCM_comp_GetInputParametersFiles"
[2]586
[544]587  # Debug Print :
588  echo
589  IGCM_debug_Print 1 "IGCM_comp_GetInputParametersFiles"
590  echo
[2]591
[544]592  typeset comp compname comptagname card ListFilesName FileName0 NbFiles i i_ file_in file_out
593  for comp in ${config_ListOfComponents[*]} ; do
[902]594    # Define component
[544]595    eval compname=\${config_ListOfComponents_${comp}[0]} > /dev/null 2>&1
596    eval comptagname=\${config_ListOfComponents_${comp}[1]} > /dev/null 2>&1
[2]597
[1338]598    # Initialize array hosting file_def and field_def files to check and/or modify
599    unset FieldDef
600    unset FileDef
601
[544]602    # Debug Print :
603    IGCM_debug_Print 3 "Parameters ${compname}"
[2]604
[778]605    card=${SUBMIT_DIR}/COMP/${compname}.card
[2]606
[544]607    IGCM_card_DefineArrayFromOption ${card} ParametersFiles List
608    ListFilesName=${compname}_ParametersFiles_List
609    eval FileName0=\${${ListFilesName}[0]} > /dev/null 2>&1
[2]610
[544]611    if [ X${FileName0} != X${NULL_STR} ] ; then
612      eval NbFiles=\${#${ListFilesName}[@]} > /dev/null 2>&1
[2]613
[544]614      (( i=0 ))
615      until [ $i -ge $NbFiles ]; do
[778]616        eval file_in_=\${${ListFilesName}[$i]} > /dev/null 2>&1
617        eval file_in=${file_in_}
618        (( i_ = i+1 ))
619        eval file_out_=\${${ListFilesName}[$i_]} > /dev/null 2>&1
[902]620        eval file_out=${file_out_}
[2]621
[902]622        IGCM_sys_Cp ${file_in} ${file_out}
[778]623        IGCM_comp_PrepareDeletedFiles ${file_in} ${file_out}
[1338]624        IGCM_comp_PrepareXiosFiles    ${file_in} ${file_out}
[2]625
[778]626        (( i=i+2 ))
[544]627      done
628    fi
[1338]629
630    if [ ${#FileDef[@]} -ne 0 ] ; then
631      # Check XMLs coherency now
[1339]632      IGCM_debug_Print 1 "${libIGCM}/libIGCM_post/xios_parser.py check --field ${FieldDef[*]} --file ${FileDef[*]}"
633      ${libIGCM}/libIGCM_post/xios_parser.py check --field ${FieldDef[*]} --file ${FileDef[*]}
[1338]634      if [ $? = 0 ] ; then
[1339]635        IGCM_debug_Print 1 "${compname} XIOS XMLs are consistent"
[1338]636      else
[1339]637        IGCM_debug_Print 1 "${compname} XIOS XMLs ARE NOT consistent. Try to fix it:"
638        IGCM_debug_Print 3 "${libIGCM}/libIGCM_post/xios_parser.py -v modify --field ${FieldDef[*]} --file ${FileDef[*]}"
639        ${libIGCM}/libIGCM_post/xios_parser.py -vv modify --field ${FieldDef[*]} --file ${FileDef[*]}
640        [ $? != 0 ] &&  IGCM_debug_Exit "Failed to fix XIOS xml files for ${compname}"
[1338]641      fi
642    fi
[544]643  done
[2]644
[544]645  IGCM_debug_PopStack "IGCM_comp_GetInputParametersFiles"
[2]646}
647
648#=======================================================================
649function IGCM_comp_GetInputRestartFiles
650{
[544]651  IGCM_debug_PushStack "IGCM_comp_GetInputRestartFiles"
[2]652
[544]653  # Debug Print :
654  echo
655  IGCM_debug_Print 1 "IGCM_comp_GetInputRestartFiles"
656  echo
[2]657
[590]658  typeset Date_tmp Date_r Path_r do_start CompOldName Path_OUT Path_BUF
659  typeset Buffered Archived Tared PotentialTarFile IsMatching TarFileFound
[902]660  typeset comp compname comptagname card ListFilesName FileName0 NbFiles i i_
[544]661  typeset file_in file_out file_in_ file_out_ file_in_Name
662  typeset -Z4 j4
[821]663  #BASH declare j4
[2]664
[778]665  IsMatching=""
666
[544]667  for comp in ${config_ListOfComponents[*]} ; do
[902]668    # Define component
[544]669    eval compname=\${config_ListOfComponents_${comp}[0]} > /dev/null 2>&1
670    eval comptagname=\${config_ListOfComponents_${comp}[1]} > /dev/null 2>&1
671    #
672    card=${SUBMIT_DIR}/COMP/${compname}.card
673    #
674    IGCM_card_DefineArrayFromOption ${card} RestartFiles List
675    ListFilesName=${compname}_RestartFiles_List
676    eval FileName0=\${${ListFilesName}[0]} > /dev/null 2>&1
[2]677
[544]678    # Debug Print :
679    IGCM_debug_Print 3 "restart ${compname}"
[2]680
[544]681    if ( ${FirstInitialize} ) ; then
[2]682
[544]683      if [ "${config_Restarts_OverRule}" = "y" ] ; then
[778]684        eval config_${comp}_Restart="y"
685        eval config_${comp}_RestartDate=${config_Restarts_RestartDate}
686        eval config_${comp}_RestartJobName=${config_Restarts_RestartJobName}
687        eval config_${comp}_RestartPath=${config_Restarts_RestartPath}
688        eval do_start=\${config_${comp}_Restart} > /dev/null 2>&1
689        eval CompOldName=${comp}
[544]690      else
[778]691        # Read component Restarts parameters
692        IGCM_card_DefineVariableFromOption ${SUBMIT_DIR}/config.card ${comp} Restart
693        eval do_start=\${config_${comp}_Restart} > /dev/null 2>&1
[2]694
[778]695        if [ "${do_start}" = "y" ] ; then
696          IGCM_card_DefineVariableFromOption ${SUBMIT_DIR}/config.card ${comp} RestartDate
697          IGCM_card_DefineVariableFromOption ${SUBMIT_DIR}/config.card ${comp} RestartJobName
698          IGCM_card_DefineVariableFromOption ${SUBMIT_DIR}/config.card ${comp} RestartPath
699        else
700          eval config_${comp}_RestartDate=-1
701          eval config_${comp}_RestartJobName=${NULL_STR}
702          eval config_${comp}_RestartPath=${NULL_STR}
703        fi
[849]704
[778]705        eval CompOldName=\${config_${comp}_OldName}
706        if [ X${CompOldName} = X ] ; then
707          eval CompOldName=${comp}
708        fi
709
710        # Reinitialize IsMatching to allow searching for a different tar file for each component.
711        IsMatching=""
712        TarFileFound=""
[544]713      fi
[2]714
[544]715      if [ "${do_start}" = "y" ] ; then
[2]716
[672]717        # Restore Restarts files
718        #-----------------------
[778]719        if ( [ X${FileName0} != X${NULL_STR} ] && [ X${FileName0} != XNONE ] ) ; then
720          eval NbFiles=\${#${ListFilesName}[@]} > /dev/null 2>&1
[2]721
[778]722          (( i=1 ))
723          until [ $i -gt $NbFiles ]; do
724            eval file_in_=\${${ListFilesName}[$i]} > /dev/null 2>&1
725            eval file_in=${file_in_}
726            (( i_ = i+1 ))
727            eval file_out_=\${${ListFilesName}[$i_]} > /dev/null 2>&1
728            eval file_out=${file_out_}
729
730            eval Date_tmp=\${config_${comp}_RestartDate}
731            Date_r=$( IGCM_date_ConvertFormatToGregorian ${Date_tmp} )
[672]732            # will be re-use
733            eval RestartPath=\${config_${comp}_RestartPath}
734            eval RestartJobName=\${config_${comp}_RestartJobName}
735            #
[778]736            Path_r=${RestartPath}/${RestartJobName}/${CompOldName}/Restart
737            file_in_Name=${RestartJobName}_${Date_r}_${file_in}
[2]738
[778]739            extension_in=$( echo ${file_in_Name##*.} )
740            extension_out=$( echo ${file_out##*.} )
[672]741
[778]742            generic_restart_file_name_in=$( basename ${file_in_Name} .${extension_in} )
743            generic_restart_file_name_out=$( basename ${file_out} .${extension_out} )
[2]744
[778]745            Path_OUT=${Path_r}/${generic_restart_file_name_in}
746
[672]747            if [ $( IGCM_sys_TestFileBuffer ${Path_OUT}*.${extension_in} ; echo $? ) = 0 ] ; then
[897]748              IGCM_debug_Print 3 "Buffered restart ${Path_OUT}*.${extension_in} "
[778]749              Buffered=true
750              Archived=false
751              Tared=false
752              nb_restart_file=$(IGCM_sys_CountFileBuffer ${Path_OUT}_????.${extension_in})
[672]753            elif [ $( IGCM_sys_TestFileArchive ${Path_OUT}*.${extension_in} ; echo $? ) = 0 ] ; then
[897]754              IGCM_debug_Print 3 "Archived restart ${Path_OUT}*.${extension_in}"
[778]755              Buffered=false
756              Archived=true
757              Tared=false
758              nb_restart_file=$(IGCM_sys_CountFileArchive ${Path_OUT}_????.${extension_in})
[672]759            else
[897]760              IGCM_debug_Print 3 "No restart file in the buffer nor in the archive directory"
761              IGCM_debug_Print 3 "${Path_OUT}*.${extension_in} do not exist"
[902]762              IGCM_debug_Print 3 "Restart files will now be searched for in : ${RestartPath}/${RestartJobName}/RESTART"
[778]763              Buffered=false
764              Archived=false
765              Tared=true
[672]766              # Look after the tar file we want if we did not found it already
[778]767              if [ X${IsMatching} = X ] ; then
[947]768                IGCM_sys_TestDirArchive ${RestartPath}/${RestartJobName}/RESTART
769                if [ $? ] ; then
[897]770                  for PotentialTarFile in $( IGCM_sys_RshArchive "find ${RestartPath}/${RestartJobName}/RESTART -name "${RestartJobName}_*restart*.tar" -print" ) ; do
771                    IsMatching=$( echo ${PotentialTarFile##*/} | \
772                      sed "s:_restart::" | \
773                      sed "s:^${RestartJobName}_::" | \
774                      sed "s:\.tar$::" | \
775                      gawk -F_ -v restartdate=${Date_r} \
776                      '{if (($1 <= restartdate) && ($2 >= restartdate)) {print $1"_"$2}}' )
777                    if [ ! X${IsMatching} = X ] ; then
778                      TarFileFound=${PotentialTarFile}
779                      break
780                    fi
781                  done
[1017]782                fi
783                # Stop here if nothing has been found
784                if [ X${TarFileFound} = X ] ; then
[902]785                  IGCM_debug_Print 3 "Restart files were not found!"
786                  IGCM_debug_Print 3 "Restart files have been searched for in buffer and archive directory."
787                  IGCM_debug_Print 3 "They have been searched for in packed and unpacked format."
[897]788                  IGCM_debug_Exit "Please double check restart settings in config.card"
789                  IGCM_debug_Verif_Exit
790                fi
[778]791              fi
[918]792              IGCM_sys_PrepareTaredRestart ${TarFileFound}
793              TarFileLocation=$( basename ${TarFileFound} )
[801]794              IGCM_debug_Print 1 "tar xvf ${TarFileLocation} ${comp}_${generic_restart_file_name_in}*.${extension_in}"
795              tar xvf ${TarFileLocation} ${comp}_${generic_restart_file_name_in}*.${extension_in}
[778]796              nb_restart_file=$( IGCM_sys_CountFileBuffer ${comp}_${generic_restart_file_name_in}_????.${extension_in} )
797            fi
[672]798
799            if [ ${nb_restart_file} -gt 1 ] ; then
[821]800              j=0                                      # BASH LINE NOT NEEDED
801              # BASH for j4 in in $( eval echo {0000..$(( nb_restart_file - 1 ))} ) ; do
802              until [ $j -ge ${nb_restart_file} ]; do  # BASH LINE NOT NEEDED
803                j4=${j}                                # BASH LINE NOT NEEDED
[778]804                if [ X${Buffered} = Xtrue ] ; then
805                  IGCM_sys_GetBuffer ${Path_OUT}_${j4}.${extension_in} ${generic_restart_file_name_out}_${j4}.${extension_out}
806                elif [ X${Archived} = Xtrue ] ; then
807                  IGCM_sys_Get ${Path_OUT}_${j4}.${extension_in} ${generic_restart_file_name_out}_${j4}.${extension_out}
808                elif [ X${Tared} = Xtrue ] ; then
809                  IGCM_sys_Mv ${comp}_${generic_restart_file_name_in}_${j4}.${extension_in} ${generic_restart_file_name_out}_${j4}.${extension_out}
810                fi
[821]811                (( j=j+1 ))                            #BASH LINE NOT NEEDED
[778]812              done
[740]813
[1248]814              # OCE SPECIFIC TO REBUILD RESTART WHEN NUMBER OF RESTART FILES DONT MATCH MPI PROCESS
815              if [ X${OCE_PROC_MPI} != X ] ; then
816                if [ ${OCE_PROC_MPI} -ne ${nb_restart_file} ] ; then
[740]817                  IGCM_sys_rebuild ${generic_restart_file_name_out}.${extension_out} ${generic_restart_file_name_out}_????.${extension_out}
818                  IGCM_sys_Rm ${generic_restart_file_name_out}_????.${extension_out}
819                fi
820              fi
[778]821            else
822              if [ X${Buffered} = Xtrue ] ; then
823                IGCM_sys_GetBuffer ${Path_r}/${file_in_Name} ${file_out}
824              elif [ X${Archived} = Xtrue ] ; then
825                IGCM_sys_Get ${Path_r}/${file_in_Name} ${file_out}
826              elif [ X${Tared} = Xtrue ] ; then
827                IGCM_sys_Mv ${comp}_${file_in_Name} ${file_out}
828              fi
829            fi
830            (( i=i+3 ))
831          done
832        else
833          if [ X${FileName0} != XNONE ] ; then
834            IGCM_debug_Exit "IGCM_comp_GetInputRestartFiles : No file in list for ${compname}."
835          else
836            IGCM_debug_Print 1 "IGCM_comp_GetInputRestartFiles : NONE specified in Restart List ${compname}."
837          fi
838        fi
[544]839      fi
[893]840    elif ( [ ${Period} -eq 1 ] && [ ${DRYRUN} -eq 0 ] ) ; then
[544]841      # if not FirstInitialize and first loop of this job
[2]842
[544]843      # Restore Restarts files
844      #-----------------------
845      if ( [ X${FileName0} != X${NULL_STR} ] && [ X${FileName0} != XNONE ] ) ; then
[778]846        eval NbFiles=\${#${ListFilesName}[@]} > /dev/null 2>&1
[2]847
[778]848        (( i=1 ))
849        until [ $i -gt $NbFiles ]; do
850          eval file_in_=\${${ListFilesName}[$i]} > /dev/null 2>&1
851          eval file_in=${file_in_}
852          (( i_ = i+1 ))
853          eval file_out_=\${${ListFilesName}[$i_]} > /dev/null 2>&1
854          eval file_out=${file_out_}
[2]855
[1028]856          file_in_Name=${config_UserChoices_JobName}_${LastPeriodDateEnd}_${file_in}
[662]857
[778]858          extension_in=$( echo ${file_in_Name##*.} )
859          extension_out=$( echo ${file_out##*.} )
[67]860
[778]861          generic_restart_file_name_in=$( basename ${file_in_Name} .${extension_in} )
862          generic_restart_file_name_out=$( basename ${file_out} .${extension_out} )
863
864          eval Path_BUF=\${R_BUF_${comp}_R}/${generic_restart_file_name_in}
865          eval Path_OUT=\${R_OUT_${comp}_R}/${generic_restart_file_name_in}
866
[662]867          if [ $( IGCM_sys_TestFileBuffer ${Path_BUF}*.${extension_in} ; echo $? ) = 0 ] ; then
[897]868            IGCM_debug_Print 3 "Buffered restart ${Path_BUF}*.${extension_in}"
[778]869            Buffered=true
870            Archived=false
871            Tared=false
872            nb_restart_file=$(IGCM_sys_CountFileBuffer ${Path_BUF}_????.${extension_in})
[672]873          elif [ $( IGCM_sys_TestFileArchive ${Path_OUT}*.${extension_in} ; echo $? ) = 0 ] ; then
[897]874            IGCM_debug_Print 3 "Archived restart ${Path_OUT}*.${extension_in}"
[778]875            Buffered=false
876            Archived=true
877            Tared=false
878            nb_restart_file=$(IGCM_sys_CountFileArchive ${Path_OUT}_????.${extension_in})
879          else
[897]880            IGCM_debug_Print 3 "No restart file in the buffer nor in the archive directory"
[902]881            IGCM_debug_Print 3 "Restart files will now be searched for in : ${R_SAVE}/RESTART"
[778]882            Buffered=false
883            Archived=false
884            Tared=true
885            # Look after the tar file we want if we did not found it already
886            if [ X${IsMatching} = X ] ; then
[801]887              for PotentialTarFile in $( IGCM_sys_RshArchive "find ${R_SAVE}/RESTART -name "${config_UserChoices_JobName}_*_restart.tar" -print" ) ; do
[778]888                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}}' )
889                if [ ! X${IsMatching} = X ] ; then
890                  TarFileFound=${PotentialTarFile}
891                  break
892                fi
893              done
894            fi
[1017]895            # Stop here if nothing has been found
896            if [ X${TarFileFound} = X ] ; then
897              IGCM_debug_Print 3 "Restart files were not found!"
898              IGCM_debug_Print 3 "Restart files have been searched for in buffer and archive directory."
899              IGCM_debug_Print 3 "They have been searched for in packed and unpacked format."
900              IGCM_debug_Exit "Please double check restart settings in config.card"
901              IGCM_debug_Verif_Exit
902            fi
[918]903            IGCM_sys_PrepareTaredRestart ${TarFileFound}
904            TarFileLocation=$( basename ${TarFileFound} )
[801]905            IGCM_debug_Print 1 "tar xvf ${TarFileLocation} ${comp}_${generic_restart_file_name_in}*.${extension_in}"
906            tar xvf ${TarFileLocation} ${comp}_${generic_restart_file_name_in}*.${extension_in}
[778]907            nb_restart_file=$( IGCM_sys_CountFileBuffer ${comp}_${generic_restart_file_name_in}_????.${extension_in} )
908          fi
[41]909
[778]910          if [ ${nb_restart_file} -gt 1 ] ; then
[821]911            j=0                                     # BASH LINE NOT NEEDED
912            #BASH for j4 in in $( eval echo {0000..$(( nb_restart_file - 1 ))} ) ; do
913            until [ $j -ge ${nb_restart_file} ]; do # BASH LINE NOT NEEDED
914              j4=${j}                               # BASH LINE NOT NEEDED
[778]915              if [ X${Buffered} = Xtrue ] ; then
916                IGCM_sys_GetBuffer ${Path_BUF}_${j4}.${extension_in} ${generic_restart_file_name_out}_${j4}.${extension_out}
917              elif [ X${Archived} = Xtrue ] ; then
918                IGCM_sys_Get ${Path_OUT}_${j4}.${extension_in} ${generic_restart_file_name_out}_${j4}.${extension_out}
919              elif [ X${Tared} = Xtrue ] ; then
920                IGCM_sys_Mv ${comp}_${generic_restart_file_name_in}_${j4}.${extension_in} ${generic_restart_file_name_out}_${j4}.${extension_out}
921              fi
[821]922              (( j=j+1 ))                           # BASH LINE NOT NEEDED
[778]923            done
924          else
925            if [ X${Buffered} = Xtrue ] ; then
926              eval IGCM_sys_GetBuffer \${R_BUF_${comp}_R}/${file_in_Name} ${file_out}
927            elif [ X${Archived} = Xtrue ] ; then
928              eval IGCM_sys_Get \${R_OUT_${comp}_R}/${file_in_Name} ${file_out}
929            elif [ X${Tared} = Xtrue ] ; then
930              IGCM_sys_Mv ${comp}_${file_in_Name} ${file_out}
931            fi
932          fi
933          (( i=i+3 ))
934        done
[544]935      else
[778]936        if [ X${FileName0} != XNONE ] ; then
937          IGCM_debug_Exit "IGCM_comp_GetInputRestartFiles : No file in list for ${compname}."
938        else
939          IGCM_debug_Print 1 "IGCM_comp_GetInputRestartFiles : NONE specified in Restart List ${compname}."
940        fi
[544]941      fi
[420]942    fi
[544]943  done
[420]944
[544]945  NbFiles=$( ls * 2> /dev/null | wc -l )
946  if [ ${NbFiles} -gt 0 ] ; then
947    IGCM_sys_Chmod u+rw *
948  fi
949
950  IGCM_debug_PopStack "IGCM_comp_GetInputRestartFiles"
[2]951}
952
953#=======================================================================
[269]954function IGCM_comp_PeriodStart
955{
[544]956  IGCM_debug_PushStack "IGCM_comp_PeriodStart"
[269]957
[544]958  # Debug Print :
959  echo
960  IGCM_debug_Print 1 "IGCM_comp_PeriodStart"
961  echo
[269]962
[902]963  typeset ExeNameIn ExeNameOut
[544]964  typeset comp compname comptagname
965  for comp in ${config_ListOfComponents[*]} ; do
[902]966    # Define component
[544]967    eval compname=\${config_ListOfComponents_${comp}[0]} > /dev/null 2>&1
968    eval comptagname=\${config_ListOfComponents_${comp}[1]} > /dev/null 2>&1
[269]969
[544]970    # Copy executable for this component
971    eval ExeNameIn=\${config_Executable_${comp}[0]}
972    eval ExeNameOut=\${config_Executable_${comp}[1]}
[269]973
[544]974    # Debug Print
975    IGCM_debug_Print 3 "PeriodStart ${compname} Driver Function (if any)."
976    # UPDATE component
977    ${comp}_PeriodStart 2> /dev/null
[269]978
[544]979  done
[269]980
[544]981  IGCM_debug_PopStack "IGCM_comp_PeriodStart"
[269]982}
983
[1166]984
985
[269]986#=======================================================================
[1166]987function IGCM_comp_modifyFile
988{
989#
990# syntax:     IGCM_comp_modifyFile  filein  key  [value]
991#
992# For example : IGCM_comp_modifyFile metrics_template.py case_id \'SE_${YEARS}\'
993#
994# This function is used to replace a pattern in a file for a specific variable.
995#
996# Arguments:
997# - filein : the file in run directory in which the variable should be set
998# - key    : the variable to modify
999# - value  : the value to set the key equal to
1000#
1001  IGCM_debug_PushStack "IGCM_comp_modifyFile"
1002
1003  typeset filein key value pattern
1004
1005  # Set local variables and test the arguments
1006  if [ $# = 3 ] ; then
1007    # Normal case with 3 arguments
1008    filein=$1 ; key=$2 ; value=$3
1009  else
1010    IGCM_debug_Exit "IGCM_comp_modifyFile: Bad number of arguments."
1011    IGCM_debug_PopStack "IGCM_comp_modifyFile"
1012    return
1013  fi
1014  IGCM_debug_Print 1 "Entering IGCM_comp_modifyFile with arguments: ${filein} ${key} ${value}"
1015
1016  # Test if the file exist
1017  if [ ! -f ${filein} ] ; then
1018    IGCM_debug_Exit "IGCM_comp_modifyFile: ${filein} does not exist."
1019    IGCM_debug_PopStack "IGCM_comp_modifyFile"
1020    return
1021  fi
1022
1023  # Read the line with key in the file without the comments
1024  pattern=$( grep "^ *${key} *=" ${filein} | sed -e "s% *\!.*%%" )
1025
1026  # Verify the existance of the pattern
1027  if [ X"${pattern}" = X ] ; then
1028    # Variable key is not set in filein, stop.
1029    IGCM_debug_Exit "IGCM_comp_modifyFile : Variable ${key} is not set in correct file. It should be set in ${filein}."
1030    IGCM_debug_PopStack "IGCM_comp_modifyFile"
1031    return
1032  fi
1033
1034  # Now change key in filein
[1176]1035  #sed -e "s:${pattern}:${key}=${value}:" ${filein} > ${filein}.tmp
1036  sed -e "s:^ *${key} *=.*:${key}=${value}:" ${filein} > ${filein}.tmp
[1166]1037  IGCM_debug_Print 1 "IGCM_comp_modifyFile: In ${filein} set ${key}=${value}"
1038  \mv ${filein}.tmp ${filein}
1039 
1040  IGCM_debug_PopStack "IGCM_comp_modifyFile"
1041}
1042
1043#=======================================================================
[1069]1044function IGCM_comp_modifyDefFile
1045{
1046#
1047# syntax:     IGCM_comp_modifyDefFile  type  filein  key  [value]
1048#
1049# For example : IGCM_comp_modifyDefFile blocker run.def day_step 1200
1050#
1051# This function is used to modify a parameter file for a specific variable.
[1075]1052# The file must be a ".def" file, i.e. with IOIPSL parameter file syntax.
1053# This function can be used in the comp.driver files for the components.
[1069]1054#
[1075]1055# Arguments:
[1081]1056# - type   : first argument must be blocker, nonblocker or force
[1075]1057#            For "blocker" case, the variable must be attributed the keyworld AUTO
[1069]1058#            otherwise this function will exit.
[1075]1059#            For "nonblocker" case, the user can remove or modify the variable. For
1060#            this case, as long as AUTO is not set, no modification will be done.
[1081]1061#            For "force" case, the variable will be modified even if it is not set to AUTO
[1069]1062# - filein : the file in run directory of .def type in which the variable should be set
1063# - key    : the variable to modify
[1075]1064# - value  : the value to set the key equal to, optional. If value is not set or if
[1069]1065#            value=DEFAULT, then a default value must be given in filein using syntax :
1066#            key= AUTO : DEFAULT=def_value
1067#
[1075]1068  IGCM_debug_PushStack "IGCM_comp_modifyDefFile"
[1069]1069
[1166]1070  typeset type filein key value
1071  typeset filelist nb_occ modify
1072
[1075]1073  # Set local variables and test the arguments
1074  if [ $# = 4 ] ; then
1075    # Normal case with 4 arguments
1076    type=$1 ; filein=$2 ; key=$3 ; value=$4
1077  elif [ $# = 3 ] ; then
1078    # Normal case with 3 arguments
1079    type=$1 ; filein=$2 ;       key=$3; value="DEFAULT"
1080  else
1081    IGCM_debug_Exit "IGCM_comp_modifyDefFile: Bad number of arguments."
[1079]1082    IGCM_debug_PopStack "IGCM_comp_modifyDefFile"
[1075]1083    return
1084  fi
[1166]1085  IGCM_debug_Print 1 "Entering IGCM_comp_modifyDefFile with arguments: ${type} ${filein} ${key} ${value}"
[1069]1086
[1075]1087  # Test if first argument is correct
[1166]1088  if [ ${type} != blocker ] && [ ${type} != nonblocker ] && [ ${type} != force ] ; then
[1081]1089    IGCM_debug_Exit "IGCM_comp_modifyDefFile: Error in first argument must be blocker, nonblocker or force"
[1079]1090    IGCM_debug_PopStack "IGCM_comp_modifyDefFile"
[1075]1091    return
1092  fi
[1069]1093
[1215]1094  # Test if the file exist.
1095  # Exit with error if the file does not exist for the case blocker or force.
1096  # Only return for the case nonblocker.
[1075]1097  if [ ! -f ${filein} ] ; then
[1215]1098    if [ ${type} = blocker ] || [ ${type} = force ] ; then
1099      IGCM_debug_Exit "IGCM_comp_modifyDefFile: ${filein} does not exist."
1100    else
1101      IGCM_debug_Print 1 "IGCM_comp_modifyDefFile: ${filein} does not exist. Nothing will be done for this file."
1102    fi
[1079]1103    IGCM_debug_PopStack "IGCM_comp_modifyDefFile"
[1075]1104    return
1105  fi
[1069]1106
[1102]1107  # Define list of files to test using all files with suffix .def (except used*.def)
1108  filelist=$( ls *def | grep -v used )
[1069]1109
[1075]1110  # Count number of occurances for the key in all files
[1166]1111  nb_occ=$( grep -w ${key} ${filelist} | grep -v "#"  | wc -l )
[1069]1112
[1075]1113  # Test if key is set several times
[1166]1114  if [ ${nb_occ} -gt 1 ] ; then
1115    IGCM_debug_Exit "IGCM_comp_modifyDefFile : Error in ${filein}: Variable=${key} is set ${nb_occ} times"
[1079]1116    IGCM_debug_PopStack "IGCM_comp_modifyDefFile"
[1075]1117    return
1118  fi
1119
1120  # Treatement according to different cases
[1166]1121  if [ ${nb_occ} -eq 0 ] && [ ${type} = blocker ] ; then
[1075]1122    # Stop if the key is never set and the function is blocker
[1166]1123    IGCM_debug_Exit "IGCM_comp_modifyDefFile : Error in ${filein}: Variable=${key} has been removed but this function is blocker. "
1124    IGCM_debug_Print 1 "IGCM_comp_modifyDefFile: restore ${filein} for variable ${key}."
1125  elif [ ${nb_occ} -eq 0 ] && [ ${type} = nonblocker ] ; then
[1075]1126    # The key is not set but it is a nonblocker call so nothing is done.
[1166]1127    IGCM_debug_Print 1 "IGCM_comp_modifyDefFile: ${key} is not set in ${filein}. This is a nonblocker call so nothing is done."
1128    IGCM_debug_Print 1 "IGCM_comp_modifyDefFile: Default value for ${key} from the model will be used."
[1081]1129    modify=no
[1166]1130  elif [ $( grep ${key} ${filein} | grep -v "\#"  |wc -l ) = 0 ] ; then
[1075]1131    # Variable key is not set in filein, stop.
[1166]1132    IGCM_debug_Exit "IGCM_comp_modifyDefFile : Variable ${key} is not set in correct file. It should be set in ${filein}."
[1081]1133  fi
1134
1135  # Check if AUTO is set in the filein on the same line as the key variable
[1166]1136  if [ $( grep -w ${key} ${filein} | grep -v "\#" | grep AUTO | wc -l ) = 1 ] ; then
[1156]1137    # Modification will be done for all cases
1138    modify=yes
1139  else
1140    # The variable was not set to AUTO
[1166]1141    if [ ${type} = blocker ] ; then
[1156]1142      # Exit because this is a blocker call
[1166]1143      IGCM_debug_Exit "IGCM_comp_modifyDefFile : The variable ${key} cannot be modified. It should be set to AUTO."
[1190]1144      IGCM_debug_PopStack "IGCM_comp_modifyDefFile"
[1156]1145      return
[1166]1146    elif [ ${type} = nonblocker ] ; then
[1156]1147      # Do nothing. Suppose that the user did set the variable correct
[1166]1148      IGCM_debug_Print 1 "IGCM_comp_modifyDefFile: ${key} is set by the user. Nothing done."
[1156]1149      modify=no
[1166]1150    elif [ ${type} = force ] ; then
[1156]1151      # Force modification
[1166]1152      IGCM_debug_Print 1 "IGCM_comp_modifyDefFile : Variabl=${key} was not set to AUTO. Modification will be forced."
[1081]1153      modify=yes
[1156]1154    fi
[1081]1155  fi
[1069]1156
[1081]1157  # Do the modifcation now
[1166]1158  if [ ${modify} = yes ] ; then
[1081]1159
[1156]1160    # For option DEFAULT, read default value from file.
[1166]1161    if [ X"${value}" = XDEFAULT ] || [ X"${value}" = X ] ; then
[1156]1162      # Case to set DEFAULT value
1163      # Read default value from filein
[1166]1164      value=$( grep ${key} ${filein} | grep -v "\#" | awk  -F"DEFAULT *=" '{print $2}')
[1069]1165
[1166]1166      if [ X"${value}" = X ] ; then
1167        IGCM_debug_Exit "IGCM_comp_modifyDefFile : The variable ${key} needs a DEFAULT value in ${filein}."
1168        IGCM_debug_Print 1 "IGCM_comp_modifyDefFile: The syntax in ${filein} should be:"
1169        IGCM_debug_Print 1 "IGCM_comp_modifyDefFile: ${key}=_AUTO_:DEFAULT=def_value"
[1156]1170        IGCM_debug_PopStack "IGCM_comp_modifyDefFile"
1171        return
[1075]1172      fi
[1156]1173    fi
[1069]1174
[1156]1175    # Now change key in filein
[1166]1176    sed -e "s/^${key}\ *=.*/${key}= ${value}/" ${filein} > ${filein}.tmp
1177    IGCM_debug_Print 1 "IGCM_comp_modifyDefFile: In ${filein} set ${key}=${value}"
1178    \mv ${filein}.tmp ${filein}
[1075]1179  fi
[1079]1180  IGCM_debug_PopStack "IGCM_comp_modifyDefFile"
[1069]1181}
1182
1183#=======================================================================
[1085]1184function IGCM_comp_modifyNamelist
1185{
1186#
1187# syntax:     IGCM_comp_modifyNamelist  type  filein  key  [value]
1188#
1189# For example : IGCM_comp_modifyNamelist blocker run.def day_step 1200
1190#
1191# This function is used to modify a parameter file for a specific variable.
[1155]1192# The file must be a "namelist" file, i.e. with fortran namelist syntax.
[1085]1193# This function can be used in the comp.driver files for the components.
1194#
1195# Arguments:
1196# - type   : first argument must be blocker, nonblocker or force
1197#            For "blocker" case, the variable must be attributed the keyworld AUTO
1198#            otherwise this function will exit.
1199#            For "nonblocker" case, the user can remove or modify the variable. For
1200#            this case, as long as AUTO is not set, no modification will be done.
1201#            For "force" case, the variable will be modified even if it is not set to AUTO
1202# - filein : the file in run directory of .def type in which the variable should be set
1203# - key    : the variable to modify
1204# - value  : the value to set the key equal to, optional. If value is not set or if
1205#            value=DEFAULT, then a default value must be given in filein using syntax :
1206#            key= AUTO : DEFAULT=def_value
1207#
1208  IGCM_debug_PushStack "IGCM_comp_modifyNamelist"
1209
[1166]1210  typeset type filein key value pattern modify
1211
[1085]1212  # Set local variables and test the arguments
1213  if [ $# = 4 ] ; then
1214    # Normal case with 4 arguments
1215    type=$1 ; filein=$2 ; key=$3 ; value=$4
1216  elif [ $# = 3 ] ; then
1217    # Normal case with 3 arguments
1218    type=$1 ; filein=$2 ;       key=$3; value="DEFAULT"
1219  else
1220    IGCM_debug_Exit "IGCM_comp_modifyNamelist: Bad number of arguments."
1221    IGCM_debug_PopStack "IGCM_comp_modifyNamelist"
1222    return
1223  fi
[1166]1224  IGCM_debug_Print 1 "Entering IGCM_comp_modifyNamelist with arguments: ${type} ${filein} ${key} ${value}"
[1085]1225
1226  # Test if first argument is correct
[1166]1227  if [ ${type} != blocker ] && [ ${type} != nonblocker ] && [ ${type} != force ] ; then
[1085]1228    IGCM_debug_Exit "IGCM_comp_modifyNamelist: Error in first argument must be blocker, nonblocker or force"
1229    IGCM_debug_PopStack "IGCM_comp_modifyNamelist"
1230    return
1231  fi
1232
[1215]1233  # Test if the file exist.
1234  # Exit with error if the file does not exist for the case blocker or force.
1235  # Only return for the case nonblocker.
[1085]1236  if [ ! -f ${filein} ] ; then
[1215]1237    if [ ${type} = blocker ] || [ ${type} = force ] ; then
1238      IGCM_debug_Exit "IGCM_comp_modifyNamelist: ${filein} does not exist."
1239    else
1240      IGCM_debug_Print 1 "IGCM_comp_modifyNamelist: ${filein} does not exist. Nothing will be done for this file."
1241    fi
[1085]1242    IGCM_debug_PopStack "IGCM_comp_modifyNamelist"
1243    return
1244  fi
1245
1246  # Read the line with key in the file without the comments
[1166]1247  pattern=$( grep "^ *${key} *=" ${filein} | sed -e "s% *\!.*%%" )
[1155]1248
[1085]1249  # Verify the existance of the pattern
1250  if [ X"$pattern" = X ] ; then
[1156]1251    # Variable key is not set in filein, stop.
[1166]1252    IGCM_debug_Exit "IGCM_comp_modifyNamelist : Variable ${key} is not set in correct file. It should be set in ${filein}."
[1156]1253    IGCM_debug_PopStack "IGCM_comp_modifyNamelist"
1254    return
[1085]1255  fi
[1155]1256
[1085]1257  # Check if the variable is set to AUTO in the filein
1258  if [ $( echo $pattern | grep AUTO | wc -l ) = 1 ] ; then
[1156]1259    # Modification will be done for all cases
1260    modify=yes
1261  else
1262    # The variable was not set to AUTO
[1166]1263    if [ ${type} = blocker ] ; then
[1156]1264      # Exit because this is a blocker call
[1166]1265      IGCM_debug_Exit "IGCM_comp_modifyNamelist : The variable ${key} cannot be modified. It should be set to AUTO."
[1156]1266      IGCM_debug_PopStack "IGCM_comp_modifyNamelist"
1267      return
[1166]1268    elif [ ${type} = nonblocker ] ; then
[1156]1269      # Do nothing. Suppose that the user did set the variable correct
[1166]1270      IGCM_debug_Print 1 "IGCM_comp_modifyNamelist: ${key} is set by the user. Nothing done."
[1156]1271      modify=no
[1166]1272    elif [ ${type} = force ] ; then
[1156]1273      # Force modification
[1166]1274      IGCM_debug_Print 1 "IGCM_comp_modifyNamelist : Variabl=${key} was not set to AUTO. Modification will be forced."
[1085]1275      modify=yes
[1156]1276    fi
[1085]1277  fi
1278
1279  # Do the modifcation now
[1166]1280  if [ ${modify} = yes ] ; then
[1085]1281
[1156]1282    # For option DEFAULT, read default value from file.
[1166]1283    if [ X"${value}" = XDEFAULT ] || [ X"${value}" = X ] ; then
[1156]1284      # Case to set DEFAULT value
1285      # Read default value from filein
1286      value=$( echo $pattern | awk  -F"DEFAULT *=" '{print $2}')
[1085]1287
[1166]1288      if [ X"${value}" = X ] ; then
1289        IGCM_debug_Exit "IGCM_comp_modifyNamelist : The variable ${key} needs a DEFAULT value in ${filein}."
1290        IGCM_debug_Print 1 "IGCM_comp_modifyNamelist: The syntax in ${filein} should be:"
1291        IGCM_debug_Print 1 "IGCM_comp_modifyNamelist: ${key}=_AUTO_:DEFAULT=def_value"
[1156]1292        IGCM_debug_PopStack "IGCM_comp_modifyNamelist"
1293        return
[1085]1294      fi
[1156]1295    fi
[1085]1296
[1156]1297    # Now change key in filein
[1166]1298    sed -e "s/${pattern}/       ${key}=${value}/" ${filein} > ${filein}.tmp
1299    IGCM_debug_Print 1 "IGCM_comp_modifyNamelist: In ${filein} set ${key}=${value}"
1300    \mv ${filein}.tmp ${filein}
[1085]1301  fi
1302  IGCM_debug_PopStack "IGCM_comp_modifyNamelist"
1303}
1304
1305#=======================================================================
[1074]1306function IGCM_comp_modifyXmlFile
1307{
1308#
1309# syntax:     IGCM_comp_modifyXmlFile  type  filein  keyid  keyattrib  value
1310#
1311# For example : IGCM_comp_modifyXmlFile force file_def_orchidee.xml sechiba2 enabled .TRUE.
1312#          or   IGCM_comp_modifyXmlFile blocker iodef.xml using_server NONE false
1313#
1314# This function is used to modify the value for a specific attribute and variable id.
[1155]1315# The file must be a valid xml file.
[1075]1316# This function can be used in the comp.driver files for the components.
[1074]1317#
[1075]1318# Arguments:
1319# - type      : first argument must be blocker, nonblocker or force.
1320#               For "blocker" case, the variable must be attributed the keyworld AUTO
[1074]1321#               otherwise this function will exit.
[1075]1322#               For "nonblocker" case, the user can remove or modify the variable. For
[1074]1323#               this case, as long as AUTO is not set, no modification will be done.
[1075]1324#               For "force" case, the variable will be modified even if it is not set to AUTO
[1074]1325# - filein    : the file in run directory of .xml type in which the variable should be set
1326# - keyid     : the variable to modify
1327# - keyattrib : the attribute name to modify. If NONE, then the variable itself will be modified
1328# - value     : the value to set in the filein
1329#
[1075]1330  IGCM_debug_PushStack "IGCM_comp_modifyXmlFile"
[1074]1331
[1166]1332  typeset type filein keyid keyattrib value modify
1333
[1075]1334  # Set local variables and test the arguments
1335  if [ $# = 5 ] ; then
1336    # Normal case with 4 arguments
1337    type=$1 ; filein=$2 ; keyid=$3 ; keyattrib=$4 ; value=$5
1338  else
1339    IGCM_debug_Exit "IGCM_comp_modifyXmlFile: Bad number of arguments."
[1089]1340    IGCM_debug_PopStack "IGCM_comp_modifyXmlFile"
[1075]1341    return
1342  fi
[1166]1343  IGCM_debug_Print 1 "Entering IGCM_comp_modifyXmlFile with arguments: type=${type} file=${filein}, id=${keyid} attribute=${keyattrib}, value=${value}"
[1074]1344
[1075]1345  # Test if first argument is correct
[1166]1346  if [ ${type} != blocker ] && [ ${type} != nonblocker ] && [ ${type} != force ] ; then
[1075]1347    IGCM_debug_Exit "IGCM_comp_modifyXmlFile: Error in first argument must be blocker, nonblocker or force"
[1089]1348    IGCM_debug_PopStack "IGCM_comp_modifyXmlFile"
[1075]1349    return
1350  fi
[1074]1351
[1215]1352  # Test if the file exist.
1353  # Exit with error if the file does not exist for the case blocker or force.
1354  # Only return for the case nonblocker.
[1075]1355  if [ ! -f ${filein} ] ; then
[1215]1356    if [ ${type} = blocker ] || [ ${type} = force ] ; then
1357      IGCM_debug_Exit "IGCM_comp_modifyXmlFile: ${filein} does not exist."
1358    else
1359      IGCM_debug_Print 1 "IGCM_comp_modifyXmlFile: ${filein} does not exist. Nothing will be done for this file."
1360    fi
[1089]1361    IGCM_debug_PopStack "IGCM_comp_modifyXmlFile"
[1075]1362    return
1363  fi
1364
1365  # Test if keyid is set in filein, otherwise exit
[1166]1366  if [ $( grep -w ${keyid} ${filein} | wc -l ) = 0 ] ; then
[1075]1367    # Variable key is not set in filein, stop.
[1166]1368    IGCM_debug_Exit "IGCM_comp_modifyXmlFile : ${keyid} is not set in the file. Bad syntax of ${filein} file."
[1089]1369    IGCM_debug_PopStack "IGCM_comp_modifyXmlFile"
[1075]1370    return
1371  fi
1372
1373  # Check if AUTO is set on the same line as keyid and keyattrib
[1166]1374  if [  $( grep -w ${keyid} ${filein} | grep AUTO | wc -l ) = 1 ] ; then
[1075]1375    # Modifification will be done
1376    modify=yes
1377  else
[1166]1378    if [ ${type} = blocker ] ; then
[1075]1379      # Exit, the variable must be set to AUTO
[1166]1380      IGCM_debug_Exit "IGCM_comp_modifyXmlFile : blocker function. The ${keyattrib} for ${keyid} must be set to AUTO in ${filein}."
[1089]1381      IGCM_debug_PopStack "IGCM_comp_modifyXmlFile"
[1075]1382      return
[1166]1383    elif [ ${type} = nonblocker ] ; then
[1075]1384      # Nothing will be done
1385      IGCM_debug_Print 1 "Nonblocker nothing is done for ${filein}, id=${keyid} and attribute ${keyattrib}"
1386      modify=no
[1166]1387    elif [ ${type} = force ] ; then
[1075]1388      # Force modification
[1166]1389      IGCM_debug_Print 1 "IGCM_comp_modifyXmlFile : Attribute=${keyattrib} for id=${keyid} was not set to AUTO. Modification will be forced."
[1075]1390      modify=yes
[1074]1391    fi
[1075]1392  fi
[1074]1393
[1075]1394  # Do the modifcation now
[1166]1395  if [ ${modify} = yes ] ; then
1396    if [ ${keyattrib} = NONE ] ; then
[1075]1397      # Case to modify the variable itself
1398      IGCM_debug_Print 1 "Now modify ${filein} for id=${keyid} by setting the variable=${value}"
[1166]1399      sed -e "s/\(<[^\"]*\"${keyid}\".*>\)\([^<]*\)\(<[^>]*\)/\1${value}\3/" ${filein} > ${filein}.tmp
[1074]1400    else
[1156]1401      # Check if keyattrib is set on the same line as keyid
[1166]1402      if [  $( grep -w ${keyid} ${filein} | grep ${keyattrib} | wc -l ) = 1 ] ; then
[1156]1403        # Case to modify the attribute value
1404        IGCM_debug_Print 1 "Now modify ${filein} for id=${keyid} by setting attribute to ${keyattrib}=${value}"
[1166]1405        sed -e "/id=\"${keyid}\"/s/\(${keyattrib}=\"\)[^\"]*\(\"\)/\1${value}\2/" ${filein} > ${filein}.tmp
[1156]1406      else
1407        # Case to add the attribute and its value
1408        IGCM_debug_Print 1 "Now add in ${filein} for id=${keyid} the attribute ${keyattrib} to the value ${value}"
[1166]1409        sed -e "/id=\"${keyid}\"/s/\/>/ ${keyattrib}=\"${value}\"\/>/" ${filein} > ${filein}.tmp
[1156]1410      fi
[1074]1411    fi
[1166]1412    \mv ${filein}.tmp ${filein}
[1075]1413  fi
1414  IGCM_debug_PopStack "IGCM_comp_modifyXmlFile"
[1074]1415}
1416
1417#=======================================================================
[2]1418function IGCM_comp_Update
1419{
[544]1420  IGCM_debug_PushStack "IGCM_comp_Update"
[2]1421
1422    # Debug Print :
[544]1423  echo
1424  IGCM_debug_Print 1 "IGCM_comp_Update"
1425  echo
[2]1426
[902]1427  typeset ExeNameIn ExeNameOut
[544]1428  typeset comp compname comptagname
1429  for comp in ${config_ListOfComponents[*]} ; do
[902]1430    # Define component
[544]1431    eval compname=\${config_ListOfComponents_${comp}[0]} > /dev/null 2>&1
1432    eval comptagname=\${config_ListOfComponents_${comp}[1]} > /dev/null 2>&1
[2]1433
[544]1434    # Copy executable for this component
1435    eval ExeNameIn=\${config_Executable_${comp}[0]}
1436    eval ExeNameOut=\${config_Executable_${comp}[1]}
[151]1437
[622]1438    # If missing executable and DRYRUN is set to 0 or 1  then stop!
1439    if [ ${DRYRUN} -le 1 ] && [ X${ExeNameIn} != X\"\" ] &&  [ ! -f ${R_EXE}/${ExeNameIn} ] ; then
1440      IGCM_debug_Exit "IGCM_comp_Update missing executable ${ExeNameIn}"
[778]1441    fi
[236]1442
[544]1443    if [ ${Period} -eq 1 ] && [ -f ${R_EXE}/${ExeNameIn} ] ; then
1444      eval IGCM_sys_Cp ${R_EXE}/${ExeNameIn} ${ExeNameOut}
1445      if [ -f ${RUN_DIR}/${ExeNameOut} ] ; then
1446        eval IGCM_sys_Chmod +rx ${RUN_DIR}/${ExeNameOut}
1447      fi
1448    elif [ -f ${R_EXE}/${ExeNameIn} ] && [ ! -f ${RUN_DIR}/${ExeNameOut} ] ; then
1449      eval IGCM_sys_Cp ${R_EXE}/${ExeNameIn} ${ExeNameOut}
1450      if [ -f ${RUN_DIR}/${ExeNameOut} ] ; then
1451        eval IGCM_sys_Chmod +rx ${RUN_DIR}/${ExeNameOut}
1452      fi
1453    fi
[2]1454
[544]1455    # Debug Print
1456    IGCM_debug_Print 1 "Update ${compname} Parameter Files."
1457    # UPDATE component
1458    ${comp}_Update
[2]1459
[544]1460  done
[2]1461
[544]1462  IGCM_debug_PopStack "IGCM_comp_Update"
[2]1463}
1464
1465#=======================================================================
1466function IGCM_comp_Finalize
1467{
[544]1468  IGCM_debug_PushStack "IGCM_comp_Finalize"
[2]1469
[544]1470  # Debug Print :
1471  echo
1472  IGCM_debug_Print 1 "IGCM_comp_Finalize"
1473  echo
[2]1474
[544]1475  typeset ListTextName TextName0
1476  typeset comp compname comptagname card ListFilesName FileName0 NbFiles SaveOnArchive
1477  typeset i i_ file_in file_in_ file_out file_out_ file_outin file_outin_ generic_file_name nb_rebuild_file
[1165]1478  typeset -Z4 j4 #BASH declare j4
[544]1479  typeset list_file nlist_file
1480  typeset compactoutputs
[429]1481
[1165]1482  # Initialize array hosting list of rebuilded files to copy
1483  unset rebuildedActionsList
1484
1485  # Text compacting options
[544]1486  compactoutputs=false
1487  if [ X${JobType} != XRUN ] ; then
1488    compactoutputs=true
1489  elif [ X${config_UserChoices_CompactText} != Xn ] ; then
1490    compactoutputs=true
1491  fi
[433]1492
[1043]1493  # Prepare headers for the shell dedicated to offline rebuild
1494  if [ X${AsynchronousRebuild} = Xtrue ] ; then
1495    [ ! -d ${RUN_DIR}/REBUILD_${PeriodDateBegin} ] && IGCM_sys_Mkdir ${RUN_DIR}/REBUILD_${PeriodDateBegin}
1496    if [ ${DRYRUN} -le 1 ] ; then
1497      echo "#!/bin/ksh                                        " >  ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1498      echo "function IGCM_FlushRebuild                        " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1499      echo "{                                                 " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1500      echo "IGCM_debug_PushStack \"IGCM_FlushRebuild\"        " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1501      echo "echo                                              " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1502      echo "IGCM_debug_Print 1 \"IGCM_FlushRebuild\"          " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1503      echo "echo                                              " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1504      echo "export R_SAVE=${R_SAVE}                           " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1505      echo "export R_BUFR=${R_BUFR}                           " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1506      echo "export R_OUT_KSH=${R_OUT_KSH}                     " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1507      echo "export R_BUF_KSH=${R_BUF_KSH}                     " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1508      echo "export config_UserChoices_JobName=${config_UserChoices_JobName}     " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1509      echo "export config_UserChoices_SpaceName=${config_UserChoices_SpaceName} " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1510    fi
1511  fi
1512
[544]1513  for comp in ${config_ListOfComponents[*]} ; do
[902]1514    # Define component
[544]1515    eval compname=\${config_ListOfComponents_${comp}[0]} > /dev/null 2>&1
1516    eval comptagname=\${config_ListOfComponents_${comp}[1]} > /dev/null 2>&1
[2]1517
[544]1518    # Debug Print
1519    IGCM_debug_Print 1 "Finalize ${comp} : ${compname} component."
1520    # FINALIZE component
1521    ${comp}_Finalize
[2]1522
[778]1523    card=${SUBMIT_DIR}/COMP/${compname}.card
[2]1524
[804]1525    # Save Output Text files of models
1526    #---------------------------------
1527    IGCM_debug_Print 2 "Save Output Text files for ${comp} : ${compname} component."
1528    IGCM_card_DefineArrayFromOption ${card} OutputText List
1529    ListTextName=${compname}_OutputText_List
1530
1531    eval TextName0=\${${ListTextName}[0]} > /dev/null 2>&1
1532    if [ X${TextName0} != X${NULL_STR} ] ; then
1533      eval NbFiles=\${#${ListTextName}[@]} > /dev/null 2>&1
1534
1535      (( i=0 ))
1536      until [ $i -eq $NbFiles ]; do
1537        eval file_in=\${${ListTextName}[$i]} > /dev/null 2>&1
1538        eval file_out=${PREFIX}_${file_in}
1539
1540        (( i=i+1 ))
1541
1542        unset list_file
1543        #set +A list_file -- $( ls ${file_in}* | sort 2>/dev/null )
1544        # result for a a1 a10 a2 with file_in=a a a1 a2 a10
1545        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 )
1546        nlist_file=${#list_file[@]}
1547        if [ ${nlist_file} -gt 1 ] ; then
1548          if ( ${compactoutputs} ) ; then
1549            IGCM_debug_Print 2 "Parallelism of Text Output with ${nlist_file} files."
1550            IGCM_debug_Print 2 "Compact files in ${file_out} : " ${list_file[*]}
1551            echo ${list_file[*]} > ${file_out}
1552            echo "" >> ${file_out}
1553
1554            (( i_ = 0 ))
[1080]1555            for file in ${list_file[@]} ; do
[804]1556              echo "_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ " >> ${file_out}
1557              echo "| " ${i_} " " ${file} >> ${file_out}
1558              echo "- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - " >> ${file_out}
[999]1559              cat ${file} | sed "s/\(.*\)/${i_}\1/" >> ${file_out}
[804]1560              echo "" >> ${file_out}
1561              eval FileToBeDeleted[${#FileToBeDeleted[@]}]="${file}" > /dev/null 2>&1
1562                  (( i_ = i_ + 1 ))
1563            done
[1080]1564            if ( ${ExecutionFail} ) ; then
1565              IGCM_sys_Cp ${file_out} ${SUBMIT_DIR}/Debug
1566            fi
1567
[804]1568            if [ X${Pack} = Xtrue ] ; then
1569              eval IGCM_sys_PutBuffer_Out ${file_out} \${R_BUF_${comp}_D}/${file_out}
1570            else
1571              eval IGCM_sys_Put_Out ${file_out} \${R_OUT_${comp}_D}/${file_out}
1572            fi
[1080]1573
[804]1574            eval FileToBeDeleted[${#FileToBeDeleted[@]}]="${file_out}" > /dev/null 2>&1
[1080]1575          else
1576            for file in ${list_file[@]} ; do
1577              if ( ${ExecutionFail} ) ; then
1578                IGCM_sys_Cp ${file} ${SUBMIT_DIR}/Debug/${PREFIX}_${file}
1579              fi
[804]1580
1581              if [ X${Pack} = Xtrue ] ; then
1582                eval IGCM_sys_PutBuffer_Out ${file} \${R_BUF_${comp}_D}/${PREFIX}_${file}
1583              else
1584                eval IGCM_sys_Put_Out ${file} \${R_OUT_${comp}_D}/${PREFIX}_${file}
1585              fi
[1080]1586
[804]1587              eval FileToBeDeleted[${#FileToBeDeleted[@]}]="${file}" > /dev/null 2>&1
1588            done
1589          fi
1590        else
1591          if ( [ -f ${file_in}_0000 ] || [ -f ${file_in}0 ] ) ; then
1592            eval IGCM_sys_Mv ${file_in}* ${file_in}
1593          fi
[1080]1594
1595          if ( ${ExecutionFail} ) ; then
1596            IGCM_sys_Cp ${file_in} ${SUBMIT_DIR}/Debug/${file_out}
1597          fi
1598
[804]1599          if [ X${Pack} = Xtrue ] ; then
1600            eval IGCM_sys_PutBuffer_Out ${file_in} \${R_BUF_${comp}_D}/${file_out}
1601          else
1602            eval IGCM_sys_Put_Out ${file_in} \${R_OUT_${comp}_D}/${file_out}
1603          fi
1604          eval FileToBeDeleted[${#FileToBeDeleted[@]}]="${file_in}" > /dev/null 2>&1
1605        fi
1606      done
1607    fi
1608
[544]1609    # Save Restarts files
1610    #--------------------
1611    IGCM_debug_Print 2 "Save Restart files for ${comp} : ${compname} component."
1612    IGCM_card_DefineArrayFromOption ${card} RestartFiles List
1613    ListFilesName=${compname}_RestartFiles_List
1614    eval FileName0=\${${ListFilesName}[0]} > /dev/null 2>&1
[778]1615
[544]1616    if ( [ X${FileName0} != X${NULL_STR} ] && [ X${FileName0} != XNONE ] ) ; then
1617      eval NbFiles=\${#${ListFilesName}[@]} > /dev/null 2>&1
[778]1618
[544]1619      (( i=0 ))
1620      until [ $i -ge $NbFiles ]; do
[778]1621        eval file_in_=\${${ListFilesName}[$i]} > /dev/null 2>&1
1622        eval file_in=${file_in_}
[2]1623
[778]1624        (( i_ = i+1 ))
1625        eval file_out_=\${${ListFilesName}[$i_]} > /dev/null 2>&1
1626        eval file_out=${file_out_}
[151]1627
[778]1628        (( i_ = i+2 ))
1629        eval file_outin_=\${${ListFilesName}[$i_]} > /dev/null 2>&1
1630        eval file_outin=${file_outin_}
[151]1631
[778]1632        generic_restart_file_name_in=$(    basename ${file_in} .nc )
1633        generic_restart_file_name_out=$(   basename ${config_UserChoices_JobName}_${PeriodDateEnd}_${file_out} .nc )
1634        generic_restart_file_name_outin=$( basename ${file_outin} .nc )
[2]1635
[902]1636        nb_restart_file=$( ls ${generic_restart_file_name_in}_????.nc 2>/dev/null | wc -l )
[778]1637        if [ ${nb_restart_file} -gt 1 ] ; then
[821]1638          j=0                                     # BASH LINE NOT NEEDED
1639          # BASH for j4 in in $( eval echo {0000..$(( nb_restart_file - 1 ))} ) ; do
1640          until [ $j -ge ${nb_restart_file} ]; do # BASH LINE NOT NEEDED
1641            j4=${j}                               # BASH LINE NOT NEEDED
[778]1642            if [ X${Pack} = Xtrue ] ; then
1643              eval IGCM_sys_PutBuffer_Rest ${generic_restart_file_name_in}_${j4}.nc \${R_BUF_${comp}_R}/${generic_restart_file_name_out}_${j4}.nc
1644            else
1645              eval IGCM_sys_Put_Rest ${generic_restart_file_name_in}_${j4}.nc \${R_OUT_${comp}_R}/${generic_restart_file_name_out}_${j4}.nc
1646            fi
1647            if [ ! ${file_in} = ${file_outin} ] ; then
1648              if ( ${ExitFlag} ) ; then
1649                echo "IGCM_sys_Mv ${generic_restart_file_name_in}_${j4}.nc ${generic_restart_file_name_outin}_${j4}.nc not executed."
1650              else
1651                IGCM_sys_Mv ${generic_restart_file_name_in}_${j4}.nc ${generic_restart_file_name_outin}_${j4}.nc
1652              fi
1653            fi
[821]1654            (( j=j+1 ))                           # BASH LINE NOT NEEDED
[778]1655          done
1656        else
1657          if [ X${Pack} = Xtrue ] ; then
1658            eval IGCM_sys_PutBuffer_Rest ${file_in} \${R_BUF_${comp}_R}/${config_UserChoices_JobName}_${PeriodDateEnd}_${file_out}
1659          else
1660            eval IGCM_sys_Put_Rest ${file_in} \${R_OUT_${comp}_R}/${config_UserChoices_JobName}_${PeriodDateEnd}_${file_out}
1661          fi
1662          if [ ! ${file_in} = ${file_outin} ] ; then
1663            if ( ${ExitFlag} ) ; then
1664              echo "IGCM_sys_Mv ${file_in} ${file_outin} not executed."
1665            else
1666              IGCM_sys_Mv ${file_in} ${file_outin}
1667            fi
1668          fi
1669        fi
1670
1671        (( i=i+3 ))
[544]1672      done
1673    else
1674      if [ X${FileName0} != XNONE ] ; then
[778]1675        IGCM_debug_Exit "IGCM_comp_Finalize : No file in restart list for ${compname}."
[544]1676      else
[778]1677        IGCM_debug_Print 1 "IGCM_comp_Finalize : NONE specified in Restart List ${compname}."
[544]1678      fi
1679    fi
[2]1680
[544]1681    # Save Output files
1682    #------------------
1683    IGCM_debug_Print 2 "Save Output files for ${comp} : ${compname} component."
1684    IGCM_card_DefineArrayFromOption ${card} OutputFiles List
1685    ListFilesName=${compname}_OutputFiles_List
1686    eval FileName0=\${${ListFilesName}[0]} > /dev/null 2>&1
[2]1687
[544]1688    if [ X${FileName0} != X${NULL_STR} ] ; then
1689      eval NbFiles=\${#${ListFilesName}[@]} > /dev/null 2>&1
[149]1690
[544]1691      (( i=0 ))
1692      until [ $i -ge $NbFiles ]; do
[778]1693        SaveOnArchive=true
1694        eval file_in_=\${${ListFilesName}[$i]} > /dev/null 2>&1
1695        eval file_in=${file_in_}
1696        (( i_ = i+1 ))
1697        eval file_out_=\${${ListFilesName}[$i_]} > /dev/null 2>&1
1698        eval file_out=${file_out_}
1699        #
1700        # Override file_out path remplacing R_SAVE by R_BUFR
1701        #
1702        if [ X${Pack} = Xtrue ] ; then
1703          file_out=$( echo $file_out | sed "s:^$R_SAVE:$R_BUFR:" )
1704        fi
1705        #
1706        # Not necessarily the best option. /!\ Potential side effects /!\
1707        #
1708        (( i_ = i+2 ))
1709        eval flag_post=\${${ListFilesName}[$i_]} > /dev/null 2>&1
1710        #
1711        generic_file_name=$( basename ${file_in} .nc )
1712        nb_rebuild_file=$( ls | grep "^${generic_file_name}_[0-9]*.nc" | wc -l )
1713        #
1714        if ( [ ${nb_rebuild_file} -eq 1 ] && [ -f ${generic_file_name}_0000.nc ] ) ; then
[804]1715          IGCM_debug_Print 2 "Parallelism with 1 file. Rebuilding ${file_in} not needed"
[778]1716          IGCM_sys_Mv ${generic_file_name}_0000.nc ${file_in}
1717        elif [ ${nb_rebuild_file} -gt 1 ] ; then
[804]1718          IGCM_debug_Print 2 "Parallelism detected and rebuilding ${file_in} is needed"
[778]1719          if [ X${AsynchronousRebuild} = Xfalse ] ; then
1720            IGCM_debug_Print 2 "Rebuilding ${file_in} online"
[980]1721            IGCM_sys_rebuild ${file_in} ${generic_file_name}_[0-9]*.nc
[778]1722          else
1723            IGCM_debug_Print 2 "Preparing offline rebuild for ${file_in}"
[980]1724            IGCM_sys_Mv ${generic_file_name}_[0-9]*.nc ${RUN_DIR}/REBUILD_${PeriodDateBegin}
[544]1725
[778]1726            # Prepare the shell dedicated to offline rebuild
1727            if [ $DRYRUN -le 1 ]; then
[694]1728              if [ ${file_in} = histstn.nc ] ; then
1729                echo "IGCM_sys_rebuild_station ${file_in} ${generic_file_name}_*.nc" >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1730              else
[980]1731                echo "IGCM_sys_rebuild ${file_in} ${generic_file_name}_[0-9]*.nc" >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
[694]1732              fi
[1206]1733              echo "IGCM_debug_Verif_Exit" >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
[778]1734            fi
1735            #
1736            # Load Patch we need to apply and apply
1737            if [ $DRYRUN -le 1 ]; then
1738              if [ X$( eval echo \${${compname}_${flag_post}_Patches[0]} ) !=  X${NULL_STR} ]; then
[1080]1739                for Patch in $( eval echo \${${compname}_${flag_post}_Patches[*]} ) ; do
[778]1740                  echo ". ${libIGCM_POST}/libIGCM_post/IGCM_${Patch}.ksh" >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1741                  echo "IGCM_${Patch} ${file_in}                        " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
[1206]1742                  echo "IGCM_debug_Verif_Exit                           " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
[778]1743                done
1744              fi
1745            fi
1746            #
1747            if [ $DRYRUN -le 1 ]; then
1748              if [ X${Pack} = Xtrue ] ; then
[1165]1749                rebuildedActionsList[${#rebuildedActionsList[*]}]="IGCM_sys_PutBuffer_Out ${file_in} ${file_out}"
[778]1750              else
[1165]1751                rebuildedActionsList[${#rebuildedActionsList[*]}]="IGCM_sys_Put_Out ${file_in} ${file_out}"
[778]1752              fi
[1206]1753              rebuildedActionsList[${#rebuildedActionsList[*]}]="IGCM_debug_Verif_Exit"
[1165]1754              rebuildedActionsList[${#rebuildedActionsList[*]}]="IGCM_sys_Rm ${generic_file_name}_[0-9]*.nc"
[778]1755            fi
1756            SaveOnArchive=false
1757          fi
1758        fi
1759        #
1760        if [ ${SaveOnArchive} = true ] ; then
1761          #
1762          # Rebuild has been done online or it was not needed
1763          #
1764          # If we need to apply a patch we use TMP DIRECTORY before ARCHIVING if asynchronous rebuild is on
1765          #
1766          thereisapatch=$( eval echo \${${compname}_${flag_post}_Patches[0]} )
[1289]1767          if ( [ ! X${thereisapatch} = X${NULL_STR} ] && [ ! X${thereisapatch} = X ] && [ X${AsynchronousRebuild} = Xtrue ] && [ -f ${file_in} ] ) ; then
[778]1768            IGCM_sys_Mv ${file_in} ${RUN_DIR}/REBUILD_${PeriodDateBegin}
1769            eval FileToBeDeleted[${#FileToBeDeleted[@]}]=REBUILD_${PeriodDateBegin}/${file_in} > /dev/null 2>&1
1770            #
1771            if [ $DRYRUN -le 1 ]; then
[1080]1772              for Patch in $( eval echo \${${compname}_${flag_post}_Patches[*]} ) ; do
[778]1773                echo ". ${libIGCM_POST}/libIGCM_post/IGCM_${Patch}.ksh" >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1774                echo "IGCM_${Patch} ${file_in}                        " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
[1206]1775                echo "IGCM_debug_Verif_Exit                           " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
[778]1776              done
1777              #
1778              if [ X${Pack} = Xtrue ] ; then
1779                echo "IGCM_sys_PutBuffer_Out ${file_in} ${file_out}   " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1780              else
1781                echo "IGCM_sys_Put_Out ${file_in} ${file_out}         " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1782              fi
[1206]1783              echo "IGCM_debug_Verif_Exit                             " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
[778]1784              #
1785            fi
1786          else
1787            #
1788            # No Patch, No Asynchronous rebuild, online rebuild has been done or was not needed
1789            #
1790            if [ X${Pack} = Xtrue ] ; then
1791              IGCM_sys_PutBuffer_Out ${file_in} ${file_out}
1792            else
1793              IGCM_sys_Put_Out ${file_in} ${file_out}
1794            fi
1795            eval FileToBeDeleted[${#FileToBeDeleted[@]}]="${file_in}" > /dev/null 2>&1
1796            if [ ${nb_rebuild_file} -gt 1 ] ; then
1797              for DelFile in $( ls | grep "${generic_file_name}[_0-9]*.nc" ) ; do
1798                eval FileToBeDeleted[${#FileToBeDeleted[@]}]=${DelFile} > /dev/null 2>&1
1799              done
1800            fi
1801          fi
1802        fi
1803        (( i=i+3 ))
[544]1804      done
1805    fi
1806    echo
1807  done
[1165]1808  # Append the sync call and the copy sequence to the IGCM_FlushRebuild function if needed
1809  if [ ${#rebuildedActionsList[*]} -ne 0 ] ; then
[1166]1810    echo "IGCM_sys_sync              " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
[1165]1811    i=0
1812    until [ ${i} -ge ${#rebuildedActionsList[*]} ]; do
1813      echo ${rebuildedActionsList[$i]} >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1814      (( i=i+1 ))
1815    done
1816  fi
[544]1817  IGCM_debug_PopStack "IGCM_comp_Finalize"
[2]1818}
Note: See TracBrowser for help on using the repository browser.