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

Last change on this file since 907 was 902, checked in by sdipsl, 11 years ago
  • further enhance messages when we bring in restart files
  • whitespace-cleanup
  • 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: 54.6 KB
Line 
1#!/bin/ksh
2
3#**************************************************************
4# Author: Sebastien Denvil, Martial Mancip
5# Contact: Sebastien.Denvil__at__ipsl.jussieu.fr Martial.Mancip__at__ipsl.jussieu.fr
6# $Revision::                                          $ Revision of last commit
7# $Author::                                            $ Author of last commit
8# $Date::                                              $ Date of last commit
9# IPSL (2006)
10#  This software is governed by the CeCILL licence see libIGCM/libIGCM_CeCILL.LIC
11#
12#**************************************************************
13
14#========================================================================
15function IGCM_comp_Initialize
16{
17  IGCM_debug_PushStack "IGCM_comp_Initialize"
18
19  # Debug Print :
20  echo
21  IGCM_debug_Print 1 "IGCM_comp_Initialize"
22  echo
23
24  typeset comp compname comptagname CompatibilityTag auxprint card_UserChoices first_option option i j
25  for comp in ${config_ListOfComponents[*]} ; do
26
27    # Define component
28    IGCM_card_DefineArrayFromOption ${SUBMIT_DIR}/config.card ListOfComponents ${comp}
29    eval compname=\${config_ListOfComponents_${comp}[0]} > /dev/null 2>&1
30    eval comptagname=\${config_ListOfComponents_${comp}[1]} > /dev/null 2>&1
31
32    # Debug Print
33    IGCM_debug_Print 1 "Initialize ${comp} : ${compname} component."
34
35    # Read libIGCM compatibility version in ${compname}.card
36    card=${SUBMIT_DIR}/COMP/${compname}.card
37    IGCM_card_DefineVariableFromOption ${card} Compatibility libIGCM
38
39    eval CompatibilityTag=\${${compname}_Compatibility_libIGCM} > /dev/null 2>&1
40    if [ ! "${CompatibilityTag}" = "${libIGCM_CurrentTag}" ] ; then
41      IGCM_debug_Exit "${compname}.card is not compatible with libIGCM version ${libIGCM_CurrentTag} see libIGCM FAQ http://wiki.ipsl.jussieu.fr/wiki_ipsl/IGCMG/libIGCM/DocUtilisateur/FAQ ."
42    fi
43
44    # Manage component executable
45    IGCM_card_DefineArrayFromOption ${SUBMIT_DIR}/config.card Executable ${comp}
46
47    # Define all options in section [comp]
48    IGCM_debug_Print 3 " DefineArrayFromSection : ${comp}"
49    IGCM_card_DefineArrayFromSection ${SUBMIT_DIR}/config.card ${comp}
50    eval config_comp=\${config_${comp}[*]} > /dev/null 2>&1
51    for option in ${config_comp[*]} ; do
52        IGCM_card_DefineVariableFromOption ${SUBMIT_DIR}/config.card ${comp} ${option}
53    done
54    IGCM_debug_Print 3 " Found in section config_${comp} :  ${config_comp[*]} "
55
56    # Debug Print :
57    eval auxprint=\${config_${comp}_WriteFrequency}
58    IGCM_debug_Print 1 "Write frequency for ${compname} : ${auxprint} "
59    #2> /dev/null
60
61    # Debug Print :
62    IGCM_debug_Print 2 "Initialize following component library"
63
64    # Source drivers in directory DRIVER if it exist
65    # else source them from directory COMP
66    if [ -d ${SUBMIT_DIR}/DRIVER ] ; then
67      IGCM_debug_Print 2 ${SUBMIT_DIR}/DRIVER/${compname}.driver
68      # Source component library
69      . ${SUBMIT_DIR}/DRIVER/${compname}.driver
70    else
71      IGCM_debug_Print 2 ${SUBMIT_DIR}/COMP/${compname}.driver
72      # Source component library
73      . ${SUBMIT_DIR}/COMP/${compname}.driver
74    fi
75    IGCM_debug_Print 3 "With tag : ${comptagname}"
76
77    # Debug Print
78    IGCM_debug_Print 3 "Initialize ${comp} output directory."
79
80    # Define ARCHIVED Dirs
81    eval R_OUT_${comp}=${R_SAVE}/${comp}
82    eval IGCM_sys_MkdirArchive \${R_OUT_${comp}}
83
84    eval R_OUT_${comp}_O=\${R_OUT_${comp}}/Output
85    eval IGCM_sys_MkdirArchive \${R_OUT_${comp}_O}
86
87    eval R_OUT_${comp}_R=\${R_OUT_${comp}}/Restart
88    [ ${config_Post_PackFrequency} = NONE ] && eval IGCM_sys_MkdirArchive \${R_OUT_${comp}_R}
89
90    eval R_OUT_${comp}_D=\${R_OUT_${comp}}/Debug
91    [ ${config_Post_PackFrequency} = NONE ] && eval IGCM_sys_MkdirArchive \${R_OUT_${comp}_D}
92
93    eval R_OUT_${comp}_O_I=\${R_OUT_${comp}_O}/INS
94    eval R_OUT_${comp}_O_H=\${R_OUT_${comp}_O}/HF
95    eval R_OUT_${comp}_O_D=\${R_OUT_${comp}_O}/DA
96    eval R_OUT_${comp}_O_M=\${R_OUT_${comp}_O}/MO
97    eval R_OUT_${comp}_O_Y=\${R_OUT_${comp}_O}/YE
98
99    # Define BUFFERED Dirs
100    if [ ! ${config_Post_PackFrequency} = NONE ] ; then
101      eval R_BUF_${comp}=${R_BUFR}/${comp}
102      eval IGCM_sys_Mkdir \${R_BUF_${comp}}
103
104      eval R_BUF_${comp}_O=\${R_BUF_${comp}}/Output
105      eval IGCM_sys_Mkdir \${R_BUF_${comp}_O}
106
107      eval R_BUF_${comp}_R=\${R_BUF_${comp}}/Restart
108      eval IGCM_sys_Mkdir \${R_BUF_${comp}_R}
109
110      eval R_BUF_${comp}_D=\${R_BUF_${comp}}/Debug
111      eval IGCM_sys_Mkdir \${R_BUF_${comp}_D}
112
113      eval R_BUF_${comp}_O_I=\${R_BUF_${comp}_O}/INS
114      eval R_BUF_${comp}_O_H=\${R_BUF_${comp}_O}/HF
115      eval R_BUF_${comp}_O_D=\${R_BUF_${comp}_O}/DA
116      eval R_BUF_${comp}_O_M=\${R_BUF_${comp}_O}/MO
117      eval R_BUF_${comp}_O_Y=\${R_BUF_${comp}_O}/YE
118    fi
119
120    # Read UserChoices section of component card
121    IGCM_debug_Print 2 "DefineArrayFromSection : ${compname}_UserChoices ${card}"
122    IGCM_card_DefineArrayFromSection ${card} UserChoices
123    eval first_option=\${${compname}_UserChoices[0]} > /dev/null 2>&1
124
125    # If section is not empty we define corresponding variables
126    if [ X${first_option} != X"Error:" ] ; then
127      if [ X${card_UserChoices[0]} != X ] ; then
128        unset card_UserChoices
129      fi
130      eval set +A card_UserChoices -- \${${compname}_UserChoices[*]} > /dev/null 2>&1
131      IGCM_debug_Print 3 "${compname}_UserChoices_values:"
132      for option in ${card_UserChoices[*]} ; do
133        IGCM_card_DefineVariableFromOption ${card} UserChoices ${option}
134        eval IGCM_debug_Print 3 "${option}=\${${compname}_UserChoices_${option}}"
135      done
136    fi
137
138    # Read and Build Output File stuff
139    IGCM_debug_Print 2 "DefineArrayFromOption  : ${compname}_OutputFiles ${card}"
140    IGCM_card_DefineArrayFromOption ${card} OutputFiles List
141    ListFilesName=${compname}_OutputFiles_List
142    eval FileName0=\${${ListFilesName}[0]} > /dev/null 2>&1
143    #
144    if [ X${FileName0} != X${NULL_STR} ] ; then
145      #
146      #IGCM_debug_Print 1 "Component      : ${compname}"
147      #
148      # INITIALISATION
149      #
150      eval NbFiles=\${#${ListFilesName}[@]} > /dev/null 2>&1
151      #
152      i=2
153      #
154      until [ $i -ge $NbFiles ]; do
155        #
156        eval flag_post=\${${ListFilesName}[$i]} > /dev/null 2>&1
157        #
158        if [ X${flag_post} != XNONE ] ; then
159          #
160          # First of all
161          #
162          IGCM_card_DefineArrayFromSection ${card} ${flag_post}
163          #
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                if [ -d ${RestartPath}/${RestartJobName}/RESTART ] ; then
732                  for PotentialTarFile in $( IGCM_sys_RshArchive "find ${RestartPath}/${RestartJobName}/RESTART -name "${RestartJobName}_*restart*.tar" -print" ) ; do
733                    IsMatching=$( echo ${PotentialTarFile##*/} | \
734                      sed "s:_restart::" | \
735                      sed "s:^${RestartJobName}_::" | \
736                      sed "s:\.tar$::" | \
737                      gawk -F_ -v restartdate=${Date_r} \
738                      '{if (($1 <= restartdate) && ($2 >= restartdate)) {print $1"_"$2}}' )
739                    if [ ! X${IsMatching} = X ] ; then
740                      TarFileFound=${PotentialTarFile}
741                      break
742                    fi
743                  done
744                else
745                  IGCM_debug_Print 3 "Restart files were not found!"
746                  IGCM_debug_Print 3 "Restart files have been searched for in buffer and archive directory."
747                  IGCM_debug_Print 3 "They have been searched for in packed and unpacked format."
748                  IGCM_debug_Exit "Please double check restart settings in config.card"
749                  IGCM_debug_Verif_Exit
750                fi
751              fi
752              TarFileLocation=$( IGCM_sys_PrepareTaredRestart ${TarFileFound} )
753              IGCM_debug_Print 1 "tar xvf ${TarFileLocation} ${comp}_${generic_restart_file_name_in}*.${extension_in}"
754              tar xvf ${TarFileLocation} ${comp}_${generic_restart_file_name_in}*.${extension_in}
755              nb_restart_file=$( IGCM_sys_CountFileBuffer ${comp}_${generic_restart_file_name_in}_????.${extension_in} )
756            fi
757
758            if [ ${nb_restart_file} -gt 1 ] ; then
759              j=0                                      # BASH LINE NOT NEEDED
760              # BASH for j4 in in $( eval echo {0000..$(( nb_restart_file - 1 ))} ) ; do
761              until [ $j -ge ${nb_restart_file} ]; do  # BASH LINE NOT NEEDED
762                j4=${j}                                # BASH LINE NOT NEEDED
763                if [ X${Buffered} = Xtrue ] ; then
764                  IGCM_sys_GetBuffer ${Path_OUT}_${j4}.${extension_in} ${generic_restart_file_name_out}_${j4}.${extension_out}
765                elif [ X${Archived} = Xtrue ] ; then
766                  IGCM_sys_Get ${Path_OUT}_${j4}.${extension_in} ${generic_restart_file_name_out}_${j4}.${extension_out}
767                elif [ X${Tared} = Xtrue ] ; then
768                  IGCM_sys_Mv ${comp}_${generic_restart_file_name_in}_${j4}.${extension_in} ${generic_restart_file_name_out}_${j4}.${extension_out}
769                fi
770                (( j=j+1 ))                            #BASH LINE NOT NEEDED
771              done
772
773              if [ X${NUM_PROC_OCE} != X ] ; then
774                if [ ${NUM_PROC_OCE} -ne ${nb_restart_file} ] ; then
775                  IGCM_sys_rebuild ${generic_restart_file_name_out}.${extension_out} ${generic_restart_file_name_out}_????.${extension_out}
776                  IGCM_sys_Rm ${generic_restart_file_name_out}_????.${extension_out}
777                fi
778              fi
779            else
780              if [ X${Buffered} = Xtrue ] ; then
781                IGCM_sys_GetBuffer ${Path_r}/${file_in_Name} ${file_out}
782              elif [ X${Archived} = Xtrue ] ; then
783                IGCM_sys_Get ${Path_r}/${file_in_Name} ${file_out}
784              elif [ X${Tared} = Xtrue ] ; then
785                IGCM_sys_Mv ${comp}_${file_in_Name} ${file_out}
786              fi
787            fi
788            (( i=i+3 ))
789          done
790
791        else
792          if [ X${FileName0} != XNONE ] ; then
793            IGCM_debug_Exit "IGCM_comp_GetInputRestartFiles : No file in list for ${compname}."
794          else
795            IGCM_debug_Print 1 "IGCM_comp_GetInputRestartFiles : NONE specified in Restart List ${compname}."
796          fi
797        fi
798      fi
799    elif ( [ ${Period} -eq 1 ] && [ ${DRYRUN} -eq 0 ] ) ; then
800      # if not FirstInitialize and first loop of this job
801
802      # Restore Restarts files
803      #-----------------------
804      if ( [ X${FileName0} != X${NULL_STR} ] && [ X${FileName0} != XNONE ] ) ; then
805        eval NbFiles=\${#${ListFilesName}[@]} > /dev/null 2>&1
806
807        (( i=1 ))
808        until [ $i -gt $NbFiles ]; do
809          eval file_in_=\${${ListFilesName}[$i]} > /dev/null 2>&1
810          eval file_in=${file_in_}
811          (( i_ = i+1 ))
812          eval file_out_=\${${ListFilesName}[$i_]} > /dev/null 2>&1
813          eval file_out=${file_out_}
814
815          file_in_Name=${run_Configuration_OldPrefix}_${file_in}
816
817          extension_in=$( echo ${file_in_Name##*.} )
818          extension_out=$( echo ${file_out##*.} )
819
820          generic_restart_file_name_in=$( basename ${file_in_Name} .${extension_in} )
821          generic_restart_file_name_out=$( basename ${file_out} .${extension_out} )
822
823          eval Path_BUF=\${R_BUF_${comp}_R}/${generic_restart_file_name_in}
824          eval Path_OUT=\${R_OUT_${comp}_R}/${generic_restart_file_name_in}
825
826          if [ $( IGCM_sys_TestFileBuffer ${Path_BUF}*.${extension_in} ; echo $? ) = 0 ] ; then
827            IGCM_debug_Print 3 "Buffered restart ${Path_BUF}*.${extension_in}"
828            Buffered=true
829            Archived=false
830            Tared=false
831            nb_restart_file=$(IGCM_sys_CountFileBuffer ${Path_BUF}_????.${extension_in})
832          elif [ $( IGCM_sys_TestFileArchive ${Path_OUT}*.${extension_in} ; echo $? ) = 0 ] ; then
833            IGCM_debug_Print 3 "Archived restart ${Path_OUT}*.${extension_in}"
834            Buffered=false
835            Archived=true
836            Tared=false
837            nb_restart_file=$(IGCM_sys_CountFileArchive ${Path_OUT}_????.${extension_in})
838          else
839            IGCM_debug_Print 3 "No restart file in the buffer nor in the archive directory"
840            IGCM_debug_Print 3 "Restart files will now be searched for in : ${R_SAVE}/RESTART"
841            Buffered=false
842            Archived=false
843            Tared=true
844            # Look after the tar file we want if we did not found it already
845            if [ X${IsMatching} = X ] ; then
846              for PotentialTarFile in $( IGCM_sys_RshArchive "find ${R_SAVE}/RESTART -name "${config_UserChoices_JobName}_*_restart.tar" -print" ) ; do
847                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}}' )
848                if [ ! X${IsMatching} = X ] ; then
849                  TarFileFound=${PotentialTarFile}
850                  break
851                fi
852              done
853            fi
854            TarFileLocation=$( IGCM_sys_PrepareTaredRestart ${TarFileFound} )
855            IGCM_debug_Print 1 "tar xvf ${TarFileLocation} ${comp}_${generic_restart_file_name_in}*.${extension_in}"
856            tar xvf ${TarFileLocation} ${comp}_${generic_restart_file_name_in}*.${extension_in}
857            nb_restart_file=$( IGCM_sys_CountFileBuffer ${comp}_${generic_restart_file_name_in}_????.${extension_in} )
858          fi
859
860          if [ ${nb_restart_file} -gt 1 ] ; then
861            j=0                                     # BASH LINE NOT NEEDED
862            #BASH for j4 in in $( eval echo {0000..$(( nb_restart_file - 1 ))} ) ; do
863            until [ $j -ge ${nb_restart_file} ]; do # BASH LINE NOT NEEDED
864              j4=${j}                               # BASH LINE NOT NEEDED
865              if [ X${Buffered} = Xtrue ] ; then
866                IGCM_sys_GetBuffer ${Path_BUF}_${j4}.${extension_in} ${generic_restart_file_name_out}_${j4}.${extension_out}
867              elif [ X${Archived} = Xtrue ] ; then
868                IGCM_sys_Get ${Path_OUT}_${j4}.${extension_in} ${generic_restart_file_name_out}_${j4}.${extension_out}
869              elif [ X${Tared} = Xtrue ] ; then
870                IGCM_sys_Mv ${comp}_${generic_restart_file_name_in}_${j4}.${extension_in} ${generic_restart_file_name_out}_${j4}.${extension_out}
871              fi
872              (( j=j+1 ))                           # BASH LINE NOT NEEDED
873            done
874          else
875            if [ X${Buffered} = Xtrue ] ; then
876              eval IGCM_sys_GetBuffer \${R_BUF_${comp}_R}/${file_in_Name} ${file_out}
877            elif [ X${Archived} = Xtrue ] ; then
878              eval IGCM_sys_Get \${R_OUT_${comp}_R}/${file_in_Name} ${file_out}
879            elif [ X${Tared} = Xtrue ] ; then
880              IGCM_sys_Mv ${comp}_${file_in_Name} ${file_out}
881            fi
882          fi
883          (( i=i+3 ))
884        done
885      else
886        if [ X${FileName0} != XNONE ] ; then
887          IGCM_debug_Exit "IGCM_comp_GetInputRestartFiles : No file in list for ${compname}."
888        else
889          IGCM_debug_Print 1 "IGCM_comp_GetInputRestartFiles : NONE specified in Restart List ${compname}."
890        fi
891      fi
892    fi
893  done
894
895  NbFiles=$( ls * 2> /dev/null | wc -l )
896  if [ ${NbFiles} -gt 0 ] ; then
897    IGCM_sys_Chmod u+rw *
898  fi
899
900  IGCM_debug_PopStack "IGCM_comp_GetInputRestartFiles"
901}
902
903#=======================================================================
904function IGCM_comp_PeriodStart
905{
906  IGCM_debug_PushStack "IGCM_comp_PeriodStart"
907
908  # Debug Print :
909  echo
910  IGCM_debug_Print 1 "IGCM_comp_PeriodStart"
911  echo
912
913  typeset ExeNameIn ExeNameOut
914  typeset comp compname comptagname
915  for comp in ${config_ListOfComponents[*]} ; do
916    # Define component
917    eval compname=\${config_ListOfComponents_${comp}[0]} > /dev/null 2>&1
918    eval comptagname=\${config_ListOfComponents_${comp}[1]} > /dev/null 2>&1
919
920    # Copy executable for this component
921    eval ExeNameIn=\${config_Executable_${comp}[0]}
922    eval ExeNameOut=\${config_Executable_${comp}[1]}
923
924    # Debug Print
925    IGCM_debug_Print 3 "PeriodStart ${compname} Driver Function (if any)."
926    # UPDATE component
927    ${comp}_PeriodStart 2> /dev/null
928
929  done
930
931  IGCM_debug_PopStack "IGCM_comp_PeriodStart"
932}
933
934#=======================================================================
935function IGCM_comp_Update
936{
937  IGCM_debug_PushStack "IGCM_comp_Update"
938
939    # Debug Print :
940  echo
941  IGCM_debug_Print 1 "IGCM_comp_Update"
942  echo
943
944  typeset ExeNameIn ExeNameOut
945  typeset comp compname comptagname
946  for comp in ${config_ListOfComponents[*]} ; do
947    # Define component
948    eval compname=\${config_ListOfComponents_${comp}[0]} > /dev/null 2>&1
949    eval comptagname=\${config_ListOfComponents_${comp}[1]} > /dev/null 2>&1
950
951    # Copy executable for this component
952    eval ExeNameIn=\${config_Executable_${comp}[0]}
953    eval ExeNameOut=\${config_Executable_${comp}[1]}
954
955    # If missing executable and DRYRUN is set to 0 or 1  then stop!
956    if [ ${DRYRUN} -le 1 ] && [ X${ExeNameIn} != X\"\" ] &&  [ ! -f ${R_EXE}/${ExeNameIn} ] ; then
957      IGCM_debug_Exit "IGCM_comp_Update missing executable ${ExeNameIn}"
958    fi
959
960    if [ ${Period} -eq 1 ] && [ -f ${R_EXE}/${ExeNameIn} ] ; then
961      eval IGCM_sys_Cp ${R_EXE}/${ExeNameIn} ${ExeNameOut}
962      if [ -f ${RUN_DIR}/${ExeNameOut} ] ; then
963        eval IGCM_sys_Chmod +rx ${RUN_DIR}/${ExeNameOut}
964      fi
965    elif [ -f ${R_EXE}/${ExeNameIn} ] && [ ! -f ${RUN_DIR}/${ExeNameOut} ] ; then
966      eval IGCM_sys_Cp ${R_EXE}/${ExeNameIn} ${ExeNameOut}
967      if [ -f ${RUN_DIR}/${ExeNameOut} ] ; then
968        eval IGCM_sys_Chmod +rx ${RUN_DIR}/${ExeNameOut}
969      fi
970    fi
971
972    # Debug Print
973    IGCM_debug_Print 1 "Update ${compname} Parameter Files."
974    # UPDATE component
975    ${comp}_Update
976
977  done
978
979  IGCM_debug_PopStack "IGCM_comp_Update"
980}
981
982#=======================================================================
983function IGCM_comp_Finalize
984{
985  IGCM_debug_PushStack "IGCM_comp_Finalize"
986
987  # Debug Print :
988  echo
989  IGCM_debug_Print 1 "IGCM_comp_Finalize"
990  echo
991
992  typeset ListTextName TextName0
993  typeset comp compname comptagname card ListFilesName FileName0 NbFiles SaveOnArchive
994  typeset i i_ file_in file_in_ file_out file_out_ file_outin file_outin_ generic_file_name nb_rebuild_file
995  typeset -Z4 j4
996  #BASH declare j4
997  typeset list_file nlist_file
998  typeset compactoutputs
999
1000  compactoutputs=false
1001  if [ X${JobType} != XRUN ] ; then
1002    compactoutputs=true
1003  elif [ X${config_UserChoices_CompactText} != Xn ] ; then
1004    compactoutputs=true
1005  fi
1006
1007  for comp in ${config_ListOfComponents[*]} ; do
1008    # Define component
1009    eval compname=\${config_ListOfComponents_${comp}[0]} > /dev/null 2>&1
1010    eval comptagname=\${config_ListOfComponents_${comp}[1]} > /dev/null 2>&1
1011
1012    # Debug Print
1013    IGCM_debug_Print 1 "Finalize ${comp} : ${compname} component."
1014    # FINALIZE component
1015    ${comp}_Finalize
1016
1017    card=${SUBMIT_DIR}/COMP/${compname}.card
1018
1019    # Save Output Text files of models
1020    #---------------------------------
1021    IGCM_debug_Print 2 "Save Output Text files for ${comp} : ${compname} component."
1022    IGCM_card_DefineArrayFromOption ${card} OutputText List
1023    ListTextName=${compname}_OutputText_List
1024
1025    eval TextName0=\${${ListTextName}[0]} > /dev/null 2>&1
1026    if [ X${TextName0} != X${NULL_STR} ] ; then
1027      eval NbFiles=\${#${ListTextName}[@]} > /dev/null 2>&1
1028
1029      (( i=0 ))
1030      until [ $i -eq $NbFiles ]; do
1031        eval file_in=\${${ListTextName}[$i]} > /dev/null 2>&1
1032        eval file_out=${PREFIX}_${file_in}
1033
1034        (( i=i+1 ))
1035
1036        unset list_file
1037        #set +A list_file -- $( ls ${file_in}* | sort 2>/dev/null )
1038        # result for a a1 a10 a2 with file_in=a a a1 a2 a10
1039        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 )
1040        nlist_file=${#list_file[@]}
1041        if [ ${nlist_file} -gt 1 ] ; then
1042          if ( ${compactoutputs} ) ; then
1043            IGCM_debug_Print 2 "Parallelism of Text Output with ${nlist_file} files."
1044            IGCM_debug_Print 2 "Compact files in ${file_out} : " ${list_file[*]}
1045            echo ${list_file[*]} > ${file_out}
1046            echo "" >> ${file_out}
1047
1048            (( i_ = 0 ))
1049            for file in ${list_file[@]}
1050            do
1051              echo "_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ " >> ${file_out}
1052              echo "| " ${i_} " " ${file} >> ${file_out}
1053              echo "- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - " >> ${file_out}
1054              cat ${file} | sed "s/\(.*\)/${i_}\1/" ${file} >> ${file_out}
1055              echo "" >> ${file_out}
1056              eval FileToBeDeleted[${#FileToBeDeleted[@]}]="${file}" > /dev/null 2>&1
1057                  (( i_ = i_ + 1 ))
1058            done
1059            if [ X${Pack} = Xtrue ] ; then
1060              eval IGCM_sys_PutBuffer_Out ${file_out} \${R_BUF_${comp}_D}/${file_out}
1061            else
1062              eval IGCM_sys_Put_Out ${file_out} \${R_OUT_${comp}_D}/${file_out}
1063            fi
1064            eval FileToBeDeleted[${#FileToBeDeleted[@]}]="${file_out}" > /dev/null 2>&1
1065
1066            if ( ${ExecutionFail} ) ; then
1067              IGCM_sys_Cp ${file_out} ${SUBMIT_DIR}/Debug
1068            fi
1069          else
1070            for file in ${list_file[@]}
1071            do
1072              if [ X${Pack} = Xtrue ] ; then
1073                eval IGCM_sys_PutBuffer_Out ${file} \${R_BUF_${comp}_D}/${PREFIX}_${file}
1074              else
1075                eval IGCM_sys_Put_Out ${file} \${R_OUT_${comp}_D}/${PREFIX}_${file}
1076              fi
1077              eval FileToBeDeleted[${#FileToBeDeleted[@]}]="${file}" > /dev/null 2>&1
1078
1079              if ( ${ExecutionFail} ) ; then
1080                IGCM_sys_Cp ${file} ${SUBMIT_DIR}/Debug/${PREFIX}_${file}
1081              fi
1082            done
1083          fi
1084        else
1085          if ( [ -f ${file_in}_0000 ] || [ -f ${file_in}0 ] ) ; then
1086            eval IGCM_sys_Mv ${file_in}* ${file_in}
1087          fi
1088          if [ X${Pack} = Xtrue ] ; then
1089            eval IGCM_sys_PutBuffer_Out ${file_in} \${R_BUF_${comp}_D}/${file_out}
1090          else
1091            eval IGCM_sys_Put_Out ${file_in} \${R_OUT_${comp}_D}/${file_out}
1092          fi
1093          eval FileToBeDeleted[${#FileToBeDeleted[@]}]="${file_in}" > /dev/null 2>&1
1094
1095          if ( ${ExecutionFail} ) ; then
1096            IGCM_sys_Cp ${file_in} ${SUBMIT_DIR}/Debug/${file_out}
1097          fi
1098        fi
1099      done
1100    fi
1101
1102    # Save Restarts files
1103    #--------------------
1104    IGCM_debug_Print 2 "Save Restart files for ${comp} : ${compname} component."
1105    IGCM_card_DefineArrayFromOption ${card} RestartFiles List
1106    ListFilesName=${compname}_RestartFiles_List
1107    eval FileName0=\${${ListFilesName}[0]} > /dev/null 2>&1
1108
1109    if ( [ X${FileName0} != X${NULL_STR} ] && [ X${FileName0} != XNONE ] ) ; then
1110      eval NbFiles=\${#${ListFilesName}[@]} > /dev/null 2>&1
1111
1112      (( i=0 ))
1113      until [ $i -ge $NbFiles ]; do
1114        eval file_in_=\${${ListFilesName}[$i]} > /dev/null 2>&1
1115        eval file_in=${file_in_}
1116
1117        (( i_ = i+1 ))
1118        eval file_out_=\${${ListFilesName}[$i_]} > /dev/null 2>&1
1119        eval file_out=${file_out_}
1120
1121        (( i_ = i+2 ))
1122        eval file_outin_=\${${ListFilesName}[$i_]} > /dev/null 2>&1
1123        eval file_outin=${file_outin_}
1124
1125        generic_restart_file_name_in=$(    basename ${file_in} .nc )
1126        generic_restart_file_name_out=$(   basename ${config_UserChoices_JobName}_${PeriodDateEnd}_${file_out} .nc )
1127        generic_restart_file_name_outin=$( basename ${file_outin} .nc )
1128
1129        nb_restart_file=$( ls ${generic_restart_file_name_in}_????.nc 2>/dev/null | wc -l )
1130        if [ ${nb_restart_file} -gt 1 ] ; then
1131          j=0                                     # BASH LINE NOT NEEDED
1132          # BASH for j4 in in $( eval echo {0000..$(( nb_restart_file - 1 ))} ) ; do
1133          until [ $j -ge ${nb_restart_file} ]; do # BASH LINE NOT NEEDED
1134            j4=${j}                               # BASH LINE NOT NEEDED
1135            if [ X${Pack} = Xtrue ] ; then
1136              eval IGCM_sys_PutBuffer_Rest ${generic_restart_file_name_in}_${j4}.nc \${R_BUF_${comp}_R}/${generic_restart_file_name_out}_${j4}.nc
1137            else
1138              eval IGCM_sys_Put_Rest ${generic_restart_file_name_in}_${j4}.nc \${R_OUT_${comp}_R}/${generic_restart_file_name_out}_${j4}.nc
1139            fi
1140            if [ ! ${file_in} = ${file_outin} ] ; then
1141              if ( ${ExitFlag} ) ; then
1142                echo "IGCM_sys_Mv ${generic_restart_file_name_in}_${j4}.nc ${generic_restart_file_name_outin}_${j4}.nc not executed."
1143              else
1144                IGCM_sys_Mv ${generic_restart_file_name_in}_${j4}.nc ${generic_restart_file_name_outin}_${j4}.nc
1145              fi
1146            fi
1147            (( j=j+1 ))                           # BASH LINE NOT NEEDED
1148          done
1149        else
1150          if [ X${Pack} = Xtrue ] ; then
1151            eval IGCM_sys_PutBuffer_Rest ${file_in} \${R_BUF_${comp}_R}/${config_UserChoices_JobName}_${PeriodDateEnd}_${file_out}
1152          else
1153            eval IGCM_sys_Put_Rest ${file_in} \${R_OUT_${comp}_R}/${config_UserChoices_JobName}_${PeriodDateEnd}_${file_out}
1154          fi
1155          if [ ! ${file_in} = ${file_outin} ] ; then
1156            if ( ${ExitFlag} ) ; then
1157              echo "IGCM_sys_Mv ${file_in} ${file_outin} not executed."
1158            else
1159              IGCM_sys_Mv ${file_in} ${file_outin}
1160            fi
1161          fi
1162        fi
1163
1164        (( i=i+3 ))
1165      done
1166    else
1167      if [ X${FileName0} != XNONE ] ; then
1168        IGCM_debug_Exit "IGCM_comp_Finalize : No file in restart list for ${compname}."
1169      else
1170        IGCM_debug_Print 1 "IGCM_comp_Finalize : NONE specified in Restart List ${compname}."
1171      fi
1172    fi
1173
1174    # Save Output files
1175    #------------------
1176    IGCM_debug_Print 2 "Save Output files for ${comp} : ${compname} component."
1177    IGCM_card_DefineArrayFromOption ${card} OutputFiles List
1178    ListFilesName=${compname}_OutputFiles_List
1179    eval FileName0=\${${ListFilesName}[0]} > /dev/null 2>&1
1180
1181    if [ X${FileName0} != X${NULL_STR} ] ; then
1182      eval NbFiles=\${#${ListFilesName}[@]} > /dev/null 2>&1
1183
1184      (( i=0 ))
1185      until [ $i -ge $NbFiles ]; do
1186        SaveOnArchive=true
1187        eval file_in_=\${${ListFilesName}[$i]} > /dev/null 2>&1
1188        eval file_in=${file_in_}
1189        (( i_ = i+1 ))
1190        eval file_out_=\${${ListFilesName}[$i_]} > /dev/null 2>&1
1191        eval file_out=${file_out_}
1192        #
1193        # Override file_out path remplacing R_SAVE by R_BUFR
1194        #
1195        if [ X${Pack} = Xtrue ] ; then
1196          file_out=$( echo $file_out | sed "s:^$R_SAVE:$R_BUFR:" )
1197        fi
1198        #
1199        # Not necessarily the best option. /!\ Potential side effects /!\
1200        #
1201        (( i_ = i+2 ))
1202        eval flag_post=\${${ListFilesName}[$i_]} > /dev/null 2>&1
1203        #
1204        generic_file_name=$( basename ${file_in} .nc )
1205        nb_rebuild_file=$( ls | grep "^${generic_file_name}_[0-9]*.nc" | wc -l )
1206        #
1207        if ( [ ${nb_rebuild_file} -eq 1 ] && [ -f ${generic_file_name}_0000.nc ] ) ; then
1208          IGCM_debug_Print 2 "Parallelism with 1 file. Rebuilding ${file_in} not needed"
1209          IGCM_sys_Mv ${generic_file_name}_0000.nc ${file_in}
1210        elif [ ${nb_rebuild_file} -gt 1 ] ; then
1211          IGCM_debug_Print 2 "Parallelism detected and rebuilding ${file_in} is needed"
1212          if [ X${AsynchronousRebuild} = Xfalse ] ; then
1213            IGCM_debug_Print 2 "Rebuilding ${file_in} online"
1214            IGCM_sys_rebuild ${file_in} ${generic_file_name}_*.nc
1215          else
1216            IGCM_debug_Print 2 "Preparing offline rebuild for ${file_in}"
1217            [ ! -d ${RUN_DIR}/REBUILD_${PeriodDateBegin} ] && IGCM_sys_Mkdir ${RUN_DIR}/REBUILD_${PeriodDateBegin}
1218            IGCM_sys_Mv ${generic_file_name}_????.nc ${RUN_DIR}/REBUILD_${PeriodDateBegin}
1219
1220            # Prepare headers for the shell dedicated to offline rebuild
1221            if [ ! -f ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh ] ; then
1222              if [ $DRYRUN -le 1 ]; then
1223                echo "#!/bin/ksh                                        " >  ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1224                echo "function IGCM_FlushRebuild                        " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1225                echo "{                                                 " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1226                echo "IGCM_debug_PushStack \"IGCM_FlushRebuild\"        " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1227                echo "echo                                              " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1228                echo "IGCM_debug_Print 1 \"IGCM_FlushRebuild\"          " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1229                echo "echo                                              " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1230                echo "export R_SAVE=${R_SAVE}                           " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1231                echo "export R_BUFR=${R_BUFR}                           " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1232                echo "export R_OUT_KSH=${R_OUT_KSH}                     " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1233                echo "export R_BUF_KSH=${R_BUF_KSH}                     " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1234                echo "export config_UserChoices_JobName=${config_UserChoices_JobName}     " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1235                echo "export config_UserChoices_SpaceName=${config_UserChoices_SpaceName} " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1236              fi
1237            fi
1238            # Prepare the shell dedicated to offline rebuild
1239            if [ $DRYRUN -le 1 ]; then
1240              if [ ${file_in} = histstn.nc ] ; then
1241                echo "IGCM_sys_rebuild_station ${file_in} ${generic_file_name}_*.nc" >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1242              else
1243                echo "IGCM_sys_rebuild ${file_in} ${generic_file_name}_*.nc" >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1244              fi
1245              echo "IGCM_debug_Verif_Exit_Post" >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1246            fi
1247            #
1248            # Load Patch we need to apply and apply
1249            if [ $DRYRUN -le 1 ]; then
1250              if [ X$( eval echo \${${compname}_${flag_post}_Patches[0]} ) !=  X${NULL_STR} ]; then
1251                for Patch in $( eval echo \${${compname}_${flag_post}_Patches[*]} ); do
1252                  echo ". ${libIGCM_POST}/libIGCM_post/IGCM_${Patch}.ksh" >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1253                  echo "IGCM_${Patch} ${file_in}                        " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1254                  echo "IGCM_debug_Verif_Exit_Post                      " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1255                done
1256              fi
1257            fi
1258            #
1259            if [ $DRYRUN -le 1 ]; then
1260              if [ X${Pack} = Xtrue ] ; then
1261                echo "IGCM_sys_PutBuffer_Out ${file_in} ${file_out}     " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1262              else
1263                echo "IGCM_sys_Put_Out ${file_in} ${file_out}           " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1264              fi
1265              echo "IGCM_debug_Verif_Exit_Post                          " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1266              echo "IGCM_sys_Rm ${generic_file_name}_*.nc               " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1267            fi
1268            SaveOnArchive=false
1269          fi
1270        fi
1271        #
1272        if [ ${SaveOnArchive} = true ] ; then
1273          #
1274          # Rebuild has been done online or it was not needed
1275          #
1276          # If we need to apply a patch we use TMP DIRECTORY before ARCHIVING if asynchronous rebuild is on
1277          #
1278          thereisapatch=$( eval echo \${${compname}_${flag_post}_Patches[0]} )
1279          if ( [ ! X${thereisapatch} = X${NULL_STR} ] && [ X${AsynchronousRebuild} = Xtrue ] && [ -f ${file_in} ] ) ; then
1280            [ ! -d ${RUN_DIR}/REBUILD_${PeriodDateBegin} ] && IGCM_sys_Mkdir ${RUN_DIR}/REBUILD_${PeriodDateBegin}
1281            IGCM_sys_Mv ${file_in} ${RUN_DIR}/REBUILD_${PeriodDateBegin}
1282            eval FileToBeDeleted[${#FileToBeDeleted[@]}]=REBUILD_${PeriodDateBegin}/${file_in} > /dev/null 2>&1
1283            #
1284            if [ $DRYRUN -le 1 ]; then
1285              if [ ! -f ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh ] ; then
1286                echo "#!/bin/ksh                                      " >  ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1287                echo "function IGCM_FlushRebuild                      " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1288                echo "{                                               " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1289                echo "IGCM_debug_PushStack \"IGCM_FlushRebuild\"      " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1290                echo "echo                                            " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1291                echo "IGCM_debug_Print 1 \"IGCM_FlushRebuild\"        " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1292                echo "echo                                            " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1293                echo "export R_SAVE=${R_SAVE}                         " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1294                echo "export config_UserChoices_JobName=${config_UserChoices_JobName} " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1295              fi
1296              #
1297              for Patch in $( eval echo \${${compname}_${flag_post}_Patches[*]} ); do
1298                echo ". ${libIGCM_POST}/libIGCM_post/IGCM_${Patch}.ksh" >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1299                echo "IGCM_${Patch} ${file_in}                        " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1300                echo "IGCM_debug_Verif_Exit_Post                      " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1301              done
1302              #
1303              if [ X${Pack} = Xtrue ] ; then
1304                echo "IGCM_sys_PutBuffer_Out ${file_in} ${file_out}   " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1305              else
1306                echo "IGCM_sys_Put_Out ${file_in} ${file_out}         " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1307              fi
1308              echo "IGCM_debug_Verif_Exit_Post                        " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1309              #
1310            fi
1311          else
1312            #
1313            # No Patch, No Asynchronous rebuild, online rebuild has been done or was not needed
1314            #
1315            if [ X${Pack} = Xtrue ] ; then
1316              IGCM_sys_PutBuffer_Out ${file_in} ${file_out}
1317            else
1318              IGCM_sys_Put_Out ${file_in} ${file_out}
1319            fi
1320            eval FileToBeDeleted[${#FileToBeDeleted[@]}]="${file_in}" > /dev/null 2>&1
1321            if [ ${nb_rebuild_file} -gt 1 ] ; then
1322              for DelFile in $( ls | grep "${generic_file_name}[_0-9]*.nc" ) ; do
1323                eval FileToBeDeleted[${#FileToBeDeleted[@]}]=${DelFile} > /dev/null 2>&1
1324              done
1325            fi
1326          fi
1327        fi
1328        (( i=i+3 ))
1329      done
1330    fi
1331    echo
1332  done
1333  IGCM_debug_PopStack "IGCM_comp_Finalize"
1334}
Note: See TracBrowser for help on using the repository browser.