source: branches/libIGCM_MPI_OpenMP/libIGCM_comp/libIGCM_comp.ksh @ 572

Last change on this file since 572 was 572, checked in by mafoipsl, 12 years ago

Correction of test to detect Bufferisation.

  • 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: 41.7 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    # Debug Print
27    IGCM_debug_Print 1 "Initialize ${comp} : ${compname} component."
28
29    # Define component
30    IGCM_card_DefineArrayFromOption ${SUBMIT_DIR}/config.card ListOfComponents ${comp}
31    eval compname=\${config_ListOfComponents_${comp}[0]} > /dev/null 2>&1
32    eval comptagname=\${config_ListOfComponents_${comp}[1]} > /dev/null 2>&1
33
34    # Read libIGCM compatibility version in ${compname}.card
35    card=${SUBMIT_DIR}/COMP/${compname}.card
36    IGCM_card_DefineVariableFromOption ${card} Compatibility libIGCM
37
38    eval CompatibilityTag=\${${compname}_Compatibility_libIGCM} > /dev/null 2>&1       
39    if [ ! "${CompatibilityTag}" = "${libIGCM_CurrentTag}" ] ; then
40      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 ."
41    fi
42
43    # Manage component executable
44    IGCM_card_DefineArrayFromOption ${SUBMIT_DIR}/config.card Executable ${comp}
45
46    # Read component Write Frequency in config.card
47    IGCM_card_DefineVariableFromOption ${SUBMIT_DIR}/config.card ${comp} WriteFrequency
48    # Debug Print :
49    eval auxprint=\${config_${comp}_WriteFrequency}
50    IGCM_debug_Print 1 "Write frequency for ${compname} : ${auxprint} "
51    #2> /dev/null
52
53    # Debug Print :
54    IGCM_debug_Print 2 "Initialize following component library"
55
56    # Source drivers in directory DRIVER if it exist
57    # else source them from directory COMP
58    if [ -d ${SUBMIT_DIR}/DRIVER ] ; then
59      IGCM_debug_Print 2 ${SUBMIT_DIR}/DRIVER/${compname}.driver
60      # Source component library
61      . ${SUBMIT_DIR}/DRIVER/${compname}.driver
62    else
63      IGCM_debug_Print 2 ${SUBMIT_DIR}/COMP/${compname}.driver
64      # Source component library
65      . ${SUBMIT_DIR}/COMP/${compname}.driver
66    fi
67    IGCM_debug_Print 3 "With tag : ${comptagname}"
68
69    # Debug Print
70    IGCM_debug_Print 3 "Initialize ${comp} output directory."
71
72    # Define ARCHIVED Dirs
73    eval R_OUT_${comp}=${R_SAVE}/${comp}
74    eval IGCM_sys_MkdirArchive \${R_OUT_${comp}}
75
76    eval R_OUT_${comp}_O=\${R_OUT_${comp}}/Output
77    eval IGCM_sys_MkdirArchive \${R_OUT_${comp}_O}
78
79    eval R_OUT_${comp}_R=\${R_OUT_${comp}}/Restart
80    eval IGCM_sys_MkdirArchive \${R_OUT_${comp}_R}
81
82    eval R_OUT_${comp}_D=\${R_OUT_${comp}}/Debug
83    eval IGCM_sys_MkdirArchive \${R_OUT_${comp}_D}
84
85    eval R_OUT_${comp}_O_I=\${R_OUT_${comp}_O}/INS
86    eval R_OUT_${comp}_O_H=\${R_OUT_${comp}_O}/HF
87    eval R_OUT_${comp}_O_D=\${R_OUT_${comp}_O}/DA
88    eval R_OUT_${comp}_O_M=\${R_OUT_${comp}_O}/MO
89    eval R_OUT_${comp}_O_Y=\${R_OUT_${comp}_O}/YE
90
91    # Define BUFFERED Dirs
92    eval R_BUF_${comp}=${R_BUFR}/${comp}
93    eval IGCM_sys_Mkdir \${R_BUF_${comp}}
94
95    eval R_BUF_${comp}_O=\${R_BUF_${comp}}/Output
96    eval IGCM_sys_Mkdir \${R_BUF_${comp}_O}
97
98    eval R_BUF_${comp}_R=\${R_BUF_${comp}}/Restart
99    eval IGCM_sys_Mkdir \${R_BUF_${comp}_R}
100
101    eval R_BUF_${comp}_D=\${R_BUF_${comp}}/Debug
102    eval IGCM_sys_Mkdir \${R_BUF_${comp}_D}
103
104    eval R_BUF_${comp}_O_I=\${R_BUF_${comp}_O}/INS
105    eval R_BUF_${comp}_O_H=\${R_BUF_${comp}_O}/HF
106    eval R_BUF_${comp}_O_D=\${R_BUF_${comp}_O}/DA
107    eval R_BUF_${comp}_O_M=\${R_BUF_${comp}_O}/MO
108    eval R_BUF_${comp}_O_Y=\${R_BUF_${comp}_O}/YE
109
110    # Read UserChoices section of component card
111    IGCM_debug_Print 2 "DefineArrayFromSection : ${compname}_UserChoices ${card}"
112    IGCM_card_DefineArrayFromSection ${card} UserChoices
113    eval first_option=\${${compname}_UserChoices[0]} > /dev/null 2>&1
114    # If section is not empty we define corresponding variables
115    if [ X${first_option} != X"Error:" ] ; then
116      if [ X${card_UserChoices[0]} != X ] ; then
117        unset card_UserChoices
118      fi
119      eval set +A card_UserChoices -- \${${compname}_UserChoices[*]} > /dev/null 2>&1
120      IGCM_debug_Print 3 "${compname}_UserChoices_values:"
121      for option in ${card_UserChoices[*]} ; do
122        IGCM_card_DefineVariableFromOption ${card} UserChoices ${option}
123        eval IGCM_debug_Print 3 "${option}=\${${compname}_UserChoices_${option}}"
124      done
125    fi
126
127    # Read and Build Output File stuff
128    IGCM_debug_Print 2 "DefineArrayFromOption  : ${compname}_OutputFiles ${card}"
129    IGCM_card_DefineArrayFromOption ${card} OutputFiles List
130    ListFilesName=${compname}_OutputFiles_List
131    eval FileName0=\${${ListFilesName}[0]} > /dev/null 2>&1
132    #
133    if [ X${FileName0} != X${NULL_STR} ] ; then
134      #
135      #IGCM_debug_Print 1 "Component      : ${compname}"
136      #
137      # INITIALISATION
138      #
139      eval NbFiles=\${#${ListFilesName}[@]} > /dev/null 2>&1
140      #
141      i=2
142      #
143      until [ $i -ge $NbFiles ]; do
144        #
145        eval flag_post=\${${ListFilesName}[$i]} > /dev/null 2>&1
146        #
147        if [ X${flag_post} != XNONE ] ; then
148          #
149          # First of all
150          #
151          IGCM_card_DefineArrayFromSection ${card} ${flag_post}
152          #
153          # Seasonal case : If option Seasonal is not found (old cards) put SEASONAL ON by default
154          #
155          # variable option allready typeset above
156          for option in $( eval echo \${${compname}_${flag_post}[*]} ) ; do
157            if [ ${option} = Seasonal ] ; then
158              FoundSeasonal=true
159              IGCM_card_DefineVariableFromOption ${card} ${flag_post} Seasonal
160            fi
161          done
162          #
163          if [ ! X${FoundSeasonal} = Xtrue ] ; then
164            eval ${compname}_${flag_post}_Seasonal=ON
165          fi
166          #
167          if [ $( eval echo \${${compname}_${flag_post}_Seasonal} ) = ON ] ; then
168            Seasonal=true
169          fi
170         
171          # Dimension = vide si vieille card.
172          IGCM_card_DefineArrayFromOption ${card} ${flag_post} TimeSeriesVars
173          IGCM_card_DefineArrayFromOption ${card} ${flag_post} Patches
174          if [ X"$( eval echo \${${compname}_${flag_post}_TimeSeriesVars[*]} )" = X"Option not" ] ; then
175            # New TimeSeriesVar description, with 2D, 3D and associate ChunckJob.
176            ListDimension[0]=2D
177            ListDimension[1]=3D
178            TimeSeries=false
179            iLoop=${#ListDimension[*]}
180            j=0
181            until [ $j -ge ${iLoop} ]; do
182              Dimension=${ListDimension[${j}]}
183              IGCM_card_DefineArrayFromOption ${card} ${flag_post} TimeSeriesVars${Dimension}
184              IGCM_card_DefineVariableFromOption ${card} ${flag_post} ChunckJob${Dimension}
185              #
186              # Time series WITHOUT chunk
187              #
188              if [ ! $( eval echo \${${compname}_${flag_post}_TimeSeriesVars${Dimension}} ) = ${NULL_STR} ] ; then
189                if [ $( eval echo \${${compname}_${flag_post}_ChunckJob${Dimension}} ) = NONE ] ; then
190                  IGCM_debug_Print 3 "${Dimension} time series activated for ${flag_post}"
191                  eval TimeSeries${Dimension}=true
192                fi
193              fi
194              #
195              # Time series WITH chunk
196              #
197              if [ ! $( eval echo \${${compname}_${flag_post}_TimeSeriesVars${Dimension}} ) = ${NULL_STR} ] ; then
198                chunck_size=$( eval echo \${${compname}_${flag_post}_ChunckJob${Dimension}} )
199                if [ ! ${chunck_size} = NONE ] &&  [ ! ${chunck_size} = OFF ] ; then
200                  IGCM_debug_Print 3 "${Dimension} time series activated with chunck for ${flag_post}"
201                  eval TimeSeriesChunck${Dimension}=true
202                  eval set +A CHUNCK${Dimension}_COMP \${CHUNCK${Dimension}_COMP[*]} ${comp}
203                  eval set +A CHUNCK${Dimension}_FLAG \${CHUNCK${Dimension}_FLAG[*]} ${i}
204                  eval set +A CHUNCK${Dimension}_NAME \${CHUNCK${Dimension}_NAME[*]} ${flag_post}
205                  eval set +A CHUNCK${Dimension}_SIZE \${CHUNCK${Dimension}_SIZE[*]} ${chunck_size}
206                fi
207              fi
208              (( j=j+1 ))
209            done
210          else
211            ListDimension[0]=""
212            TimeSeries=true
213            TimeSeries2D=false
214            TimeSeries3D=false
215            TimeSeriesChunck2D=false
216            TimeSeriesChunck3D=false
217          fi
218        fi
219        (( i=i+3 ))
220      done
221    fi
222    # Debug Print
223    IGCM_debug_Print 3 "Initialize ${compname} with driver."
224    # INIT component
225    ${comp}_Initialize
226    echo
227  done
228
229  IGCM_debug_PopStack "IGCM_comp_Initialize"
230}
231
232#=======================================================================
233function IGCM_comp_PrepareDeletedFiles
234{
235  IGCM_debug_PushStack "IGCM_comp_PrepareDeletedFiles" $@
236 
237  if [ X${2} != X. ] ; then
238    eval FileToBeDeleted[${#FileToBeDeleted[@]}]=$( basename ${2} ) > /dev/null 2>&1
239  else
240    eval FileToBeDeleted[${#FileToBeDeleted[@]}]=$( basename ${1} ) > /dev/null 2>&1
241  fi
242
243  IGCM_debug_PopStack "IGCM_comp_PrepareDeletedFiles"
244}
245
246#=======================================================================
247function IGCM_comp_GetInputInitialStateFiles
248{
249  IGCM_debug_PushStack "IGCM_comp_GetInputInitialStateFiles"
250
251  # Debug Print :
252  echo
253  IGCM_debug_Print 1 "IGCM_comp_GetInputInitialStateFiles"
254  echo
255
256  # Only the first time step need InitialStateFiles
257  # otherwise it's BoundaryConditions
258  if ( ${FirstInitialize} ) ; then
259    typeset comp compname comptagname card ListFilesName FileName0 NbFiles i i_
260    typeset file_in_ file_in file_out_ file_out do_init
261    for comp in ${config_ListOfComponents[*]} ; do
262      # Initialize
263      do_init="y"
264      # Do we need to bring initial state file for this component
265      if [ "${config_Restarts_OverRule}" = "y" ] ; then
266        eval do_init="n"
267      else
268        # Read component Restarts parameters
269        IGCM_card_DefineVariableFromOption ${SUBMIT_DIR}/config.card ${comp} Restart
270        eval do_start=\${config_${comp}_Restart} > /dev/null 2>&1
271        if [ "${do_start}" = "y" ] ; then
272          do_init="n"
273        else
274          do_init="y"
275        fi
276      fi
277
278      if [ "${do_init}" = "y" ] ; then
279        # Define component
280        eval compname=\${config_ListOfComponents_${comp}[0]} > /dev/null 2>&1
281        eval comptagname=\${config_ListOfComponents_${comp}[1]} > /dev/null 2>&1
282
283        # Debug Print :
284        IGCM_debug_Print 3 "Initialisation files ${compname}"
285
286        card=${SUBMIT_DIR}/COMP/${compname}.card
287
288        IGCM_card_DefineArrayFromOption ${card} InitialStateFiles List
289        ListFilesName=${compname}_InitialStateFiles_List
290
291        eval FileName0=\${${ListFilesName}[0]} > /dev/null 2>&1
292        if [ X${FileName0} != X${NULL_STR} ] ; then
293          eval NbFiles=\${#${ListFilesName}[@]} > /dev/null 2>&1
294          (( i=0 ))
295          until [ $i -ge $NbFiles ]; do
296            eval file_in_=\${${ListFilesName}[$i]} > /dev/null 2>&1
297            eval file_in=${file_in_}
298            (( i_ = i+1 ))
299            eval file_out_=\${${ListFilesName}[$i_]} > /dev/null 2>&1
300            eval file_out=${file_out_}
301
302            IGCM_sys_IsFileArchived ${file_in}
303            if [ $? = 0 ] ; then
304              IGCM_sys_Get ${file_in} ${file_out}
305              #IGCM_comp_PrepareDeletedFiles ${file_in} ${file_out}
306            else
307              IGCM_sys_Cp ${file_in} ${file_out}
308            fi
309            (( i=i+2 ))
310          done
311        fi
312      fi
313    done
314  fi
315  IGCM_debug_PopStack "IGCM_comp_GetInputInitialStateFiles"
316}
317
318#=======================================================================
319# Definition of Smooth modulo function
320# usage :
321# IGCM_SmoothModulo StringModulo value
322#
323# StringModulo : A string of min max and modulo like definition of Scilab vectors.
324# [min]:[modulo:][max]
325# where :
326# [] value are optionnals;
327# empty min equal 1
328# empty max equal infinity
329# modulo not given or empty equal 1
330# empty string or just ':' equal always.
331#
332# value : the value to test with the definition
333#
334# return : true(1)/false(0)
335function IGCM_SmoothModulo
336{
337  IGCM_debug_PushStack "IGCM_SmoothModulo"
338  typeset defVector ModValue
339
340  eval set +A defVector -- $( echo "${1}" | \
341    gawk -F ':' '{print ($1 == "" ? 1 : $1) " " (NF==3 ? ($2 == "" ? 1 : $2) : 1) " " (NF==3 ? ($3 == "" ? -1 : $3) : ($2 == "" ? -1 : $2))}' )
342
343  # Save Smooth Min and Max. Needed to call IGCM_sys_Get when appropriate
344  arr[1]=${defVector[0]}
345  arr[2]=${defVector[2]}
346
347  # Test limits :
348  # ${defVector[0]} <= ${2} <= ${defVector[2]}
349  #          or ${defVector[2]} == -1
350  if ( [ ${2} -ge ${defVector[0]} ] && ( [ ${2} -le ${defVector[2]} ] || [ ${defVector[2]} -lt 0 ] ) ) ; then
351    # Test modulo
352    ModValue=$( expr \( ${2} - ${defVector[0]} \) % ${defVector[1]} )
353    if [ ${ModValue} -eq 0 ] ;  then
354      arr[3]=true
355      echo ${arr[@]}
356      IGCM_debug_PopStack "IGCM_SmoothModulo"
357      return 1
358    else
359      arr[3]=false
360      echo ${arr[@]}
361      IGCM_debug_PopStack "IGCM_SmoothModulo"
362      return 0
363    fi
364  else
365    arr[3]=false
366    echo ${arr[@]}
367    IGCM_debug_PopStack "IGCM_SmoothModulo"
368    return 0
369  fi
370}
371
372#=======================================================================
373function IGCM_comp_GetInputSmoothFiles
374{
375  IGCM_debug_PushStack "IGCM_comp_GetInputSmoothFiles"
376
377  # Debug Print :
378  echo
379  IGCM_debug_Print 1 "IGCM_comp_GetInputSmoothFiles"
380  echo
381
382  typeset comp compname comptagname card ListFilesName FileName0 NbFiles j i i_ i__
383  typeset file_in_ file_in file_out_ file_out ret SmoothDef aux val
384
385  for comp in ${config_ListOfComponents[*]} ; do
386    # Define component
387    eval compname=\${config_ListOfComponents_${comp}[0]} > /dev/null 2>&1
388    eval comptagname=\${config_ListOfComponents_${comp}[1]} > /dev/null 2>&1
389
390    # Debug Print :
391    IGCM_debug_Print 3 "Smooth files ${compname}"
392
393    card=${SUBMIT_DIR}/COMP/${compname}.card
394
395    IGCM_card_DefineArrayFromOption ${card} SmoothFiles List
396    ListFilesName=${compname}_SmoothFiles_List
397    eval FileName0=\${${ListFilesName}[0]} > /dev/null 2>&1
398
399    if ( [ X${FileName0} != X${NULL_STR} ] && [ X${FileName0} != X"Section" ] ) ; then
400      eval NbFiles=\${#${ListFilesName}[@]} > /dev/null 2>&1
401
402      (( i=0 ))
403      until [ $i -ge $NbFiles ]; do
404        eval file_in_=\${${ListFilesName}[$i]} > /dev/null 2>&1
405        eval file_in=${file_in_}
406        (( i_ = i+1 ))
407        eval file_out_=\${${ListFilesName}[$i_]} > /dev/null 2>&1
408        eval file_out=${file_out_}
409
410        # define CumulPeriod definition for this file
411        (( i__ = i+2 ))
412        eval SmoothDef=\${${ListFilesName}[$i__]}
413        IGCM_debug_Print 3 "  ${file_in} ${SmoothDef}"
414        aux=$( IGCM_SmoothModulo ${SmoothDef} ${CumulPeriod} )
415        j=1
416        for val in ${aux} ; do
417          [ ${j} -eq 1 ] && SmoothMin=${val}
418          [ ${j} -eq 2 ] && SmoothMax=${val}
419          [ ${j} -eq 3 ] && ret=${val}
420          (( j=j+1 ))
421        done
422        [ ${SmoothMax} -eq -1 ] && SmoothMax=${CumulPeriod}
423        if ( [ X${ret} = Xtrue ] || ( [ ${Period} -eq 1 ] && [ ${CumulPeriod} -ge ${SmoothMin} ] && [ ${CumulPeriod} -le ${SmoothMax} ] ) ) ; then
424
425          IGCM_sys_IsFileArchived ${file_in}
426          if [ $? = 0 ] ; then
427            IGCM_sys_Get ${file_in} ${file_out}
428            #IGCM_comp_PrepareDeletedFiles ${file_in} ${file_out}
429          else
430            IGCM_sys_Cp ${file_in} ${file_out}
431          fi
432        fi
433        (( i=i+3 ))
434      done
435    fi
436  done
437 
438  IGCM_debug_PopStack "IGCM_comp_GetInputSmoothFiles"
439}
440
441#=======================================================================
442function IGCM_comp_GetInputBoundaryFiles
443{
444  IGCM_debug_PushStack "IGCM_comp_GetInputBoundaryFiles"
445
446  # Debug Print :
447  echo
448  IGCM_debug_Print 1 "IGCM_comp_GetInputBoundaryFiles"
449  echo
450
451  typeset comp compname comptagname card ListFilesName FileName0 NbFiles i i_
452  typeset file_in_ file_in file_out_ file_out
453
454  if [ ${Period} = 1 ]; then
455    ListFixBoundary=" "
456  fi
457
458  for comp in ${config_ListOfComponents[*]} ; do
459
460    # Define component
461    eval compname=\${config_ListOfComponents_${comp}[0]} > /dev/null 2>&1
462    eval comptagname=\${config_ListOfComponents_${comp}[1]} > /dev/null 2>&1
463
464    # Debug Print :
465    IGCM_debug_Print 3 "Boundary files ${compname}"
466
467    card=${SUBMIT_DIR}/COMP/${compname}.card
468
469    IGCM_card_DefineArrayFromOption ${card} BoundaryFiles List
470    ListFilesName=${compname}_BoundaryFiles_List
471    eval FileName0=\${${ListFilesName}[0]} > /dev/null 2>&1
472
473    if [ X${FileName0} != X${NULL_STR} ] ; then
474      eval NbFiles=\${#${ListFilesName}[@]} > /dev/null 2>&1
475
476      (( i=0 ))
477      until [ $i -ge $NbFiles ]; do
478        eval file_in_=\${${ListFilesName}[$i]} > /dev/null 2>&1
479        eval file_in=${file_in_}
480        (( i_ = i+1 ))
481        eval file_out_=\${${ListFilesName}[$i_]} > /dev/null 2>&1
482        eval file_out=${file_out_}
483
484        IGCM_sys_Get ${file_in} ${file_out}
485        IGCM_comp_PrepareDeletedFiles ${file_in} ${file_out}
486
487        (( i=i+2 ))
488      done
489    fi
490
491    # Get non deleted files
492    if [ ${Period} = 1 ]; then
493
494      IGCM_card_DefineArrayFromOption ${card} BoundaryFiles ListNonDel
495      ListFilesName=${compname}_BoundaryFiles_ListNonDel
496      eval FileName0=\${${ListFilesName}[0]} > /dev/null 2>&1
497     
498      if [ X${FileName0} != X${NULL_STR} ] ; then
499        eval NbFiles=\${#${ListFilesName}[@]} > /dev/null 2>&1
500       
501        (( i=0 ))
502        until [ $i -ge $NbFiles ]; do
503          eval file_in_=\${${ListFilesName}[$i]} > /dev/null 2>&1
504          eval file_in=${file_in_}
505          (( i_ = i+1 ))
506          eval file_out_=\${${ListFilesName}[$i_]} > /dev/null 2>&1
507          eval file_out=${file_out_}
508
509          IGCM_sys_IsFileArchived ${file_in}
510          if [ $? = 0 ] ; then
511            IGCM_sys_Get ${file_in} ${file_out}
512            #IGCM_comp_PrepareDeletedFiles ${file_in} ${file_out}
513          else
514            IGCM_sys_Cp ${file_in} ${file_out}
515          fi
516
517          if [ X${file_out} != X. ] ; then
518            ListFixBoundary=${ListFixBoundary}" "${file_out}
519          else
520            ListFixBoundary=${ListFixBoundary}" "$( basename ${file_in} )
521          fi
522
523          (( i=i+2 ))
524        done
525      fi
526    fi
527  done
528 
529  IGCM_debug_PopStack "IGCM_comp_GetInputBoundaryFiles"
530}
531
532#=======================================================================
533function IGCM_comp_DelFixeBoundaryFiles
534{
535  IGCM_debug_PushStack "IGCM_comp_DelFixeBoundaryFiles"
536
537  # Debug Print :
538  echo
539  IGCM_debug_Print 1 "IGCM_comp_DelFixeBoundaryFiles"
540  echo
541
542  ls -l ${ListFixBoundary}
543  rm -f ${ListFixBoundary}
544
545  IGCM_debug_PopStack "IGCM_comp_DelFixeBoundaryFiles"
546}
547
548#=======================================================================
549function IGCM_comp_GetInputParametersFiles
550{
551  IGCM_debug_PushStack "IGCM_comp_GetInputParametersFiles"
552
553  # Debug Print :
554  echo
555  IGCM_debug_Print 1 "IGCM_comp_GetInputParametersFiles"
556  echo
557
558  typeset comp compname comptagname card ListFilesName FileName0 NbFiles i i_ file_in file_out
559  for comp in ${config_ListOfComponents[*]} ; do
560    # Define component
561    eval compname=\${config_ListOfComponents_${comp}[0]} > /dev/null 2>&1
562    eval comptagname=\${config_ListOfComponents_${comp}[1]} > /dev/null 2>&1
563
564    # Debug Print :
565    IGCM_debug_Print 3 "Parameters ${compname}"
566
567    card=${SUBMIT_DIR}/COMP/${compname}.card   
568
569    IGCM_card_DefineArrayFromOption ${card} ParametersFiles List
570    ListFilesName=${compname}_ParametersFiles_List
571    eval FileName0=\${${ListFilesName}[0]} > /dev/null 2>&1
572
573    if [ X${FileName0} != X${NULL_STR} ] ; then
574      eval NbFiles=\${#${ListFilesName}[@]} > /dev/null 2>&1
575
576      (( i=0 ))
577      until [ $i -ge $NbFiles ]; do
578        eval file_in_=\${${ListFilesName}[$i]} > /dev/null 2>&1
579        eval file_in=${file_in_}
580        (( i_ = i+1 ))
581        eval file_out_=\${${ListFilesName}[$i_]} > /dev/null 2>&1
582        eval file_out=${file_out_} 
583
584        IGCM_sys_Cp ${file_in} ${file_out} 
585        IGCM_comp_PrepareDeletedFiles ${file_in} ${file_out}
586
587        (( i=i+2 ))
588      done
589    fi
590  done
591
592  IGCM_debug_PopStack "IGCM_comp_GetInputParametersFiles"
593}
594
595#=======================================================================
596function IGCM_comp_GetInputRestartFiles
597{
598  IGCM_debug_PushStack "IGCM_comp_GetInputRestartFiles"
599
600  # Debug Print :
601  echo
602  IGCM_debug_Print 1 "IGCM_comp_GetInputRestartFiles"
603  echo
604
605  typeset Date_tmp Date_r Path_r do_start CompOldName Path_OUT Path_BUF Buffered
606  typeset comp compname comptagname card ListFilesName FileName0 NbFiles i i_
607  typeset file_in file_out file_in_ file_out_ file_in_Name
608  typeset -Z4 j4
609
610  for comp in ${config_ListOfComponents[*]} ; do
611    # Define component
612    eval compname=\${config_ListOfComponents_${comp}[0]} > /dev/null 2>&1
613    eval comptagname=\${config_ListOfComponents_${comp}[1]} > /dev/null 2>&1
614    #
615    card=${SUBMIT_DIR}/COMP/${compname}.card
616    #
617    IGCM_card_DefineArrayFromOption ${card} RestartFiles List
618    ListFilesName=${compname}_RestartFiles_List
619    eval FileName0=\${${ListFilesName}[0]} > /dev/null 2>&1
620
621    # Debug Print :
622    IGCM_debug_Print 3 "restart ${compname}"
623
624    if ( ${FirstInitialize} ) ; then
625
626      if [ "${config_Restarts_OverRule}" = "y" ] ; then
627        eval config_${comp}_Restart="y"
628        eval config_${comp}_RestartDate=${config_Restarts_RestartDate}
629        eval config_${comp}_RestartJobName=${config_Restarts_RestartJobName}
630        eval config_${comp}_RestartPath=${config_Restarts_RestartPath}
631        eval do_start=\${config_${comp}_Restart} > /dev/null 2>&1
632        eval CompOldName=${comp}
633      else
634                # Read component Restarts parameters
635        IGCM_card_DefineVariableFromOption ${SUBMIT_DIR}/config.card ${comp} Restart
636        eval do_start=\${config_${comp}_Restart} > /dev/null 2>&1
637
638        if [ "${do_start}" = "y" ] ; then
639          IGCM_card_DefineVariableFromOption ${SUBMIT_DIR}/config.card ${comp} RestartDate
640          IGCM_card_DefineVariableFromOption ${SUBMIT_DIR}/config.card ${comp} RestartJobName
641          IGCM_card_DefineVariableFromOption ${SUBMIT_DIR}/config.card ${comp} RestartPath
642        else
643          eval config_${comp}_RestartDate=-1
644          eval config_${comp}_RestartJobName=${NULL_STR}
645          eval config_${comp}_RestartPath=${NULL_STR}
646        fi
647        IGCM_card_DefineVariableFromOption ${SUBMIT_DIR}/config.card ${comp} OldName
648        eval CompOldName=\${config_${comp}_OldName}
649        if [ X${CompOldName} = X ] ; then
650          eval CompOldName=${comp}
651        fi
652      fi
653
654      if [ "${do_start}" = "y" ] ; then
655
656        if ( [ X${FileName0} != X${NULL_STR} ] && [ X${FileName0} != XNONE ] ) ; then
657          eval NbFiles=\${#${ListFilesName}[@]} > /dev/null 2>&1
658
659          (( i=1 ))
660          until [ $i -gt $NbFiles ]; do
661            eval file_in_=\${${ListFilesName}[$i]} > /dev/null 2>&1
662            eval file_in=${file_in_}
663
664            (( i_ = i+1 ))
665            eval file_out_=\${${ListFilesName}[$i_]} > /dev/null 2>&1
666            eval file_out=${file_out_}
667           
668            eval Date_tmp=\${config_${comp}_RestartDate}
669            Date_r=$( IGCM_date_ConvertFormatToGregorian ${Date_tmp} )
670            eval Path_r=\${config_${comp}_RestartPath}/\${config_${comp}_RestartJobName}/${CompOldName}/Restart
671            eval file_in_Name=\${config_${comp}_RestartJobName}_${Date_r}_${file_in}
672
673            generic_restart_file_name_in=$( basename ${file_in_Name} .nc )
674            generic_restart_file_name_out=$( basename ${file_out} .nc )
675           
676            eval Path_OUT=\${Path_r}/${generic_restart_file_name_in}
677            nb_restart_file=$(IGCM_sys_CountFileArchive ${Path_OUT}_????.nc)
678
679            if [ ${nb_restart_file} -gt 1 ] ; then
680              j=0
681              until [ $j -ge $nb_restart_file ]; do
682                j4=${j}
683                eval IGCM_sys_Get ${Path_r}/${generic_restart_file_name_in}_${j4}.nc ${generic_restart_file_name_out}_${j4}.nc
684                #IGCM_comp_PrepareDeletedFiles ${generic_restart_file_name_in}_${j4}.nc ${generic_restart_file_name_out}_${j4}.nc
685                #eval FileToBeDeleted[${#FileToBeDeleted[@]}]="${generic_restart_file_name_out}_${j4}.nc" > /dev/null 2>&1
686                (( j=j+1 ))
687              done
688            else
689              eval IGCM_sys_Get ${Path_r}/${file_in_Name} ${file_out} 
690              #IGCM_comp_PrepareDeletedFiles ${file_in} ${file_out}
691            fi
692           
693            (( i=i+3 ))
694          done
695        else
696          if [ X${FileName0} != XNONE ] ; then
697            IGCM_debug_Exit "IGCM_comp_GetInputRestartFiles : No file in list for ${compname}."
698          else
699            IGCM_debug_Print 1 "IGCM_comp_GetInputRestartFiles : NONE specified in Restart List ${compname}."
700          fi
701        fi
702      fi
703    elif [ ${Period} -eq 1 ] ; then
704      # if not FirstInitialize and first loop of this job
705
706      # Restore Restarts files
707      #-----------------------
708      if ( [ X${FileName0} != X${NULL_STR} ] && [ X${FileName0} != XNONE ] ) ; then
709        eval NbFiles=\${#${ListFilesName}[@]} > /dev/null 2>&1
710
711        (( i=1 ))
712        until [ $i -gt $NbFiles ]; do
713          eval file_in_=\${${ListFilesName}[$i]} > /dev/null 2>&1
714          eval file_in=${file_in_}
715          (( i_ = i+1 ))
716          eval file_out_=\${${ListFilesName}[$i_]} > /dev/null 2>&1
717          eval file_out=${file_out_}
718         
719          file_in_Name=${run_Configuration_OldPrefix}_${file_in}
720
721          generic_restart_file_name_in=$( basename ${file_in_Name} .nc )
722          generic_restart_file_name_out=$( basename ${file_out} .nc )
723
724          eval Path_BUF=\${R_BUF_${comp}_R}/${generic_restart_file_name_in}
725          eval Path_OUT=\${R_OUT_${comp}_R}/${generic_restart_file_name_in}
726
727          if [ -f ${Path_BUF}*.nc ] ; then
728            Buffered=true
729            nb_restart_file=$(IGCM_sys_CountFileBuffer ${Path_BUF}_????.nc)
730          else
731            Buffered=false
732            nb_restart_file=$(IGCM_sys_CountFileArchive ${Path_OUT}_????.nc)
733          fi
734
735          if [ ${nb_restart_file} -gt 1 ] ; then
736            j=0
737            until [ $j -ge $nb_restart_file ]; do
738              j4=${j}
739              if [ X${Buffered} = Xtrue ] ; then
740                IGCM_sys_GetBuffer ${Path_BUF}_${j4}.nc ${generic_restart_file_name_out}_${j4}.nc
741              else
742                IGCM_sys_Get ${Path_OUT}_${j4}.nc ${generic_restart_file_name_out}_${j4}.nc
743              fi
744              (( j=j+1 ))
745            done
746          else
747            if [ X${Buffered} = Xtrue ] ; then
748              eval IGCM_sys_GetBuffer \${R_BUF_${comp}_R}/${file_in_Name} ${file_out}
749            else
750              eval IGCM_sys_Get \${R_OUT_${comp}_R}/${file_in_Name} ${file_out}
751            fi
752          fi
753
754          (( i=i+3 ))
755        done
756      else
757        if [ X${FileName0} != XNONE ] ; then
758          IGCM_debug_Exit "IGCM_comp_GetInputRestartFiles : No file in list for ${compname}."
759        else
760          IGCM_debug_Print 1 "IGCM_comp_GetInputRestartFiles : NONE specified in Restart List ${compname}."
761        fi
762      fi
763    fi
764  done
765
766  NbFiles=$( ls * 2> /dev/null | wc -l )
767  if [ ${NbFiles} -gt 0 ] ; then
768    IGCM_sys_Chmod u+rw *
769  fi
770
771  IGCM_debug_PopStack "IGCM_comp_GetInputRestartFiles"
772}
773
774#=======================================================================
775function IGCM_comp_PeriodStart
776{
777  IGCM_debug_PushStack "IGCM_comp_PeriodStart"
778
779  # Debug Print :
780  echo
781  IGCM_debug_Print 1 "IGCM_comp_PeriodStart"
782  echo
783
784  typeset ExeNameIn ExeNameOut
785  typeset comp compname comptagname
786  for comp in ${config_ListOfComponents[*]} ; do
787    # Define component
788    eval compname=\${config_ListOfComponents_${comp}[0]} > /dev/null 2>&1
789    eval comptagname=\${config_ListOfComponents_${comp}[1]} > /dev/null 2>&1
790
791    # Copy executable for this component
792    eval ExeNameIn=\${config_Executable_${comp}[0]}
793    eval ExeNameOut=\${config_Executable_${comp}[1]}
794
795    # Debug Print
796    IGCM_debug_Print 3 "PeriodStart ${compname} Driver Function (if any)."
797    # UPDATE component
798    ${comp}_PeriodStart 2> /dev/null
799
800  done
801
802  IGCM_debug_PopStack "IGCM_comp_PeriodStart"
803}
804
805#=======================================================================
806function IGCM_comp_Update
807{
808  IGCM_debug_PushStack "IGCM_comp_Update"
809
810    # Debug Print :
811  echo
812  IGCM_debug_Print 1 "IGCM_comp_Update"
813  echo
814
815  typeset ExeNameIn ExeNameOut
816  typeset comp compname comptagname
817  for comp in ${config_ListOfComponents[*]} ; do
818    # Define component
819    eval compname=\${config_ListOfComponents_${comp}[0]} > /dev/null 2>&1
820    eval comptagname=\${config_ListOfComponents_${comp}[1]} > /dev/null 2>&1
821
822    # Copy executable for this component
823    eval ExeNameIn=\${config_Executable_${comp}[0]}
824    eval ExeNameOut=\${config_Executable_${comp}[1]}
825
826    # If missing executable and DRYRUN is set to 0 or 1  then stop!
827    if [ ${DRYRUN} -le 1 ] && [ X${ExeNameIn} != X\"\" ] &&  [ ! -f ${R_EXE}/${ExeNameIn} ] ; then
828      IGCM_debug_Exit "IGCM_comp_Update missing executable ${ExeNameIn}"
829    fi
830
831    if [ ${Period} -eq 1 ] && [ -f ${R_EXE}/${ExeNameIn} ] ; then
832      eval IGCM_sys_Cp ${R_EXE}/${ExeNameIn} ${ExeNameOut}
833      if [ -f ${RUN_DIR}/${ExeNameOut} ] ; then
834        eval IGCM_sys_Chmod +rx ${RUN_DIR}/${ExeNameOut}
835      fi
836    elif [ -f ${R_EXE}/${ExeNameIn} ] && [ ! -f ${RUN_DIR}/${ExeNameOut} ] ; then
837      eval IGCM_sys_Cp ${R_EXE}/${ExeNameIn} ${ExeNameOut}
838      if [ -f ${RUN_DIR}/${ExeNameOut} ] ; then
839        eval IGCM_sys_Chmod +rx ${RUN_DIR}/${ExeNameOut}
840      fi
841    fi
842
843    # Debug Print
844    IGCM_debug_Print 1 "Update ${compname} Parameter Files."
845    # UPDATE component
846    ${comp}_Update
847
848  done
849
850  IGCM_debug_PopStack "IGCM_comp_Update"
851}
852
853#=======================================================================
854function IGCM_comp_Finalize
855{
856  IGCM_debug_PushStack "IGCM_comp_Finalize"
857
858  # Debug Print :
859  echo
860  IGCM_debug_Print 1 "IGCM_comp_Finalize"
861  echo
862
863  typeset ListTextName TextName0
864  typeset comp compname comptagname card ListFilesName FileName0 NbFiles SaveOnArchive
865  typeset i i_ file_in file_in_ file_out file_out_ file_outin file_outin_ generic_file_name nb_rebuild_file
866  typeset -Z4 j4
867  typeset list_file nlist_file
868  typeset compactoutputs
869
870  compactoutputs=false
871  if [ X${JobType} != XRUN ] ; then
872    compactoutputs=true
873  elif [ X${config_UserChoices_CompactText} != Xn ] ; then
874    compactoutputs=true
875  fi
876
877  for comp in ${config_ListOfComponents[*]} ; do
878    # Define component
879    eval compname=\${config_ListOfComponents_${comp}[0]} > /dev/null 2>&1
880    eval comptagname=\${config_ListOfComponents_${comp}[1]} > /dev/null 2>&1
881
882    # Debug Print
883    IGCM_debug_Print 1 "Finalize ${comp} : ${compname} component."
884    # FINALIZE component
885    ${comp}_Finalize
886
887    card=${SUBMIT_DIR}/COMP/${compname}.card   
888
889    # Save Restarts files
890    #--------------------
891    IGCM_debug_Print 2 "Save Restart files for ${comp} : ${compname} component."
892    IGCM_card_DefineArrayFromOption ${card} RestartFiles List
893    ListFilesName=${compname}_RestartFiles_List
894    eval FileName0=\${${ListFilesName}[0]} > /dev/null 2>&1
895   
896    if ( [ X${FileName0} != X${NULL_STR} ] && [ X${FileName0} != XNONE ] ) ; then
897      eval NbFiles=\${#${ListFilesName}[@]} > /dev/null 2>&1
898     
899      (( i=0 ))
900      until [ $i -ge $NbFiles ]; do
901        eval file_in_=\${${ListFilesName}[$i]} > /dev/null 2>&1
902        eval file_in=${file_in_}
903
904        (( i_ = i+1 ))
905        eval file_out_=\${${ListFilesName}[$i_]} > /dev/null 2>&1
906        eval file_out=${file_out_}
907
908        (( i_ = i+2 ))
909        eval file_outin_=\${${ListFilesName}[$i_]} > /dev/null 2>&1
910        eval file_outin=${file_outin_}
911
912        generic_restart_file_name_in=$(    basename ${file_in} .nc )
913        generic_restart_file_name_out=$(   basename ${config_UserChoices_JobName}_${PeriodDateEnd}_${file_out} .nc )
914        generic_restart_file_name_outin=$( basename ${file_outin} .nc )
915       
916        nb_restart_file=$( ls ${generic_restart_file_name_in}_????.nc 2>/dev/null | wc -l ) 
917        if [ ${nb_restart_file} -gt 1 ] ; then
918          j=0
919          until [ $j -ge $nb_restart_file ]; do
920            j4=${j}
921            if [ X${Pack} = Xtrue ] ; then
922              eval IGCM_sys_PutBuffer_Rest ${generic_restart_file_name_in}_${j4}.nc \${R_BUF_${comp}_R}/${generic_restart_file_name_out}_${j4}.nc
923            else
924              eval IGCM_sys_Put_Rest       ${generic_restart_file_name_in}_${j4}.nc \${R_OUT_${comp}_R}/${generic_restart_file_name_out}_${j4}.nc
925            fi
926            if [ ! ${file_in} = ${file_outin} ] ; then
927              if ( ${ExitFlag} ) ; then
928                echo "IGCM_sys_Mv ${generic_restart_file_name_in}_${j4}.nc ${generic_restart_file_name_outin}_${j4}.nc not executed."
929              else
930                IGCM_sys_Mv ${generic_restart_file_name_in}_${j4}.nc ${generic_restart_file_name_outin}_${j4}.nc
931              fi
932            fi
933            (( j=j+1 ))
934          done
935        else
936          if [ X${Pack} = Xtrue ] ; then
937            eval IGCM_sys_PutBuffer_Rest ${file_in} \${R_BUF_${comp}_R}/${config_UserChoices_JobName}_${PeriodDateEnd}_${file_out}
938          else
939            eval IGCM_sys_Put_Rest       ${file_in} \${R_OUT_${comp}_R}/${config_UserChoices_JobName}_${PeriodDateEnd}_${file_out}
940          fi
941          if [ ! ${file_in} = ${file_outin} ] ; then
942            if ( ${ExitFlag} ) ; then
943              echo "IGCM_sys_Mv ${file_in} ${file_outin} not executed."
944            else
945              IGCM_sys_Mv ${file_in} ${file_outin}
946            fi
947          fi
948        fi
949
950        (( i=i+3 ))
951      done
952    else
953      if [ X${FileName0} != XNONE ] ; then
954        IGCM_debug_Exit "IGCM_comp_Finalize : No file in restart list for ${compname}."
955      else
956        IGCM_debug_Print 1 "IGCM_comp_Finalize : NONE specified in Restart List ${compname}."
957      fi
958    fi
959
960    # Save Output files
961    #------------------
962    IGCM_debug_Print 2 "Save Output files for ${comp} : ${compname} component."
963    IGCM_card_DefineArrayFromOption ${card} OutputFiles List
964    ListFilesName=${compname}_OutputFiles_List
965    eval FileName0=\${${ListFilesName}[0]} > /dev/null 2>&1
966
967    if [ X${FileName0} != X${NULL_STR} ] ; then
968      eval NbFiles=\${#${ListFilesName}[@]} > /dev/null 2>&1
969
970      (( i=0 ))
971      until [ $i -ge $NbFiles ]; do
972        SaveOnArchive=true
973        eval file_in_=\${${ListFilesName}[$i]} > /dev/null 2>&1
974        eval file_in=${file_in_}
975        (( i_ = i+1 ))
976        eval file_out_=\${${ListFilesName}[$i_]} > /dev/null 2>&1
977        eval file_out=${file_out_}
978        (( i_ = i+2 ))
979        eval flag_post=\${${ListFilesName}[$i_]} > /dev/null 2>&1
980        #
981        generic_file_name=$( basename ${file_in} .nc )
982        nb_rebuild_file=$( ls | grep "^${generic_file_name}_[0-9]*.nc" | wc -l )
983        #
984        if ( [ ${nb_rebuild_file} -eq 1 ] && [ -f ${generic_file_name}_0000.nc ] ) ; then
985          IGCM_debug_Print 2 "Parallelism with 1 process. Rebuilding ${file_in} not needed"
986          IGCM_sys_Mv ${generic_file_name}_0000.nc ${file_in}
987        elif [ ${nb_rebuild_file} -gt 1 ] ; then
988          IGCM_debug_Print 2 "Parallelism detected rebuilding ${file_in} is needed"
989          if [ X${AsynchronousRebuild} = Xfalse ] ; then
990            IGCM_debug_Print 2 "Rebuilding ${file_in} online"
991            IGCM_sys_rebuild ${file_in} ${generic_file_name}_*.nc
992          else
993            IGCM_debug_Print 2 "Preparing offline rebuild for ${file_in}"
994            [ ! -d ${RUN_DIR}/REBUILD_${PeriodDateBegin} ] && IGCM_sys_Mkdir ${RUN_DIR}/REBUILD_${PeriodDateBegin}
995            IGCM_sys_Mv ${generic_file_name}_????.nc ${RUN_DIR}/REBUILD_${PeriodDateBegin}
996
997            # Prepare headers for the shell dedicated to offline rebuild
998            if [ ! -f ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh ] ; then
999              if [ $DRYRUN -le 1 ]; then
1000                echo "#!/bin/ksh                                        " >  ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1001                echo "function IGCM_FlushRebuild                        " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1002                echo "{                                                 " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1003                echo "IGCM_debug_PushStack \"IGCM_FlushRebuild\"        " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1004                echo "echo                                              " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1005                echo "IGCM_debug_Print 1 \"IGCM_FlushRebuild\"          " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1006                echo "echo                                              " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1007                echo "export R_SAVE=${R_SAVE}                           " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1008                echo "export config_UserChoices_JobName=${config_UserChoices_JobName} " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1009              fi
1010            fi
1011            # Prepare the shell dedicated to offline rebuild
1012            if [ $DRYRUN -le 1 ]; then
1013              echo "IGCM_sys_rebuild ${file_in} ${generic_file_name}_*.nc" >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1014              echo "IGCM_debug_Verif_Exit_Post                           " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1015            fi
1016            #
1017            # Load Patch we need to apply and apply
1018            if [ $DRYRUN -le 1 ]; then
1019              if [ X$( eval echo \${${compname}_${flag_post}_Patches[0]} ) !=  X${NULL_STR} ]; then
1020                for Patch in $( eval echo \${${compname}_${flag_post}_Patches[*]} ); do
1021                  echo ". ${libIGCM_POST}/libIGCM_post/IGCM_${Patch}.ksh" >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1022                  echo "IGCM_${Patch} ${file_in}                        " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1023                  echo "IGCM_debug_Verif_Exit_Post                      " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1024                done
1025              fi
1026            fi
1027            #
1028            if [ $DRYRUN -le 1 ]; then
1029              echo "IGCM_sys_Put_Out ${file_in} ${file_out}             " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1030              echo "IGCM_debug_Verif_Exit_Post                          " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1031              echo "IGCM_sys_Rm ${generic_file_name}_*.nc               " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1032            fi
1033            SaveOnArchive=false
1034          fi
1035        fi
1036        #
1037        if [ ${SaveOnArchive} = true ] ; then
1038          #
1039          # Rebuild has been done online or it was not needed
1040          #
1041          # If we need to apply a patch we use TMP DIRECTORY before ARCHIVING if asynchronous rebuild is on
1042          #
1043          thereisapatch=$( eval echo \${${compname}_${flag_post}_Patches[0]} )
1044          if ( [ ! X${thereisapatch} = X${NULL_STR} ] && [ X${AsynchronousRebuild} = Xtrue ] && [ -f ${file_in} ] ) ; then
1045            [ ! -d ${RUN_DIR}/REBUILD_${PeriodDateBegin} ] && IGCM_sys_Mkdir ${RUN_DIR}/REBUILD_${PeriodDateBegin}
1046            IGCM_sys_Mv ${file_in} ${RUN_DIR}/REBUILD_${PeriodDateBegin}
1047            eval FileToBeDeleted[${#FileToBeDeleted[@]}]=REBUILD_${PeriodDateBegin}/${file_in} > /dev/null 2>&1
1048            #
1049            if [ $DRYRUN -le 1 ]; then
1050              if [ ! -f ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh ] ; then
1051                echo "#!/bin/ksh                                      " >  ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1052                echo "function IGCM_FlushRebuild                      " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1053                echo "{                                               " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1054                echo "IGCM_debug_PushStack \"IGCM_FlushRebuild\"      " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1055                echo "echo                                            " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1056                echo "IGCM_debug_Print 1 \"IGCM_FlushRebuild\"        " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1057                echo "echo                                            " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1058                echo "export R_SAVE=${R_SAVE}                         " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1059                echo "export config_UserChoices_JobName=${config_UserChoices_JobName} " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1060              fi
1061              #
1062              for Patch in $( eval echo \${${compname}_${flag_post}_Patches[*]} ); do
1063                echo ". ${libIGCM_POST}/libIGCM_post/IGCM_${Patch}.ksh" >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1064                echo "IGCM_${Patch} ${file_in}                        " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1065                echo "IGCM_debug_Verif_Exit_Post                      " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1066              done
1067              #
1068              echo "IGCM_sys_Put_Out ${file_in} ${file_out}           " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1069              echo "IGCM_debug_Verif_Exit_Post                        " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1070              #
1071            fi
1072          else
1073            #
1074            # No Patch, No Asynchronous rebuild, online rebuild has been done or was not needed
1075            #
1076            IGCM_sys_Put_Out ${file_in} ${file_out}
1077            eval FileToBeDeleted[${#FileToBeDeleted[@]}]="${file_in}" > /dev/null 2>&1
1078            if [ ${nb_rebuild_file} -gt 1 ] ; then
1079              for DelFile in $( ls | grep "${generic_file_name}[_0-9]*.nc" ) ; do
1080                eval FileToBeDeleted[${#FileToBeDeleted[@]}]=${DelFile} > /dev/null 2>&1
1081              done
1082            fi
1083          fi
1084        fi
1085        (( i=i+3 ))
1086      done
1087    fi
1088
1089    # Save Output Text files of models
1090    #---------------------------------
1091    IGCM_debug_Print 2 "Save Output Text files for ${comp} : ${compname} component."
1092    IGCM_card_DefineArrayFromOption ${card} OutputText List
1093    ListTextName=${compname}_OutputText_List
1094   
1095    eval TextName0=\${${ListTextName}[0]} > /dev/null 2>&1
1096    if [ X${TextName0} != X${NULL_STR} ] ; then
1097      eval NbFiles=\${#${ListTextName}[@]} > /dev/null 2>&1
1098
1099      (( i=0 ))
1100      until [ $i -eq $NbFiles ]; do
1101        eval file_in=\${${ListTextName}[$i]} > /dev/null 2>&1
1102        eval file_out=${PREFIX}_${file_in}
1103
1104        (( i=i+1 ))
1105
1106        unset list_file
1107        #set +A list_file -- $( ls ${file_in}* | sort 2>/dev/null )
1108        # result for a a1 a10 a2 with file_in=a a a1 a2 a10
1109        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 )
1110        nlist_file=${#list_file[@]}
1111          if [ ${nlist_file} -gt 1 ] ; then
1112            if ( ${compactoutputs} ) ; then
1113              IGCM_debug_Print 2 "Parallelism of Text Output with ${nlist_file} files."
1114              IGCM_debug_Print 2 "Compact files in ${file_out} : " ${list_file[*]}
1115              echo ${list_file[*]} > ${file_out}
1116              echo "" >> ${file_out}
1117             
1118              (( i_ = 0 ))
1119              for file in ${list_file[@]}
1120              do
1121                echo "_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ " >> ${file_out}
1122                echo "| " ${i_} " " ${file} >> ${file_out}
1123                echo "- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - " >> ${file_out}
1124                cat ${file} | sed "s/\(.*\)/${i_}\1/" ${file} >> ${file_out}
1125                echo "" >> ${file_out}
1126                eval FileToBeDeleted[${#FileToBeDeleted[@]}]="${file}" > /dev/null 2>&1
1127                    (( i_ = i_ + 1 ))
1128              done
1129              if [ X${Pack} = Xtrue ] ; then
1130                eval IGCM_sys_PutBuffer_Out ${file_out} \${R_BUF_${comp}_D}/${file_out}
1131              else
1132                eval IGCM_sys_Put_Out       ${file_out} \${R_OUT_${comp}_D}/${file_out}
1133              fi
1134              eval FileToBeDeleted[${#FileToBeDeleted[@]}]="${file_out}" > /dev/null 2>&1
1135
1136              if ( ${ExecutionFail} ) ; then
1137                IGCM_sys_Cp ${file_out} ${SUBMIT_DIR}/Debug
1138              fi
1139            else
1140              for file in ${list_file[@]}
1141              do
1142                if [ X${Pack} = Xtrue ] ; then
1143                  eval IGCM_sys_PutBuffer_Out ${file} \${R_BUF_${comp}_D}/${PREFIX}_${file}
1144                else
1145                  eval IGCM_sys_Put_Out       ${file} \${R_OUT_${comp}_D}/${PREFIX}_${file}
1146                fi
1147                eval FileToBeDeleted[${#FileToBeDeleted[@]}]="${file}" > /dev/null 2>&1
1148
1149                if ( ${ExecutionFail} ) ; then
1150                  IGCM_sys_Cp ${file} ${SUBMIT_DIR}/Debug/${PREFIX}_${file}
1151                fi
1152              done
1153            fi
1154          else
1155            if ( [ -f ${file_in}_0000 ] || [ -f ${file_in}0 ] ) ; then
1156              eval IGCM_sys_Mv ${file_in}* ${file_in}
1157            fi
1158            if [ X${Pack} = Xtrue ] ; then
1159              eval IGCM_sys_PutBuffer_Out ${file_in} \${R_BUF_${comp}_D}/${file_out}
1160            else
1161              eval IGCM_sys_Put_Out       ${file_in} \${R_OUT_${comp}_D}/${file_out}
1162            fi
1163            eval FileToBeDeleted[${#FileToBeDeleted[@]}]="${file_in}" > /dev/null 2>&1
1164
1165            if ( ${ExecutionFail} ) ; then
1166              IGCM_sys_Cp ${file_in} ${SUBMIT_DIR}/Debug/${file_out}
1167            fi
1168          fi
1169      done
1170    fi
1171    echo
1172  done
1173  IGCM_debug_PopStack "IGCM_comp_Finalize"
1174}
Note: See TracBrowser for help on using the repository browser.