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

Last change on this file since 1339 was 1339, checked in by sdipsl, 8 years ago
  • adjust the printed look and feel
  • Property licence set to
    The following licence information concerns ONLY the libIGCM tools
    ==================================================================

    Copyright © Centre National de la Recherche Scientifique CNRS
    Commissariat à l'Énergie Atomique CEA

    libIGCM : Library for Portable Models Computation of IGCM Group.

    IGCM Group is the french IPSL Global Climate Model Group.

    This library is a set of shell scripts and functions whose purpose is
    the management of the initialization, the launch, the transfer of
    output files, the post-processing and the monitoring of datas produce
    by any numerical program on any plateforme.

    This software is governed by the CeCILL license under French law and
    abiding by the rules of distribution of free software. You can use,
    modify and/ or redistribute the software under the terms of the CeCILL
    license as circulated by CEA, CNRS and INRIA at the following URL
    "http://www.cecill.info".

    As a counterpart to the access to the source code and rights to copy,
    modify and redistribute granted by the license, users are provided only
    with a limited warranty and the software's author, the holder of the
    economic rights, and the successive licensors have only limited
    liability.

    In this respect, the user's attention is drawn to the risks associated
    with loading, using, modifying and/or developing or reproducing the
    software by the user in light of its specific status of free software,
    that may mean that it is complicated to manipulate, and that also
    therefore means that it is reserved for developers and experienced
    professionals having in-depth computer knowledge. Users are therefore
    encouraged to load and test the software's suitability as regards their
    requirements in conditions enabling the security of their systems and/or
    data to be ensured and, more generally, to use and operate it in the
    same conditions as regards security.

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