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

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