source: tags/libIGCM_v2.0_rc3/libIGCM_comp/libIGCM_comp.ksh @ 1435

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