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

Last change on this file since 1244 was 1244, checked in by sdipsl, 9 years ago
  • rationalyze somehow message code logic
  • extend the information gathered by big brother
  • clean up
  • 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.0 KB
Line 
1#!/bin/ksh
2
3#**************************************************************
4# Author: Sebastien Denvil, Martial Mancip
5# Contact: Sebastien.Denvil__at__ipsl.jussieu.fr Martial.Mancip__at__ipsl.jussieu.fr
6# $Revision::                                          $ Revision of last commit
7# $Author::                                            $ Author of last commit
8# $Date::                                              $ Date of last commit
9# IPSL (2006)
10#  This software is governed by the CeCILL licence see libIGCM/libIGCM_CeCILL.LIC
11#
12#**************************************************************
13
14#========================================================================
15function IGCM_comp_Initialize
16{
17  IGCM_debug_PushStack "IGCM_comp_Initialize"
18
19  # Debug Print :
20  echo
21  IGCM_debug_Print 1 "IGCM_comp_Initialize"
22  echo
23
24  typeset comp compname comptagname auxprint card_UserChoices first_option option i j
25  for comp in ${config_ListOfComponents[*]} ; do
26
27    # Define component
28    IGCM_card_DefineArrayFromOption ${SUBMIT_DIR}/config.card ListOfComponents ${comp}
29    eval compname=\${config_ListOfComponents_${comp}[0]} > /dev/null 2>&1
30    eval comptagname=\${config_ListOfComponents_${comp}[1]} > /dev/null 2>&1
31
32    # Debug Print
33    IGCM_debug_Print 1 "Initialize ${comp} : ${compname} component."
34
35    # ${compname}.card PATH
36    card=${SUBMIT_DIR}/COMP/${compname}.card
37
38    # Manage component executable
39    IGCM_card_DefineArrayFromOption ${SUBMIT_DIR}/config.card Executable ${comp}
40
41    # Define all options in section [comp]
42    IGCM_debug_Print 3 " DefineArrayFromSection : ${comp}"
43    IGCM_card_DefineArrayFromSection ${SUBMIT_DIR}/config.card ${comp}
44    eval config_comp=\${config_${comp}[*]} > /dev/null 2>&1
45    for option in ${config_comp[*]} ; do
46        IGCM_card_DefineVariableFromOption ${SUBMIT_DIR}/config.card ${comp} ${option}
47    done
48    IGCM_debug_Print 3 " Found in section config_${comp} :  ${config_comp[*]} "
49
50    # Debug Print :
51    eval auxprint=\${config_${comp}_WriteFrequency}
52    IGCM_debug_Print 1 "Write frequency for ${compname} : ${auxprint} "
53    #2> /dev/null
54
55    # Debug Print :
56    IGCM_debug_Print 2 "Initialize following component library"
57
58    # Source drivers in directory DRIVER if it exist
59    # else source them from directory COMP
60    if [ -d ${SUBMIT_DIR}/DRIVER ] ; then
61      IGCM_debug_Print 2 ${SUBMIT_DIR}/DRIVER/${compname}.driver
62      # Source component library
63      . ${SUBMIT_DIR}/DRIVER/${compname}.driver
64    else
65      IGCM_debug_Print 2 ${SUBMIT_DIR}/COMP/${compname}.driver
66      # Source component library
67      . ${SUBMIT_DIR}/COMP/${compname}.driver
68    fi
69    IGCM_debug_Print 3 "With tag : ${comptagname}"
70
71    # Debug Print
72    IGCM_debug_Print 3 "Initialize ${comp} output directory."
73
74    # Define ARCHIVED Dirs
75    eval R_OUT_${comp}=${R_SAVE}/${comp}
76    eval IGCM_sys_MkdirArchive \${R_OUT_${comp}}
77
78    eval R_OUT_${comp}_O=\${R_OUT_${comp}}/Output
79    eval IGCM_sys_MkdirArchive \${R_OUT_${comp}_O}
80
81    eval R_OUT_${comp}_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              if [ X${NUM_PROC_OCE} != X ] ; then
778                if [ ${NUM_PROC_OCE} -ne ${nb_restart_file} ] ; then
779                  IGCM_sys_rebuild ${generic_restart_file_name_out}.${extension_out} ${generic_restart_file_name_out}_????.${extension_out}
780                  IGCM_sys_Rm ${generic_restart_file_name_out}_????.${extension_out}
781                fi
782              fi
783            else
784              if [ X${Buffered} = Xtrue ] ; then
785                IGCM_sys_GetBuffer ${Path_r}/${file_in_Name} ${file_out}
786              elif [ X${Archived} = Xtrue ] ; then
787                IGCM_sys_Get ${Path_r}/${file_in_Name} ${file_out}
788              elif [ X${Tared} = Xtrue ] ; then
789                IGCM_sys_Mv ${comp}_${file_in_Name} ${file_out}
790              fi
791            fi
792            (( i=i+3 ))
793          done
794        else
795          if [ X${FileName0} != XNONE ] ; then
796            IGCM_debug_Exit "IGCM_comp_GetInputRestartFiles : No file in list for ${compname}."
797          else
798            IGCM_debug_Print 1 "IGCM_comp_GetInputRestartFiles : NONE specified in Restart List ${compname}."
799          fi
800        fi
801      fi
802    elif ( [ ${Period} -eq 1 ] && [ ${DRYRUN} -eq 0 ] ) ; then
803      # if not FirstInitialize and first loop of this job
804
805      # Restore Restarts files
806      #-----------------------
807      if ( [ X${FileName0} != X${NULL_STR} ] && [ X${FileName0} != XNONE ] ) ; then
808        eval NbFiles=\${#${ListFilesName}[@]} > /dev/null 2>&1
809
810        (( i=1 ))
811        until [ $i -gt $NbFiles ]; do
812          eval file_in_=\${${ListFilesName}[$i]} > /dev/null 2>&1
813          eval file_in=${file_in_}
814          (( i_ = i+1 ))
815          eval file_out_=\${${ListFilesName}[$i_]} > /dev/null 2>&1
816          eval file_out=${file_out_}
817
818          file_in_Name=${config_UserChoices_JobName}_${LastPeriodDateEnd}_${file_in}
819
820          extension_in=$( echo ${file_in_Name##*.} )
821          extension_out=$( echo ${file_out##*.} )
822
823          generic_restart_file_name_in=$( basename ${file_in_Name} .${extension_in} )
824          generic_restart_file_name_out=$( basename ${file_out} .${extension_out} )
825
826          eval Path_BUF=\${R_BUF_${comp}_R}/${generic_restart_file_name_in}
827          eval Path_OUT=\${R_OUT_${comp}_R}/${generic_restart_file_name_in}
828
829          if [ $( IGCM_sys_TestFileBuffer ${Path_BUF}*.${extension_in} ; echo $? ) = 0 ] ; then
830            IGCM_debug_Print 3 "Buffered restart ${Path_BUF}*.${extension_in}"
831            Buffered=true
832            Archived=false
833            Tared=false
834            nb_restart_file=$(IGCM_sys_CountFileBuffer ${Path_BUF}_????.${extension_in})
835          elif [ $( IGCM_sys_TestFileArchive ${Path_OUT}*.${extension_in} ; echo $? ) = 0 ] ; then
836            IGCM_debug_Print 3 "Archived restart ${Path_OUT}*.${extension_in}"
837            Buffered=false
838            Archived=true
839            Tared=false
840            nb_restart_file=$(IGCM_sys_CountFileArchive ${Path_OUT}_????.${extension_in})
841          else
842            IGCM_debug_Print 3 "No restart file in the buffer nor in the archive directory"
843            IGCM_debug_Print 3 "Restart files will now be searched for in : ${R_SAVE}/RESTART"
844            Buffered=false
845            Archived=false
846            Tared=true
847            # Look after the tar file we want if we did not found it already
848            if [ X${IsMatching} = X ] ; then
849              for PotentialTarFile in $( IGCM_sys_RshArchive "find ${R_SAVE}/RESTART -name "${config_UserChoices_JobName}_*_restart.tar" -print" ) ; do
850                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}}' )
851                if [ ! X${IsMatching} = X ] ; then
852                  TarFileFound=${PotentialTarFile}
853                  break
854                fi
855              done
856            fi
857            # Stop here if nothing has been found
858            if [ X${TarFileFound} = X ] ; then
859              IGCM_debug_Print 3 "Restart files were not found!"
860              IGCM_debug_Print 3 "Restart files have been searched for in buffer and archive directory."
861              IGCM_debug_Print 3 "They have been searched for in packed and unpacked format."
862              IGCM_debug_Exit "Please double check restart settings in config.card"
863              IGCM_debug_Verif_Exit
864            fi
865            IGCM_sys_PrepareTaredRestart ${TarFileFound}
866            TarFileLocation=$( basename ${TarFileFound} )
867            IGCM_debug_Print 1 "tar xvf ${TarFileLocation} ${comp}_${generic_restart_file_name_in}*.${extension_in}"
868            tar xvf ${TarFileLocation} ${comp}_${generic_restart_file_name_in}*.${extension_in}
869            nb_restart_file=$( IGCM_sys_CountFileBuffer ${comp}_${generic_restart_file_name_in}_????.${extension_in} )
870          fi
871
872          if [ ${nb_restart_file} -gt 1 ] ; then
873            j=0                                     # BASH LINE NOT NEEDED
874            #BASH for j4 in in $( eval echo {0000..$(( nb_restart_file - 1 ))} ) ; do
875            until [ $j -ge ${nb_restart_file} ]; do # BASH LINE NOT NEEDED
876              j4=${j}                               # BASH LINE NOT NEEDED
877              if [ X${Buffered} = Xtrue ] ; then
878                IGCM_sys_GetBuffer ${Path_BUF}_${j4}.${extension_in} ${generic_restart_file_name_out}_${j4}.${extension_out}
879              elif [ X${Archived} = Xtrue ] ; then
880                IGCM_sys_Get ${Path_OUT}_${j4}.${extension_in} ${generic_restart_file_name_out}_${j4}.${extension_out}
881              elif [ X${Tared} = Xtrue ] ; then
882                IGCM_sys_Mv ${comp}_${generic_restart_file_name_in}_${j4}.${extension_in} ${generic_restart_file_name_out}_${j4}.${extension_out}
883              fi
884              (( j=j+1 ))                           # BASH LINE NOT NEEDED
885            done
886          else
887            if [ X${Buffered} = Xtrue ] ; then
888              eval IGCM_sys_GetBuffer \${R_BUF_${comp}_R}/${file_in_Name} ${file_out}
889            elif [ X${Archived} = Xtrue ] ; then
890              eval IGCM_sys_Get \${R_OUT_${comp}_R}/${file_in_Name} ${file_out}
891            elif [ X${Tared} = Xtrue ] ; then
892              IGCM_sys_Mv ${comp}_${file_in_Name} ${file_out}
893            fi
894          fi
895          (( i=i+3 ))
896        done
897      else
898        if [ X${FileName0} != XNONE ] ; then
899          IGCM_debug_Exit "IGCM_comp_GetInputRestartFiles : No file in list for ${compname}."
900        else
901          IGCM_debug_Print 1 "IGCM_comp_GetInputRestartFiles : NONE specified in Restart List ${compname}."
902        fi
903      fi
904    fi
905  done
906
907  NbFiles=$( ls * 2> /dev/null | wc -l )
908  if [ ${NbFiles} -gt 0 ] ; then
909    IGCM_sys_Chmod u+rw *
910  fi
911
912  IGCM_debug_PopStack "IGCM_comp_GetInputRestartFiles"
913}
914
915#=======================================================================
916function IGCM_comp_PeriodStart
917{
918  IGCM_debug_PushStack "IGCM_comp_PeriodStart"
919
920  # Debug Print :
921  echo
922  IGCM_debug_Print 1 "IGCM_comp_PeriodStart"
923  echo
924
925  typeset ExeNameIn ExeNameOut
926  typeset comp compname comptagname
927  for comp in ${config_ListOfComponents[*]} ; do
928    # Define component
929    eval compname=\${config_ListOfComponents_${comp}[0]} > /dev/null 2>&1
930    eval comptagname=\${config_ListOfComponents_${comp}[1]} > /dev/null 2>&1
931
932    # Copy executable for this component
933    eval ExeNameIn=\${config_Executable_${comp}[0]}
934    eval ExeNameOut=\${config_Executable_${comp}[1]}
935
936    # Debug Print
937    IGCM_debug_Print 3 "PeriodStart ${compname} Driver Function (if any)."
938    # UPDATE component
939    ${comp}_PeriodStart 2> /dev/null
940
941  done
942
943  IGCM_debug_PopStack "IGCM_comp_PeriodStart"
944}
945
946
947
948#=======================================================================
949function IGCM_comp_modifyFile
950{
951#
952# syntax:     IGCM_comp_modifyFile  filein  key  [value]
953#
954# For example : IGCM_comp_modifyFile metrics_template.py case_id \'SE_${YEARS}\'
955#
956# This function is used to replace a pattern in a file for a specific variable.
957#
958# Arguments:
959# - filein : the file in run directory in which the variable should be set
960# - key    : the variable to modify
961# - value  : the value to set the key equal to
962#
963  IGCM_debug_PushStack "IGCM_comp_modifyFile"
964
965  typeset filein key value pattern
966
967  # Set local variables and test the arguments
968  if [ $# = 3 ] ; then
969    # Normal case with 3 arguments
970    filein=$1 ; key=$2 ; value=$3
971  else
972    IGCM_debug_Exit "IGCM_comp_modifyFile: Bad number of arguments."
973    IGCM_debug_PopStack "IGCM_comp_modifyFile"
974    return
975  fi
976  IGCM_debug_Print 1 "Entering IGCM_comp_modifyFile with arguments: ${filein} ${key} ${value}"
977
978  # Test if the file exist
979  if [ ! -f ${filein} ] ; then
980    IGCM_debug_Exit "IGCM_comp_modifyFile: ${filein} does not exist."
981    IGCM_debug_PopStack "IGCM_comp_modifyFile"
982    return
983  fi
984
985  # Read the line with key in the file without the comments
986  pattern=$( grep "^ *${key} *=" ${filein} | sed -e "s% *\!.*%%" )
987
988  # Verify the existance of the pattern
989  if [ X"${pattern}" = X ] ; then
990    # Variable key is not set in filein, stop.
991    IGCM_debug_Exit "IGCM_comp_modifyFile : Variable ${key} is not set in correct file. It should be set in ${filein}."
992    IGCM_debug_PopStack "IGCM_comp_modifyFile"
993    return
994  fi
995
996  # Now change key in filein
997  #sed -e "s:${pattern}:${key}=${value}:" ${filein} > ${filein}.tmp
998  sed -e "s:^ *${key} *=.*:${key}=${value}:" ${filein} > ${filein}.tmp
999  IGCM_debug_Print 1 "IGCM_comp_modifyFile: In ${filein} set ${key}=${value}"
1000  \mv ${filein}.tmp ${filein}
1001 
1002  IGCM_debug_PopStack "IGCM_comp_modifyFile"
1003}
1004
1005#=======================================================================
1006function IGCM_comp_modifyDefFile
1007{
1008#
1009# syntax:     IGCM_comp_modifyDefFile  type  filein  key  [value]
1010#
1011# For example : IGCM_comp_modifyDefFile blocker run.def day_step 1200
1012#
1013# This function is used to modify a parameter file for a specific variable.
1014# The file must be a ".def" file, i.e. with IOIPSL parameter file syntax.
1015# This function can be used in the comp.driver files for the components.
1016#
1017# Arguments:
1018# - type   : first argument must be blocker, nonblocker or force
1019#            For "blocker" case, the variable must be attributed the keyworld AUTO
1020#            otherwise this function will exit.
1021#            For "nonblocker" case, the user can remove or modify the variable. For
1022#            this case, as long as AUTO is not set, no modification will be done.
1023#            For "force" case, the variable will be modified even if it is not set to AUTO
1024# - filein : the file in run directory of .def type in which the variable should be set
1025# - key    : the variable to modify
1026# - value  : the value to set the key equal to, optional. If value is not set or if
1027#            value=DEFAULT, then a default value must be given in filein using syntax :
1028#            key= AUTO : DEFAULT=def_value
1029#
1030  IGCM_debug_PushStack "IGCM_comp_modifyDefFile"
1031
1032  typeset type filein key value
1033  typeset filelist nb_occ modify
1034
1035  # Set local variables and test the arguments
1036  if [ $# = 4 ] ; then
1037    # Normal case with 4 arguments
1038    type=$1 ; filein=$2 ; key=$3 ; value=$4
1039  elif [ $# = 3 ] ; then
1040    # Normal case with 3 arguments
1041    type=$1 ; filein=$2 ;       key=$3; value="DEFAULT"
1042  else
1043    IGCM_debug_Exit "IGCM_comp_modifyDefFile: Bad number of arguments."
1044    IGCM_debug_PopStack "IGCM_comp_modifyDefFile"
1045    return
1046  fi
1047  IGCM_debug_Print 1 "Entering IGCM_comp_modifyDefFile with arguments: ${type} ${filein} ${key} ${value}"
1048
1049  # Test if first argument is correct
1050  if [ ${type} != blocker ] && [ ${type} != nonblocker ] && [ ${type} != force ] ; then
1051    IGCM_debug_Exit "IGCM_comp_modifyDefFile: Error in first argument must be blocker, nonblocker or force"
1052    IGCM_debug_PopStack "IGCM_comp_modifyDefFile"
1053    return
1054  fi
1055
1056  # Test if the file exist.
1057  # Exit with error if the file does not exist for the case blocker or force.
1058  # Only return for the case nonblocker.
1059  if [ ! -f ${filein} ] ; then
1060    if [ ${type} = blocker ] || [ ${type} = force ] ; then
1061      IGCM_debug_Exit "IGCM_comp_modifyDefFile: ${filein} does not exist."
1062    else
1063      IGCM_debug_Print 1 "IGCM_comp_modifyDefFile: ${filein} does not exist. Nothing will be done for this file."
1064    fi
1065    IGCM_debug_PopStack "IGCM_comp_modifyDefFile"
1066    return
1067  fi
1068
1069  # Define list of files to test using all files with suffix .def (except used*.def)
1070  filelist=$( ls *def | grep -v used )
1071
1072  # Count number of occurances for the key in all files
1073  nb_occ=$( grep -w ${key} ${filelist} | grep -v "#"  | wc -l )
1074
1075  # Test if key is set several times
1076  if [ ${nb_occ} -gt 1 ] ; then
1077    IGCM_debug_Exit "IGCM_comp_modifyDefFile : Error in ${filein}: Variable=${key} is set ${nb_occ} times"
1078    IGCM_debug_PopStack "IGCM_comp_modifyDefFile"
1079    return
1080  fi
1081
1082  # Treatement according to different cases
1083  if [ ${nb_occ} -eq 0 ] && [ ${type} = blocker ] ; then
1084    # Stop if the key is never set and the function is blocker
1085    IGCM_debug_Exit "IGCM_comp_modifyDefFile : Error in ${filein}: Variable=${key} has been removed but this function is blocker. "
1086    IGCM_debug_Print 1 "IGCM_comp_modifyDefFile: restore ${filein} for variable ${key}."
1087  elif [ ${nb_occ} -eq 0 ] && [ ${type} = nonblocker ] ; then
1088    # The key is not set but it is a nonblocker call so nothing is done.
1089    IGCM_debug_Print 1 "IGCM_comp_modifyDefFile: ${key} is not set in ${filein}. This is a nonblocker call so nothing is done."
1090    IGCM_debug_Print 1 "IGCM_comp_modifyDefFile: Default value for ${key} from the model will be used."
1091    modify=no
1092  elif [ $( grep ${key} ${filein} | grep -v "\#"  |wc -l ) = 0 ] ; then
1093    # Variable key is not set in filein, stop.
1094    IGCM_debug_Exit "IGCM_comp_modifyDefFile : Variable ${key} is not set in correct file. It should be set in ${filein}."
1095  fi
1096
1097  # Check if AUTO is set in the filein on the same line as the key variable
1098  if [ $( grep -w ${key} ${filein} | grep -v "\#" | grep AUTO | wc -l ) = 1 ] ; then
1099    # Modification will be done for all cases
1100    modify=yes
1101  else
1102    # The variable was not set to AUTO
1103    if [ ${type} = blocker ] ; then
1104      # Exit because this is a blocker call
1105      IGCM_debug_Exit "IGCM_comp_modifyDefFile : The variable ${key} cannot be modified. It should be set to AUTO."
1106      IGCM_debug_PopStack "IGCM_comp_modifyDefFile"
1107      return
1108    elif [ ${type} = nonblocker ] ; then
1109      # Do nothing. Suppose that the user did set the variable correct
1110      IGCM_debug_Print 1 "IGCM_comp_modifyDefFile: ${key} is set by the user. Nothing done."
1111      modify=no
1112    elif [ ${type} = force ] ; then
1113      # Force modification
1114      IGCM_debug_Print 1 "IGCM_comp_modifyDefFile : Variabl=${key} was not set to AUTO. Modification will be forced."
1115      modify=yes
1116    fi
1117  fi
1118
1119  # Do the modifcation now
1120  if [ ${modify} = yes ] ; then
1121
1122    # For option DEFAULT, read default value from file.
1123    if [ X"${value}" = XDEFAULT ] || [ X"${value}" = X ] ; then
1124      # Case to set DEFAULT value
1125      # Read default value from filein
1126      value=$( grep ${key} ${filein} | grep -v "\#" | awk  -F"DEFAULT *=" '{print $2}')
1127
1128      if [ X"${value}" = X ] ; then
1129        IGCM_debug_Exit "IGCM_comp_modifyDefFile : The variable ${key} needs a DEFAULT value in ${filein}."
1130        IGCM_debug_Print 1 "IGCM_comp_modifyDefFile: The syntax in ${filein} should be:"
1131        IGCM_debug_Print 1 "IGCM_comp_modifyDefFile: ${key}=_AUTO_:DEFAULT=def_value"
1132        IGCM_debug_PopStack "IGCM_comp_modifyDefFile"
1133        return
1134      fi
1135    fi
1136
1137    # Now change key in filein
1138    sed -e "s/^${key}\ *=.*/${key}= ${value}/" ${filein} > ${filein}.tmp
1139    IGCM_debug_Print 1 "IGCM_comp_modifyDefFile: In ${filein} set ${key}=${value}"
1140    \mv ${filein}.tmp ${filein}
1141  fi
1142  IGCM_debug_PopStack "IGCM_comp_modifyDefFile"
1143}
1144
1145#=======================================================================
1146function IGCM_comp_modifyNamelist
1147{
1148#
1149# syntax:     IGCM_comp_modifyNamelist  type  filein  key  [value]
1150#
1151# For example : IGCM_comp_modifyNamelist blocker run.def day_step 1200
1152#
1153# This function is used to modify a parameter file for a specific variable.
1154# The file must be a "namelist" file, i.e. with fortran namelist syntax.
1155# This function can be used in the comp.driver files for the components.
1156#
1157# Arguments:
1158# - type   : first argument must be blocker, nonblocker or force
1159#            For "blocker" case, the variable must be attributed the keyworld AUTO
1160#            otherwise this function will exit.
1161#            For "nonblocker" case, the user can remove or modify the variable. For
1162#            this case, as long as AUTO is not set, no modification will be done.
1163#            For "force" case, the variable will be modified even if it is not set to AUTO
1164# - filein : the file in run directory of .def type in which the variable should be set
1165# - key    : the variable to modify
1166# - value  : the value to set the key equal to, optional. If value is not set or if
1167#            value=DEFAULT, then a default value must be given in filein using syntax :
1168#            key= AUTO : DEFAULT=def_value
1169#
1170  IGCM_debug_PushStack "IGCM_comp_modifyNamelist"
1171
1172  typeset type filein key value pattern modify
1173
1174  # Set local variables and test the arguments
1175  if [ $# = 4 ] ; then
1176    # Normal case with 4 arguments
1177    type=$1 ; filein=$2 ; key=$3 ; value=$4
1178  elif [ $# = 3 ] ; then
1179    # Normal case with 3 arguments
1180    type=$1 ; filein=$2 ;       key=$3; value="DEFAULT"
1181  else
1182    IGCM_debug_Exit "IGCM_comp_modifyNamelist: Bad number of arguments."
1183    IGCM_debug_PopStack "IGCM_comp_modifyNamelist"
1184    return
1185  fi
1186  IGCM_debug_Print 1 "Entering IGCM_comp_modifyNamelist with arguments: ${type} ${filein} ${key} ${value}"
1187
1188  # Test if first argument is correct
1189  if [ ${type} != blocker ] && [ ${type} != nonblocker ] && [ ${type} != force ] ; then
1190    IGCM_debug_Exit "IGCM_comp_modifyNamelist: Error in first argument must be blocker, nonblocker or force"
1191    IGCM_debug_PopStack "IGCM_comp_modifyNamelist"
1192    return
1193  fi
1194
1195  # Test if the file exist.
1196  # Exit with error if the file does not exist for the case blocker or force.
1197  # Only return for the case nonblocker.
1198  if [ ! -f ${filein} ] ; then
1199    if [ ${type} = blocker ] || [ ${type} = force ] ; then
1200      IGCM_debug_Exit "IGCM_comp_modifyNamelist: ${filein} does not exist."
1201    else
1202      IGCM_debug_Print 1 "IGCM_comp_modifyNamelist: ${filein} does not exist. Nothing will be done for this file."
1203    fi
1204    IGCM_debug_PopStack "IGCM_comp_modifyNamelist"
1205    return
1206  fi
1207
1208  # Read the line with key in the file without the comments
1209  pattern=$( grep "^ *${key} *=" ${filein} | sed -e "s% *\!.*%%" )
1210
1211  # Verify the existance of the pattern
1212  if [ X"$pattern" = X ] ; then
1213    # Variable key is not set in filein, stop.
1214    IGCM_debug_Exit "IGCM_comp_modifyNamelist : Variable ${key} is not set in correct file. It should be set in ${filein}."
1215    IGCM_debug_PopStack "IGCM_comp_modifyNamelist"
1216    return
1217  fi
1218
1219  # Check if the variable is set to AUTO in the filein
1220  if [ $( echo $pattern | grep AUTO | wc -l ) = 1 ] ; then
1221    # Modification will be done for all cases
1222    modify=yes
1223  else
1224    # The variable was not set to AUTO
1225    if [ ${type} = blocker ] ; then
1226      # Exit because this is a blocker call
1227      IGCM_debug_Exit "IGCM_comp_modifyNamelist : The variable ${key} cannot be modified. It should be set to AUTO."
1228      IGCM_debug_PopStack "IGCM_comp_modifyNamelist"
1229      return
1230    elif [ ${type} = nonblocker ] ; then
1231      # Do nothing. Suppose that the user did set the variable correct
1232      IGCM_debug_Print 1 "IGCM_comp_modifyNamelist: ${key} is set by the user. Nothing done."
1233      modify=no
1234    elif [ ${type} = force ] ; then
1235      # Force modification
1236      IGCM_debug_Print 1 "IGCM_comp_modifyNamelist : Variabl=${key} was not set to AUTO. Modification will be forced."
1237      modify=yes
1238    fi
1239  fi
1240
1241  # Do the modifcation now
1242  if [ ${modify} = yes ] ; then
1243
1244    # For option DEFAULT, read default value from file.
1245    if [ X"${value}" = XDEFAULT ] || [ X"${value}" = X ] ; then
1246      # Case to set DEFAULT value
1247      # Read default value from filein
1248      value=$( echo $pattern | awk  -F"DEFAULT *=" '{print $2}')
1249
1250      if [ X"${value}" = X ] ; then
1251        IGCM_debug_Exit "IGCM_comp_modifyNamelist : The variable ${key} needs a DEFAULT value in ${filein}."
1252        IGCM_debug_Print 1 "IGCM_comp_modifyNamelist: The syntax in ${filein} should be:"
1253        IGCM_debug_Print 1 "IGCM_comp_modifyNamelist: ${key}=_AUTO_:DEFAULT=def_value"
1254        IGCM_debug_PopStack "IGCM_comp_modifyNamelist"
1255        return
1256      fi
1257    fi
1258
1259    # Now change key in filein
1260    sed -e "s/${pattern}/       ${key}=${value}/" ${filein} > ${filein}.tmp
1261    IGCM_debug_Print 1 "IGCM_comp_modifyNamelist: In ${filein} set ${key}=${value}"
1262    \mv ${filein}.tmp ${filein}
1263  fi
1264  IGCM_debug_PopStack "IGCM_comp_modifyNamelist"
1265}
1266
1267#=======================================================================
1268function IGCM_comp_modifyXmlFile
1269{
1270#
1271# syntax:     IGCM_comp_modifyXmlFile  type  filein  keyid  keyattrib  value
1272#
1273# For example : IGCM_comp_modifyXmlFile force file_def_orchidee.xml sechiba2 enabled .TRUE.
1274#          or   IGCM_comp_modifyXmlFile blocker iodef.xml using_server NONE false
1275#
1276# This function is used to modify the value for a specific attribute and variable id.
1277# The file must be a valid xml file.
1278# This function can be used in the comp.driver files for the components.
1279#
1280# Arguments:
1281# - type      : first argument must be blocker, nonblocker or force.
1282#               For "blocker" case, the variable must be attributed the keyworld AUTO
1283#               otherwise this function will exit.
1284#               For "nonblocker" case, the user can remove or modify the variable. For
1285#               this case, as long as AUTO is not set, no modification will be done.
1286#               For "force" case, the variable will be modified even if it is not set to AUTO
1287# - filein    : the file in run directory of .xml type in which the variable should be set
1288# - keyid     : the variable to modify
1289# - keyattrib : the attribute name to modify. If NONE, then the variable itself will be modified
1290# - value     : the value to set in the filein
1291#
1292  IGCM_debug_PushStack "IGCM_comp_modifyXmlFile"
1293
1294  typeset type filein keyid keyattrib value modify
1295
1296  # Set local variables and test the arguments
1297  if [ $# = 5 ] ; then
1298    # Normal case with 4 arguments
1299    type=$1 ; filein=$2 ; keyid=$3 ; keyattrib=$4 ; value=$5
1300  else
1301    IGCM_debug_Exit "IGCM_comp_modifyXmlFile: Bad number of arguments."
1302    IGCM_debug_PopStack "IGCM_comp_modifyXmlFile"
1303    return
1304  fi
1305  IGCM_debug_Print 1 "Entering IGCM_comp_modifyXmlFile with arguments: type=${type} file=${filein}, id=${keyid} attribute=${keyattrib}, value=${value}"
1306
1307  # Test if first argument is correct
1308  if [ ${type} != blocker ] && [ ${type} != nonblocker ] && [ ${type} != force ] ; then
1309    IGCM_debug_Exit "IGCM_comp_modifyXmlFile: Error in first argument must be blocker, nonblocker or force"
1310    IGCM_debug_PopStack "IGCM_comp_modifyXmlFile"
1311    return
1312  fi
1313
1314  # Test if the file exist.
1315  # Exit with error if the file does not exist for the case blocker or force.
1316  # Only return for the case nonblocker.
1317  if [ ! -f ${filein} ] ; then
1318    if [ ${type} = blocker ] || [ ${type} = force ] ; then
1319      IGCM_debug_Exit "IGCM_comp_modifyXmlFile: ${filein} does not exist."
1320    else
1321      IGCM_debug_Print 1 "IGCM_comp_modifyXmlFile: ${filein} does not exist. Nothing will be done for this file."
1322    fi
1323    IGCM_debug_PopStack "IGCM_comp_modifyXmlFile"
1324    return
1325  fi
1326
1327  # Test if keyid is set in filein, otherwise exit
1328  if [ $( grep -w ${keyid} ${filein} | wc -l ) = 0 ] ; then
1329    # Variable key is not set in filein, stop.
1330    IGCM_debug_Exit "IGCM_comp_modifyXmlFile : ${keyid} is not set in the file. Bad syntax of ${filein} file."
1331    IGCM_debug_PopStack "IGCM_comp_modifyXmlFile"
1332    return
1333  fi
1334
1335  # Check if AUTO is set on the same line as keyid and keyattrib
1336  if [  $( grep -w ${keyid} ${filein} | grep AUTO | wc -l ) = 1 ] ; then
1337    # Modifification will be done
1338    modify=yes
1339  else
1340    if [ ${type} = blocker ] ; then
1341      # Exit, the variable must be set to AUTO
1342      IGCM_debug_Exit "IGCM_comp_modifyXmlFile : blocker function. The ${keyattrib} for ${keyid} must be set to AUTO in ${filein}."
1343      IGCM_debug_PopStack "IGCM_comp_modifyXmlFile"
1344      return
1345    elif [ ${type} = nonblocker ] ; then
1346      # Nothing will be done
1347      IGCM_debug_Print 1 "Nonblocker nothing is done for ${filein}, id=${keyid} and attribute ${keyattrib}"
1348      modify=no
1349    elif [ ${type} = force ] ; then
1350      # Force modification
1351      IGCM_debug_Print 1 "IGCM_comp_modifyXmlFile : Attribute=${keyattrib} for id=${keyid} was not set to AUTO. Modification will be forced."
1352      modify=yes
1353    fi
1354  fi
1355
1356  # Do the modifcation now
1357  if [ ${modify} = yes ] ; then
1358    if [ ${keyattrib} = NONE ] ; then
1359      # Case to modify the variable itself
1360      IGCM_debug_Print 1 "Now modify ${filein} for id=${keyid} by setting the variable=${value}"
1361      sed -e "s/\(<[^\"]*\"${keyid}\".*>\)\([^<]*\)\(<[^>]*\)/\1${value}\3/" ${filein} > ${filein}.tmp
1362    else
1363      # Check if keyattrib is set on the same line as keyid
1364      if [  $( grep -w ${keyid} ${filein} | grep ${keyattrib} | wc -l ) = 1 ] ; then
1365        # Case to modify the attribute value
1366        IGCM_debug_Print 1 "Now modify ${filein} for id=${keyid} by setting attribute to ${keyattrib}=${value}"
1367        sed -e "/id=\"${keyid}\"/s/\(${keyattrib}=\"\)[^\"]*\(\"\)/\1${value}\2/" ${filein} > ${filein}.tmp
1368      else
1369        # Case to add the attribute and its value
1370        IGCM_debug_Print 1 "Now add in ${filein} for id=${keyid} the attribute ${keyattrib} to the value ${value}"
1371        sed -e "/id=\"${keyid}\"/s/\/>/ ${keyattrib}=\"${value}\"\/>/" ${filein} > ${filein}.tmp
1372      fi
1373    fi
1374    \mv ${filein}.tmp ${filein}
1375  fi
1376  IGCM_debug_PopStack "IGCM_comp_modifyXmlFile"
1377}
1378
1379#=======================================================================
1380function IGCM_comp_Update
1381{
1382  IGCM_debug_PushStack "IGCM_comp_Update"
1383
1384    # Debug Print :
1385  echo
1386  IGCM_debug_Print 1 "IGCM_comp_Update"
1387  echo
1388
1389  typeset ExeNameIn ExeNameOut
1390  typeset comp compname comptagname
1391  for comp in ${config_ListOfComponents[*]} ; do
1392    # Define component
1393    eval compname=\${config_ListOfComponents_${comp}[0]} > /dev/null 2>&1
1394    eval comptagname=\${config_ListOfComponents_${comp}[1]} > /dev/null 2>&1
1395
1396    # Copy executable for this component
1397    eval ExeNameIn=\${config_Executable_${comp}[0]}
1398    eval ExeNameOut=\${config_Executable_${comp}[1]}
1399
1400    # If missing executable and DRYRUN is set to 0 or 1  then stop!
1401    if [ ${DRYRUN} -le 1 ] && [ X${ExeNameIn} != X\"\" ] &&  [ ! -f ${R_EXE}/${ExeNameIn} ] ; then
1402      IGCM_debug_Exit "IGCM_comp_Update missing executable ${ExeNameIn}"
1403    fi
1404
1405    if [ ${Period} -eq 1 ] && [ -f ${R_EXE}/${ExeNameIn} ] ; then
1406      eval IGCM_sys_Cp ${R_EXE}/${ExeNameIn} ${ExeNameOut}
1407      if [ -f ${RUN_DIR}/${ExeNameOut} ] ; then
1408        eval IGCM_sys_Chmod +rx ${RUN_DIR}/${ExeNameOut}
1409      fi
1410    elif [ -f ${R_EXE}/${ExeNameIn} ] && [ ! -f ${RUN_DIR}/${ExeNameOut} ] ; then
1411      eval IGCM_sys_Cp ${R_EXE}/${ExeNameIn} ${ExeNameOut}
1412      if [ -f ${RUN_DIR}/${ExeNameOut} ] ; then
1413        eval IGCM_sys_Chmod +rx ${RUN_DIR}/${ExeNameOut}
1414      fi
1415    fi
1416
1417    # Debug Print
1418    IGCM_debug_Print 1 "Update ${compname} Parameter Files."
1419    # UPDATE component
1420    ${comp}_Update
1421
1422  done
1423
1424  IGCM_debug_PopStack "IGCM_comp_Update"
1425}
1426
1427#=======================================================================
1428function IGCM_comp_Finalize
1429{
1430  IGCM_debug_PushStack "IGCM_comp_Finalize"
1431
1432  # Debug Print :
1433  echo
1434  IGCM_debug_Print 1 "IGCM_comp_Finalize"
1435  echo
1436
1437  typeset ListTextName TextName0
1438  typeset comp compname comptagname card ListFilesName FileName0 NbFiles SaveOnArchive
1439  typeset i i_ file_in file_in_ file_out file_out_ file_outin file_outin_ generic_file_name nb_rebuild_file
1440  typeset -Z4 j4 #BASH declare j4
1441  typeset list_file nlist_file
1442  typeset compactoutputs
1443
1444  # Initialize array hosting list of rebuilded files to copy
1445  unset rebuildedActionsList
1446
1447  # Text compacting options
1448  compactoutputs=false
1449  if [ X${JobType} != XRUN ] ; then
1450    compactoutputs=true
1451  elif [ X${config_UserChoices_CompactText} != Xn ] ; then
1452    compactoutputs=true
1453  fi
1454
1455  # Prepare headers for the shell dedicated to offline rebuild
1456  if [ X${AsynchronousRebuild} = Xtrue ] ; then
1457    [ ! -d ${RUN_DIR}/REBUILD_${PeriodDateBegin} ] && IGCM_sys_Mkdir ${RUN_DIR}/REBUILD_${PeriodDateBegin}
1458    if [ ${DRYRUN} -le 1 ] ; then
1459      echo "#!/bin/ksh                                        " >  ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1460      echo "function IGCM_FlushRebuild                        " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1461      echo "{                                                 " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1462      echo "IGCM_debug_PushStack \"IGCM_FlushRebuild\"        " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1463      echo "echo                                              " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1464      echo "IGCM_debug_Print 1 \"IGCM_FlushRebuild\"          " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1465      echo "echo                                              " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1466      echo "export R_SAVE=${R_SAVE}                           " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1467      echo "export R_BUFR=${R_BUFR}                           " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1468      echo "export R_OUT_KSH=${R_OUT_KSH}                     " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1469      echo "export R_BUF_KSH=${R_BUF_KSH}                     " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1470      echo "export config_UserChoices_JobName=${config_UserChoices_JobName}     " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1471      echo "export config_UserChoices_SpaceName=${config_UserChoices_SpaceName} " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1472    fi
1473  fi
1474
1475  for comp in ${config_ListOfComponents[*]} ; do
1476    # Define component
1477    eval compname=\${config_ListOfComponents_${comp}[0]} > /dev/null 2>&1
1478    eval comptagname=\${config_ListOfComponents_${comp}[1]} > /dev/null 2>&1
1479
1480    # Debug Print
1481    IGCM_debug_Print 1 "Finalize ${comp} : ${compname} component."
1482    # FINALIZE component
1483    ${comp}_Finalize
1484
1485    card=${SUBMIT_DIR}/COMP/${compname}.card
1486
1487    # Save Output Text files of models
1488    #---------------------------------
1489    IGCM_debug_Print 2 "Save Output Text files for ${comp} : ${compname} component."
1490    IGCM_card_DefineArrayFromOption ${card} OutputText List
1491    ListTextName=${compname}_OutputText_List
1492
1493    eval TextName0=\${${ListTextName}[0]} > /dev/null 2>&1
1494    if [ X${TextName0} != X${NULL_STR} ] ; then
1495      eval NbFiles=\${#${ListTextName}[@]} > /dev/null 2>&1
1496
1497      (( i=0 ))
1498      until [ $i -eq $NbFiles ]; do
1499        eval file_in=\${${ListTextName}[$i]} > /dev/null 2>&1
1500        eval file_out=${PREFIX}_${file_in}
1501
1502        (( i=i+1 ))
1503
1504        unset list_file
1505        #set +A list_file -- $( ls ${file_in}* | sort 2>/dev/null )
1506        # result for a a1 a10 a2 with file_in=a a a1 a2 a10
1507        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 )
1508        nlist_file=${#list_file[@]}
1509        if [ ${nlist_file} -gt 1 ] ; then
1510          if ( ${compactoutputs} ) ; then
1511            IGCM_debug_Print 2 "Parallelism of Text Output with ${nlist_file} files."
1512            IGCM_debug_Print 2 "Compact files in ${file_out} : " ${list_file[*]}
1513            echo ${list_file[*]} > ${file_out}
1514            echo "" >> ${file_out}
1515
1516            (( i_ = 0 ))
1517            for file in ${list_file[@]} ; do
1518              echo "_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ " >> ${file_out}
1519              echo "| " ${i_} " " ${file} >> ${file_out}
1520              echo "- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - " >> ${file_out}
1521              cat ${file} | sed "s/\(.*\)/${i_}\1/" >> ${file_out}
1522              echo "" >> ${file_out}
1523              eval FileToBeDeleted[${#FileToBeDeleted[@]}]="${file}" > /dev/null 2>&1
1524                  (( i_ = i_ + 1 ))
1525            done
1526            if ( ${ExecutionFail} ) ; then
1527              IGCM_sys_Cp ${file_out} ${SUBMIT_DIR}/Debug
1528            fi
1529
1530            if [ X${Pack} = Xtrue ] ; then
1531              eval IGCM_sys_PutBuffer_Out ${file_out} \${R_BUF_${comp}_D}/${file_out}
1532            else
1533              eval IGCM_sys_Put_Out ${file_out} \${R_OUT_${comp}_D}/${file_out}
1534            fi
1535
1536            eval FileToBeDeleted[${#FileToBeDeleted[@]}]="${file_out}" > /dev/null 2>&1
1537          else
1538            for file in ${list_file[@]} ; do
1539              if ( ${ExecutionFail} ) ; then
1540                IGCM_sys_Cp ${file} ${SUBMIT_DIR}/Debug/${PREFIX}_${file}
1541              fi
1542
1543              if [ X${Pack} = Xtrue ] ; then
1544                eval IGCM_sys_PutBuffer_Out ${file} \${R_BUF_${comp}_D}/${PREFIX}_${file}
1545              else
1546                eval IGCM_sys_Put_Out ${file} \${R_OUT_${comp}_D}/${PREFIX}_${file}
1547              fi
1548
1549              eval FileToBeDeleted[${#FileToBeDeleted[@]}]="${file}" > /dev/null 2>&1
1550            done
1551          fi
1552        else
1553          if ( [ -f ${file_in}_0000 ] || [ -f ${file_in}0 ] ) ; then
1554            eval IGCM_sys_Mv ${file_in}* ${file_in}
1555          fi
1556
1557          if ( ${ExecutionFail} ) ; then
1558            IGCM_sys_Cp ${file_in} ${SUBMIT_DIR}/Debug/${file_out}
1559          fi
1560
1561          if [ X${Pack} = Xtrue ] ; then
1562            eval IGCM_sys_PutBuffer_Out ${file_in} \${R_BUF_${comp}_D}/${file_out}
1563          else
1564            eval IGCM_sys_Put_Out ${file_in} \${R_OUT_${comp}_D}/${file_out}
1565          fi
1566          eval FileToBeDeleted[${#FileToBeDeleted[@]}]="${file_in}" > /dev/null 2>&1
1567        fi
1568      done
1569    fi
1570
1571    # Save Restarts files
1572    #--------------------
1573    IGCM_debug_Print 2 "Save Restart files for ${comp} : ${compname} component."
1574    IGCM_card_DefineArrayFromOption ${card} RestartFiles List
1575    ListFilesName=${compname}_RestartFiles_List
1576    eval FileName0=\${${ListFilesName}[0]} > /dev/null 2>&1
1577
1578    if ( [ X${FileName0} != X${NULL_STR} ] && [ X${FileName0} != XNONE ] ) ; then
1579      eval NbFiles=\${#${ListFilesName}[@]} > /dev/null 2>&1
1580
1581      (( i=0 ))
1582      until [ $i -ge $NbFiles ]; do
1583        eval file_in_=\${${ListFilesName}[$i]} > /dev/null 2>&1
1584        eval file_in=${file_in_}
1585
1586        (( i_ = i+1 ))
1587        eval file_out_=\${${ListFilesName}[$i_]} > /dev/null 2>&1
1588        eval file_out=${file_out_}
1589
1590        (( i_ = i+2 ))
1591        eval file_outin_=\${${ListFilesName}[$i_]} > /dev/null 2>&1
1592        eval file_outin=${file_outin_}
1593
1594        generic_restart_file_name_in=$(    basename ${file_in} .nc )
1595        generic_restart_file_name_out=$(   basename ${config_UserChoices_JobName}_${PeriodDateEnd}_${file_out} .nc )
1596        generic_restart_file_name_outin=$( basename ${file_outin} .nc )
1597
1598        nb_restart_file=$( ls ${generic_restart_file_name_in}_????.nc 2>/dev/null | wc -l )
1599        if [ ${nb_restart_file} -gt 1 ] ; then
1600          j=0                                     # BASH LINE NOT NEEDED
1601          # BASH for j4 in in $( eval echo {0000..$(( nb_restart_file - 1 ))} ) ; do
1602          until [ $j -ge ${nb_restart_file} ]; do # BASH LINE NOT NEEDED
1603            j4=${j}                               # BASH LINE NOT NEEDED
1604            if [ X${Pack} = Xtrue ] ; then
1605              eval IGCM_sys_PutBuffer_Rest ${generic_restart_file_name_in}_${j4}.nc \${R_BUF_${comp}_R}/${generic_restart_file_name_out}_${j4}.nc
1606            else
1607              eval IGCM_sys_Put_Rest ${generic_restart_file_name_in}_${j4}.nc \${R_OUT_${comp}_R}/${generic_restart_file_name_out}_${j4}.nc
1608            fi
1609            if [ ! ${file_in} = ${file_outin} ] ; then
1610              if ( ${ExitFlag} ) ; then
1611                echo "IGCM_sys_Mv ${generic_restart_file_name_in}_${j4}.nc ${generic_restart_file_name_outin}_${j4}.nc not executed."
1612              else
1613                IGCM_sys_Mv ${generic_restart_file_name_in}_${j4}.nc ${generic_restart_file_name_outin}_${j4}.nc
1614              fi
1615            fi
1616            (( j=j+1 ))                           # BASH LINE NOT NEEDED
1617          done
1618        else
1619          if [ X${Pack} = Xtrue ] ; then
1620            eval IGCM_sys_PutBuffer_Rest ${file_in} \${R_BUF_${comp}_R}/${config_UserChoices_JobName}_${PeriodDateEnd}_${file_out}
1621          else
1622            eval IGCM_sys_Put_Rest ${file_in} \${R_OUT_${comp}_R}/${config_UserChoices_JobName}_${PeriodDateEnd}_${file_out}
1623          fi
1624          if [ ! ${file_in} = ${file_outin} ] ; then
1625            if ( ${ExitFlag} ) ; then
1626              echo "IGCM_sys_Mv ${file_in} ${file_outin} not executed."
1627            else
1628              IGCM_sys_Mv ${file_in} ${file_outin}
1629            fi
1630          fi
1631        fi
1632
1633        (( i=i+3 ))
1634      done
1635    else
1636      if [ X${FileName0} != XNONE ] ; then
1637        IGCM_debug_Exit "IGCM_comp_Finalize : No file in restart list for ${compname}."
1638      else
1639        IGCM_debug_Print 1 "IGCM_comp_Finalize : NONE specified in Restart List ${compname}."
1640      fi
1641    fi
1642
1643    # Save Output files
1644    #------------------
1645    IGCM_debug_Print 2 "Save Output files for ${comp} : ${compname} component."
1646    IGCM_card_DefineArrayFromOption ${card} OutputFiles List
1647    ListFilesName=${compname}_OutputFiles_List
1648    eval FileName0=\${${ListFilesName}[0]} > /dev/null 2>&1
1649
1650    if [ X${FileName0} != X${NULL_STR} ] ; then
1651      eval NbFiles=\${#${ListFilesName}[@]} > /dev/null 2>&1
1652
1653      (( i=0 ))
1654      until [ $i -ge $NbFiles ]; do
1655        SaveOnArchive=true
1656        eval file_in_=\${${ListFilesName}[$i]} > /dev/null 2>&1
1657        eval file_in=${file_in_}
1658        (( i_ = i+1 ))
1659        eval file_out_=\${${ListFilesName}[$i_]} > /dev/null 2>&1
1660        eval file_out=${file_out_}
1661        #
1662        # Override file_out path remplacing R_SAVE by R_BUFR
1663        #
1664        if [ X${Pack} = Xtrue ] ; then
1665          file_out=$( echo $file_out | sed "s:^$R_SAVE:$R_BUFR:" )
1666        fi
1667        #
1668        # Not necessarily the best option. /!\ Potential side effects /!\
1669        #
1670        (( i_ = i+2 ))
1671        eval flag_post=\${${ListFilesName}[$i_]} > /dev/null 2>&1
1672        #
1673        generic_file_name=$( basename ${file_in} .nc )
1674        nb_rebuild_file=$( ls | grep "^${generic_file_name}_[0-9]*.nc" | wc -l )
1675        #
1676        if ( [ ${nb_rebuild_file} -eq 1 ] && [ -f ${generic_file_name}_0000.nc ] ) ; then
1677          IGCM_debug_Print 2 "Parallelism with 1 file. Rebuilding ${file_in} not needed"
1678          IGCM_sys_Mv ${generic_file_name}_0000.nc ${file_in}
1679        elif [ ${nb_rebuild_file} -gt 1 ] ; then
1680          IGCM_debug_Print 2 "Parallelism detected and rebuilding ${file_in} is needed"
1681          if [ X${AsynchronousRebuild} = Xfalse ] ; then
1682            IGCM_debug_Print 2 "Rebuilding ${file_in} online"
1683            IGCM_sys_rebuild ${file_in} ${generic_file_name}_[0-9]*.nc
1684          else
1685            IGCM_debug_Print 2 "Preparing offline rebuild for ${file_in}"
1686            IGCM_sys_Mv ${generic_file_name}_[0-9]*.nc ${RUN_DIR}/REBUILD_${PeriodDateBegin}
1687
1688            # Prepare the shell dedicated to offline rebuild
1689            if [ $DRYRUN -le 1 ]; then
1690              if [ ${file_in} = histstn.nc ] ; then
1691                echo "IGCM_sys_rebuild_station ${file_in} ${generic_file_name}_*.nc" >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1692              else
1693                echo "IGCM_sys_rebuild ${file_in} ${generic_file_name}_[0-9]*.nc" >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1694              fi
1695              echo "IGCM_debug_Verif_Exit" >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1696            fi
1697            #
1698            # Load Patch we need to apply and apply
1699            if [ $DRYRUN -le 1 ]; then
1700              if [ X$( eval echo \${${compname}_${flag_post}_Patches[0]} ) !=  X${NULL_STR} ]; then
1701                for Patch in $( eval echo \${${compname}_${flag_post}_Patches[*]} ) ; do
1702                  echo ". ${libIGCM_POST}/libIGCM_post/IGCM_${Patch}.ksh" >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1703                  echo "IGCM_${Patch} ${file_in}                        " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1704                  echo "IGCM_debug_Verif_Exit                           " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1705                done
1706              fi
1707            fi
1708            #
1709            if [ $DRYRUN -le 1 ]; then
1710              if [ X${Pack} = Xtrue ] ; then
1711                rebuildedActionsList[${#rebuildedActionsList[*]}]="IGCM_sys_PutBuffer_Out ${file_in} ${file_out}"
1712              else
1713                rebuildedActionsList[${#rebuildedActionsList[*]}]="IGCM_sys_Put_Out ${file_in} ${file_out}"
1714              fi
1715              rebuildedActionsList[${#rebuildedActionsList[*]}]="IGCM_debug_Verif_Exit"
1716              rebuildedActionsList[${#rebuildedActionsList[*]}]="IGCM_sys_Rm ${generic_file_name}_[0-9]*.nc"
1717            fi
1718            SaveOnArchive=false
1719          fi
1720        fi
1721        #
1722        if [ ${SaveOnArchive} = true ] ; then
1723          #
1724          # Rebuild has been done online or it was not needed
1725          #
1726          # If we need to apply a patch we use TMP DIRECTORY before ARCHIVING if asynchronous rebuild is on
1727          #
1728          thereisapatch=$( eval echo \${${compname}_${flag_post}_Patches[0]} )
1729          if ( [ ! X${thereisapatch} = X${NULL_STR} ] && [ X${AsynchronousRebuild} = Xtrue ] && [ -f ${file_in} ] ) ; then
1730            IGCM_sys_Mv ${file_in} ${RUN_DIR}/REBUILD_${PeriodDateBegin}
1731            eval FileToBeDeleted[${#FileToBeDeleted[@]}]=REBUILD_${PeriodDateBegin}/${file_in} > /dev/null 2>&1
1732            #
1733            if [ $DRYRUN -le 1 ]; then
1734              for Patch in $( eval echo \${${compname}_${flag_post}_Patches[*]} ) ; do
1735                echo ". ${libIGCM_POST}/libIGCM_post/IGCM_${Patch}.ksh" >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1736                echo "IGCM_${Patch} ${file_in}                        " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1737                echo "IGCM_debug_Verif_Exit                           " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1738              done
1739              #
1740              if [ X${Pack} = Xtrue ] ; then
1741                echo "IGCM_sys_PutBuffer_Out ${file_in} ${file_out}   " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1742              else
1743                echo "IGCM_sys_Put_Out ${file_in} ${file_out}         " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1744              fi
1745              echo "IGCM_debug_Verif_Exit                             " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1746              #
1747            fi
1748          else
1749            #
1750            # No Patch, No Asynchronous rebuild, online rebuild has been done or was not needed
1751            #
1752            if [ X${Pack} = Xtrue ] ; then
1753              IGCM_sys_PutBuffer_Out ${file_in} ${file_out}
1754            else
1755              IGCM_sys_Put_Out ${file_in} ${file_out}
1756            fi
1757            eval FileToBeDeleted[${#FileToBeDeleted[@]}]="${file_in}" > /dev/null 2>&1
1758            if [ ${nb_rebuild_file} -gt 1 ] ; then
1759              for DelFile in $( ls | grep "${generic_file_name}[_0-9]*.nc" ) ; do
1760                eval FileToBeDeleted[${#FileToBeDeleted[@]}]=${DelFile} > /dev/null 2>&1
1761              done
1762            fi
1763          fi
1764        fi
1765        (( i=i+3 ))
1766      done
1767    fi
1768    echo
1769  done
1770  # Append the sync call and the copy sequence to the IGCM_FlushRebuild function if needed
1771  if [ ${#rebuildedActionsList[*]} -ne 0 ] ; then
1772    echo "IGCM_sys_sync              " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1773    i=0
1774    until [ ${i} -ge ${#rebuildedActionsList[*]} ]; do
1775      echo ${rebuildedActionsList[$i]} >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1776      (( i=i+1 ))
1777    done
1778  fi
1779  IGCM_debug_PopStack "IGCM_comp_Finalize"
1780}
Note: See TracBrowser for help on using the repository browser.