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

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