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

Last change on this file since 1422 was 1422, checked in by jgipsl, 6 years ago

Corrected bug. fi was missing since changset [1420].

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