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

Last change on this file since 1224 was 1215, checked in by jgipsl, 9 years ago

Ticket #263
Only return for the case nonblocker if the file do not exist.

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