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

Last change on this file since 544 was 544, checked in by sdipsl, 12 years ago
  • Prepare libIGCM for TGCC migration. For now work for CCRT machines ONLY
  • SX8, SX9 and Titane are independant from DMNFS
    • 30 seconds between execution instead of at least 3 minutes ; sometimes hours
  • SX8, SX9 and Titane use their SCRATCHDIR as a BUFFER (for restart and text)
  • Titane simulations are entirely post-processed on titane mono
    • Working except create_se and atlas (missing software : ncap2, openpbm, ImageMagick?)
  • Cards are the same up to now
  • New indentation to ease readability ("svn diff -x -b" to ignore space when differencing)
  • Project (gen2211) is inherited from AA_job by post-processing jobs
    • will stop during config_check if Project is empty
  • Prepare easy switching (submitting post-processing here or there)
  • Homogenize CCRTs libIGCM_sys
  • Bugfixes
  • Cosmetics

First steps and still a long way to go.

  • 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: 42.1 KB
RevLine 
[2]1#!/bin/ksh
2
3#**************************************************************
4# Author: Sebastien Denvil, Martial Mancip
[373]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
[2]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{
[544]17  IGCM_debug_PushStack "IGCM_comp_Initialize"
[2]18
19    # Debug Print :
[544]20  echo
21  IGCM_debug_Print 1 "IGCM_comp_Initialize"
22  echo
[2]23
[544]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."
[2]28
[544]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
[457]33
[544]34    # Read libIGCM compatibility version in ${compname}.card
35    card=${SUBMIT_DIR}/COMP/${compname}.card
36    IGCM_card_DefineVariableFromOption ${card} Compatibility libIGCM
[2]37
[544]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
[2]42
[544]43    # Manage component executable
44    IGCM_card_DefineArrayFromOption ${SUBMIT_DIR}/config.card Executable ${comp}
[2]45
[544]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
[2]52
[544]53    # Debug Print :
54    IGCM_debug_Print 2 "Initialize following component library"
[522]55
[544]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}"
[2]68
[544]69    # Debug Print
70    IGCM_debug_Print 3 "Initialize ${comp} output directory."
[2]71
[544]72    # Define ARCHIVED Dirs
73    eval R_OUT_${comp}=${R_SAVE}/${comp}
74    eval IGCM_sys_MkdirArchive \${R_OUT_${comp}}
[2]75
[544]76    eval R_OUT_${comp}_O=\${R_OUT_${comp}}/Output
77    eval IGCM_sys_MkdirArchive \${R_OUT_${comp}_O}
[2]78
[544]79    eval R_OUT_${comp}_R=\${R_OUT_${comp}}/Restart
80    eval IGCM_sys_MkdirArchive \${R_OUT_${comp}_R}
[2]81
[544]82    eval R_OUT_${comp}_D=\${R_OUT_${comp}}/Debug
83    eval IGCM_sys_MkdirArchive \${R_OUT_${comp}_D}
[2]84
[544]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
[149]144        #
[544]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
[149]192                fi
[544]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 ))
[149]209            done
[544]210          else
211            ListDimension[0]=""
212            TimeSeries=true
213            TimeSeries2D=false
214            TimeSeries3D=false
215            TimeSeriesChunck2D=false
216            TimeSeriesChunck3D=false
217          fi
[149]218        fi
[544]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
[2]228
[544]229  IGCM_debug_PopStack "IGCM_comp_Initialize"
[2]230}
231
232#=======================================================================
233function IGCM_comp_PrepareDeletedFiles
234{
[544]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
[2]242
[544]243  IGCM_debug_PopStack "IGCM_comp_PrepareDeletedFiles"
[2]244}
245
246#=======================================================================
247function IGCM_comp_GetInputInitialStateFiles
248{
[544]249  IGCM_debug_PushStack "IGCM_comp_GetInputInitialStateFiles"
[2]250
[544]251  # Debug Print :
252  echo
253  IGCM_debug_Print 1 "IGCM_comp_GetInputInitialStateFiles"
254  echo
[2]255
[544]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
[2]274          do_init="y"
[544]275        fi
276      fi
[2]277
[544]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
[2]282
[544]283        # Debug Print :
284        IGCM_debug_Print 3 "Initialisation files ${compname}"
[2]285
[544]286        card=${SUBMIT_DIR}/COMP/${compname}.card
[2]287
[544]288        IGCM_card_DefineArrayFromOption ${card} InitialStateFiles List
289        ListFilesName=${compname}_InitialStateFiles_List
[2]290
[544]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_Get ${file_in} ${file_out}
303            #IGCM_comp_PrepareDeletedFiles ${file_in} ${file_out}
[2]304
[544]305            (( i=i+2 ))
306          done
307        fi
308      fi
309    done
310  fi
311  IGCM_debug_PopStack "IGCM_comp_GetInputInitialStateFiles"
[2]312}
313
314#=======================================================================
[247]315# Definition of Smooth modulo function
316# usage :
317# IGCM_SmoothModulo StringModulo value
318#
319# StringModulo : A string of min max and modulo like definition of Scilab vectors.
320# [min]:[modulo:][max]
321# where :
322# [] value are optionnals;
323# empty min equal 1
324# empty max equal infinity
325# modulo not given or empty equal 1
326# empty string or just ':' equal always.
327#
328# value : the value to test with the definition
329#
330# return : true(1)/false(0)
331function IGCM_SmoothModulo
332{
[544]333  IGCM_debug_PushStack "IGCM_SmoothModulo"
334  typeset defVector ModValue
[247]335
[544]336  eval set +A defVector -- $( echo "${1}" | \
337    gawk -F ':' '{print ($1 == "" ? 1 : $1) " " (NF==3 ? ($2 == "" ? 1 : $2) : 1) " " (NF==3 ? ($3 == "" ? -1 : $3) : ($2 == "" ? -1 : $2))}' )
[247]338
[544]339  # Save Smooth Min and Max. Needed to call IGCM_sys_Get when appropriate
340  arr[1]=${defVector[0]}
341  arr[2]=${defVector[2]}
[412]342
[544]343  # Test limits :
344  # ${defVector[0]} <= ${2} <= ${defVector[2]}
345  #          or ${defVector[2]} == -1
346  if ( [ ${2} -ge ${defVector[0]} ] && ( [ ${2} -le ${defVector[2]} ] || [ ${defVector[2]} -lt 0 ] ) ) ; then
347    # Test modulo
348    ModValue=$( expr \( ${2} - ${defVector[0]} \) % ${defVector[1]} )
349    if [ ${ModValue} -eq 0 ] ;  then
350      arr[3]=true
351      echo ${arr[@]}
352      IGCM_debug_PopStack "IGCM_SmoothModulo"
353      return 1
[247]354    else
[544]355      arr[3]=false
356      echo ${arr[@]}
357      IGCM_debug_PopStack "IGCM_SmoothModulo"
358      return 0
[247]359    fi
[544]360  else
361    arr[3]=false
362    echo ${arr[@]}
363    IGCM_debug_PopStack "IGCM_SmoothModulo"
364    return 0
365  fi
[247]366}
367
368#=======================================================================
369function IGCM_comp_GetInputSmoothFiles
370{
[544]371  IGCM_debug_PushStack "IGCM_comp_GetInputSmoothFiles"
[247]372
[544]373  # Debug Print :
374  echo
375  IGCM_debug_Print 1 "IGCM_comp_GetInputSmoothFiles"
376  echo
[247]377
[544]378  typeset comp compname comptagname card ListFilesName FileName0 NbFiles j i i_ i__
379  typeset file_in_ file_in file_out_ file_out ret SmoothDef aux val
[247]380
[544]381  for comp in ${config_ListOfComponents[*]} ; do
382    # Define component
383    eval compname=\${config_ListOfComponents_${comp}[0]} > /dev/null 2>&1
384    eval comptagname=\${config_ListOfComponents_${comp}[1]} > /dev/null 2>&1
[247]385
[544]386    # Debug Print :
387    IGCM_debug_Print 3 "Smooth files ${compname}"
[247]388
[544]389    card=${SUBMIT_DIR}/COMP/${compname}.card
[247]390
[544]391    IGCM_card_DefineArrayFromOption ${card} SmoothFiles List
392    ListFilesName=${compname}_SmoothFiles_List
393    eval FileName0=\${${ListFilesName}[0]} > /dev/null 2>&1
[247]394
[544]395    if ( [ X${FileName0} != X${NULL_STR} ] && [ X${FileName0} != X"Section" ] ) ; then
396      eval NbFiles=\${#${ListFilesName}[@]} > /dev/null 2>&1
[247]397
[544]398      (( i=0 ))
399      until [ $i -ge $NbFiles ]; do
400        eval file_in_=\${${ListFilesName}[$i]} > /dev/null 2>&1
401        eval file_in=${file_in_}
402        (( i_ = i+1 ))
403        eval file_out_=\${${ListFilesName}[$i_]} > /dev/null 2>&1
404        eval file_out=${file_out_}
[247]405
[544]406        # define CumulPeriod definition for this file
407        (( i__ = i+2 ))
408        eval SmoothDef=\${${ListFilesName}[$i__]}
409        IGCM_debug_Print 3 "  ${file_in} ${SmoothDef}"
410        aux=$( IGCM_SmoothModulo ${SmoothDef} ${CumulPeriod} )
411        j=1
412        for val in ${aux} ; do
413          [ ${j} -eq 1 ] && SmoothMin=${val}
414          [ ${j} -eq 2 ] && SmoothMax=${val}
415          [ ${j} -eq 3 ] && ret=${val}
416          (( j=j+1 ))
417        done
418        [ ${SmoothMax} -eq -1 ] && SmoothMax=${CumulPeriod}
419        if ( [ X${ret} = Xtrue ] || ( [ ${Period} -eq 1 ] && [ ${CumulPeriod} -ge ${SmoothMin} ] && [ ${CumulPeriod} -le ${SmoothMax} ] ) ) ; then
420          #if ( [ X${ret} = Xtrue ] || [ ${Period} -eq 1 ] ) ; then
421          IGCM_sys_Get ${file_in} ${file_out}
422          #IGCM_comp_PrepareDeletedFiles ${file_in} ${file_out}
[247]423        fi
[544]424        (( i=i+3 ))
425      done
426    fi
427  done
428 
429  IGCM_debug_PopStack "IGCM_comp_GetInputSmoothFiles"
[247]430}
431
432#=======================================================================
[2]433function IGCM_comp_GetInputBoundaryFiles
434{
[544]435  IGCM_debug_PushStack "IGCM_comp_GetInputBoundaryFiles"
[2]436
[544]437  # Debug Print :
438  echo
439  IGCM_debug_Print 1 "IGCM_comp_GetInputBoundaryFiles"
440  echo
[2]441
[544]442  typeset comp compname comptagname card ListFilesName FileName0 NbFiles i i_
443  typeset file_in_ file_in file_out_ file_out
[2]444
[544]445  if [ ${Period} = 1 ]; then
446    ListFixBoundary=" "
447  fi
[2]448
[544]449  for comp in ${config_ListOfComponents[*]} ; do
[2]450
[544]451    # Define component
452    eval compname=\${config_ListOfComponents_${comp}[0]} > /dev/null 2>&1
453    eval comptagname=\${config_ListOfComponents_${comp}[1]} > /dev/null 2>&1
[2]454
[544]455    # Debug Print :
456    IGCM_debug_Print 3 "Boundary files ${compname}"
[2]457
[544]458    card=${SUBMIT_DIR}/COMP/${compname}.card
[2]459
[544]460    IGCM_card_DefineArrayFromOption ${card} BoundaryFiles List
461    ListFilesName=${compname}_BoundaryFiles_List
462    eval FileName0=\${${ListFilesName}[0]} > /dev/null 2>&1
[2]463
[544]464    if [ X${FileName0} != X${NULL_STR} ] ; then
465      eval NbFiles=\${#${ListFilesName}[@]} > /dev/null 2>&1
[2]466
[544]467      (( i=0 ))
468      until [ $i -ge $NbFiles ]; do
469        eval file_in_=\${${ListFilesName}[$i]} > /dev/null 2>&1
470        eval file_in=${file_in_}
471        (( i_ = i+1 ))
472        eval file_out_=\${${ListFilesName}[$i_]} > /dev/null 2>&1
473        eval file_out=${file_out_}
[2]474
[544]475        IGCM_sys_Get ${file_in} ${file_out}
476        IGCM_comp_PrepareDeletedFiles ${file_in} ${file_out}
[2]477
[544]478        (( i=i+2 ))
479      done
480    fi
[2]481
[544]482    # Get non deleted files
483    if [ ${Period} = 1 ]; then
[2]484
[544]485      IGCM_card_DefineArrayFromOption ${card} BoundaryFiles ListNonDel
486      ListFilesName=${compname}_BoundaryFiles_ListNonDel
487      eval FileName0=\${${ListFilesName}[0]} > /dev/null 2>&1
488     
489      if [ X${FileName0} != X${NULL_STR} ] ; then
490        eval NbFiles=\${#${ListFilesName}[@]} > /dev/null 2>&1
491       
492        (( i=0 ))
493        until [ $i -ge $NbFiles ]; do
494          eval file_in_=\${${ListFilesName}[$i]} > /dev/null 2>&1
495          eval file_in=${file_in_}
496          (( i_ = i+1 ))
497          eval file_out_=\${${ListFilesName}[$i_]} > /dev/null 2>&1
498          eval file_out=${file_out_}
[2]499
[544]500          IGCM_sys_Get ${file_in} ${file_out}
[2]501
[544]502          if [ X${file_out} != X. ] ; then
503            ListFixBoundary=${ListFixBoundary}" "${file_out}
504          else
505            ListFixBoundary=${ListFixBoundary}" "$( basename ${file_in} )
506          fi
[2]507
[544]508          (( i=i+2 ))
509        done
510      fi
511    fi
512  done
513 
514  IGCM_debug_PopStack "IGCM_comp_GetInputBoundaryFiles"
[2]515}
516
517#=======================================================================
518function IGCM_comp_DelFixeBoundaryFiles
519{
[544]520  IGCM_debug_PushStack "IGCM_comp_DelFixeBoundaryFiles"
[2]521
[544]522  # Debug Print :
523  echo
524  IGCM_debug_Print 1 "IGCM_comp_DelFixeBoundaryFiles"
525  echo
[2]526
[544]527  ls -l ${ListFixBoundary}
528  rm -f ${ListFixBoundary}
[2]529
[544]530  IGCM_debug_PopStack "IGCM_comp_DelFixeBoundaryFiles"
[2]531}
532
533#=======================================================================
534function IGCM_comp_GetInputParametersFiles
535{
[544]536  IGCM_debug_PushStack "IGCM_comp_GetInputParametersFiles"
[2]537
[544]538  # Debug Print :
539  echo
540  IGCM_debug_Print 1 "IGCM_comp_GetInputParametersFiles"
541  echo
[2]542
[544]543  typeset comp compname comptagname card ListFilesName FileName0 NbFiles i i_ file_in file_out
544  for comp in ${config_ListOfComponents[*]} ; do
545    # Define component
546    eval compname=\${config_ListOfComponents_${comp}[0]} > /dev/null 2>&1
547    eval comptagname=\${config_ListOfComponents_${comp}[1]} > /dev/null 2>&1
[2]548
[544]549    # Debug Print :
550    IGCM_debug_Print 3 "Parameters ${compname}"
[2]551
[544]552    card=${SUBMIT_DIR}/COMP/${compname}.card   
[2]553
[544]554    IGCM_card_DefineArrayFromOption ${card} ParametersFiles List
555    ListFilesName=${compname}_ParametersFiles_List
556    eval FileName0=\${${ListFilesName}[0]} > /dev/null 2>&1
[2]557
[544]558    if [ X${FileName0} != X${NULL_STR} ] ; then
559      eval NbFiles=\${#${ListFilesName}[@]} > /dev/null 2>&1
[2]560
[544]561      (( i=0 ))
562      until [ $i -ge $NbFiles ]; do
563        eval file_in_=\${${ListFilesName}[$i]} > /dev/null 2>&1
564        eval file_in=${file_in_}
565        (( i_ = i+1 ))
566        eval file_out_=\${${ListFilesName}[$i_]} > /dev/null 2>&1
567        eval file_out=${file_out_} 
[2]568
[544]569        IGCM_sys_Cp ${file_in} ${file_out} 
570        IGCM_comp_PrepareDeletedFiles ${file_in} ${file_out}
[2]571
[544]572        (( i=i+2 ))
573      done
574    fi
575  done
[2]576
[544]577  IGCM_debug_PopStack "IGCM_comp_GetInputParametersFiles"
[2]578}
579
580#=======================================================================
581function IGCM_comp_GetInputRestartFiles
582{
[544]583  IGCM_debug_PushStack "IGCM_comp_GetInputRestartFiles"
[2]584
[544]585  # Debug Print :
586  echo
587  IGCM_debug_Print 1 "IGCM_comp_GetInputRestartFiles"
588  echo
[2]589
[544]590  typeset Date_tmp Date_r Path_r do_start CompOldName Path_OUT Path_BUF Buffered
591  typeset comp compname comptagname card ListFilesName FileName0 NbFiles i i_
592  typeset file_in file_out file_in_ file_out_ file_in_Name
593  typeset -Z4 j4
[2]594
[544]595  for comp in ${config_ListOfComponents[*]} ; do
596    # Define component
597    eval compname=\${config_ListOfComponents_${comp}[0]} > /dev/null 2>&1
598    eval comptagname=\${config_ListOfComponents_${comp}[1]} > /dev/null 2>&1
599    #
600    card=${SUBMIT_DIR}/COMP/${compname}.card
601    #
602    IGCM_card_DefineArrayFromOption ${card} RestartFiles List
603    ListFilesName=${compname}_RestartFiles_List
604    eval FileName0=\${${ListFilesName}[0]} > /dev/null 2>&1
[2]605
[544]606    # Debug Print :
607    IGCM_debug_Print 3 "restart ${compname}"
[2]608
[544]609    if ( ${FirstInitialize} ) ; then
[2]610
[544]611      if [ "${config_Restarts_OverRule}" = "y" ] ; then
612        eval config_${comp}_Restart="y"
613        eval config_${comp}_RestartDate=${config_Restarts_RestartDate}
614        eval config_${comp}_RestartJobName=${config_Restarts_RestartJobName}
615        eval config_${comp}_RestartPath=${config_Restarts_RestartPath}
616        eval do_start=\${config_${comp}_Restart} > /dev/null 2>&1
617        eval CompOldName=${comp}
618      else
[2]619                # Read component Restarts parameters
[544]620        IGCM_card_DefineVariableFromOption ${SUBMIT_DIR}/config.card ${comp} Restart
621        eval do_start=\${config_${comp}_Restart} > /dev/null 2>&1
[2]622
[544]623        if [ "${do_start}" = "y" ] ; then
624          IGCM_card_DefineVariableFromOption ${SUBMIT_DIR}/config.card ${comp} RestartDate
625          IGCM_card_DefineVariableFromOption ${SUBMIT_DIR}/config.card ${comp} RestartJobName
626          IGCM_card_DefineVariableFromOption ${SUBMIT_DIR}/config.card ${comp} RestartPath
627        else
628          eval config_${comp}_RestartDate=-1
629          eval config_${comp}_RestartJobName=${NULL_STR}
630          eval config_${comp}_RestartPath=${NULL_STR}
631        fi
632        IGCM_card_DefineVariableFromOption ${SUBMIT_DIR}/config.card ${comp} OldName
633        eval CompOldName=\${config_${comp}_OldName}
634        if [ X${CompOldName} = X ] ; then
635          eval CompOldName=${comp}
636        fi
637      fi
[2]638
[544]639      if [ "${do_start}" = "y" ] ; then
[2]640
[544]641        if ( [ X${FileName0} != X${NULL_STR} ] && [ X${FileName0} != XNONE ] ) ; then
642          eval NbFiles=\${#${ListFilesName}[@]} > /dev/null 2>&1
[2]643
[544]644          (( i=1 ))
645          until [ $i -gt $NbFiles ]; do
646            eval file_in_=\${${ListFilesName}[$i]} > /dev/null 2>&1
647            eval file_in=${file_in_}
[2]648
[544]649            (( i_ = i+1 ))
650            eval file_out_=\${${ListFilesName}[$i_]} > /dev/null 2>&1
651            eval file_out=${file_out_}
652           
653            eval Date_tmp=\${config_${comp}_RestartDate}
654            Date_r=$( IGCM_date_ConvertFormatToGregorian ${Date_tmp} )
655            eval Path_r=\${config_${comp}_RestartPath}/\${config_${comp}_RestartJobName}/${CompOldName}/Restart
656            eval file_in_Name=\${config_${comp}_RestartJobName}_${Date_r}_${file_in}
[2]657
[544]658            generic_restart_file_name_in=$( basename ${file_in_Name} .nc )
659            generic_restart_file_name_out=$( basename ${file_out} .nc )
660           
661            eval Path_OUT=\${Path_r}/${generic_restart_file_name_in}
662            nb_restart_file=$(IGCM_sys_CountFileArchive ${Path_OUT}_????.nc)
[2]663
[544]664            if [ ${nb_restart_file} -gt 1 ] ; then
665              j=0
666              until [ $j -ge $nb_restart_file ]; do
667                j4=${j}
668                eval IGCM_sys_Get ${Path_r}/${generic_restart_file_name_in}_${j4}.nc ${generic_restart_file_name_out}_${j4}.nc
669                #IGCM_comp_PrepareDeletedFiles ${generic_restart_file_name_in}_${j4}.nc ${generic_restart_file_name_out}_${j4}.nc
670                #eval FileToBeDeleted[${#FileToBeDeleted[@]}]="${generic_restart_file_name_out}_${j4}.nc" > /dev/null 2>&1
671                (( j=j+1 ))
672              done
673            else
674              eval IGCM_sys_Get ${Path_r}/${file_in_Name} ${file_out} 
675              #IGCM_comp_PrepareDeletedFiles ${file_in} ${file_out}
[2]676            fi
[544]677           
678            (( i=i+3 ))
679          done
680        else
681          if [ X${FileName0} != XNONE ] ; then
682            IGCM_debug_Exit "IGCM_comp_GetInputRestartFiles : No file in list for ${compname}."
683          else
684            IGCM_debug_Print 1 "IGCM_comp_GetInputRestartFiles : NONE specified in Restart List ${compname}."
685          fi
686        fi
687      fi
688    elif [ ${Period} -eq 1 ] ; then
689      # if not FirstInitialize and first loop of this job
[2]690
[544]691      # Restore Restarts files
692      #-----------------------
693      if ( [ X${FileName0} != X${NULL_STR} ] && [ X${FileName0} != XNONE ] ) ; then
694        eval NbFiles=\${#${ListFilesName}[@]} > /dev/null 2>&1
[2]695
[544]696        (( i=1 ))
697        until [ $i -gt $NbFiles ]; do
698          eval file_in_=\${${ListFilesName}[$i]} > /dev/null 2>&1
699          eval file_in=${file_in_}
700          (( i_ = i+1 ))
701          eval file_out_=\${${ListFilesName}[$i_]} > /dev/null 2>&1
702          eval file_out=${file_out_}
703         
704          file_in_Name=${run_Configuration_OldPrefix}_${file_in}
[2]705
[544]706          generic_restart_file_name_in=$( basename ${file_in_Name} .nc )
707          generic_restart_file_name_out=$( basename ${file_out} .nc )
[2]708
[544]709          eval Path_BUF=\${R_BUF_${comp}_R}/${generic_restart_file_name_in}
710          eval Path_OUT=\${R_OUT_${comp}_R}/${generic_restart_file_name_in}
[67]711
[544]712          if [ -f ${Path_BUF}*.nc ] ; then
713            Buffered=true
714            nb_restart_file=$(IGCM_sys_CountFileBuffer ${Path_BUF}_????.nc)
715          else
716            Buffered=false
717            nb_restart_file=$(IGCM_sys_CountFileArchive ${Path_OUT}_????.nc)
718          fi
[41]719
[544]720          if [ ${nb_restart_file} -gt 1 ] ; then
721            j=0
722            until [ $j -ge $nb_restart_file ]; do
723              j4=${j}
724              if [ ${Buffered} ] ; then
725                IGCM_sys_GetBuffer ${Path_BUF}_${j4}.nc ${generic_restart_file_name_out}_${j4}.nc
726              else
727                IGCM_sys_Get ${Path_OUT}_${j4}.nc ${generic_restart_file_name_out}_${j4}.nc
728              fi
729              (( j=j+1 ))
730            done
731          else
732            if [ ${Buffered} ] ; then
733              eval IGCM_sys_GetBuffer \${R_BUF_${comp}_R}/${file_in_Name} ${file_out}
[2]734            else
[544]735              eval IGCM_sys_Get \${R_OUT_${comp}_R}/${file_in_Name} ${file_out}
[2]736            fi
[544]737          fi
738
739          (( i=i+3 ))
740        done
741      else
742        if [ X${FileName0} != XNONE ] ; then
743          IGCM_debug_Exit "IGCM_comp_GetInputRestartFiles : No file in list for ${compname}."
744        else
745          IGCM_debug_Print 1 "IGCM_comp_GetInputRestartFiles : NONE specified in Restart List ${compname}."
[2]746        fi
[544]747      fi
[420]748    fi
[544]749  done
[420]750
[544]751  NbFiles=$( ls * 2> /dev/null | wc -l )
752  if [ ${NbFiles} -gt 0 ] ; then
753    IGCM_sys_Chmod u+rw *
754  fi
755
756  IGCM_debug_PopStack "IGCM_comp_GetInputRestartFiles"
[2]757}
758
759#=======================================================================
[269]760function IGCM_comp_PeriodStart
761{
[544]762  IGCM_debug_PushStack "IGCM_comp_PeriodStart"
[269]763
[544]764  # Debug Print :
765  echo
766  IGCM_debug_Print 1 "IGCM_comp_PeriodStart"
767  echo
[269]768
[544]769  typeset ExeNameIn ExeNameOut
770  typeset comp compname comptagname
771  for comp in ${config_ListOfComponents[*]} ; do
772    # Define component
773    eval compname=\${config_ListOfComponents_${comp}[0]} > /dev/null 2>&1
774    eval comptagname=\${config_ListOfComponents_${comp}[1]} > /dev/null 2>&1
[269]775
[544]776    # Copy executable for this component
777    eval ExeNameIn=\${config_Executable_${comp}[0]}
778    eval ExeNameOut=\${config_Executable_${comp}[1]}
[269]779
[544]780    # Debug Print
781    IGCM_debug_Print 3 "PeriodStart ${compname} Driver Function (if any)."
782    # UPDATE component
783    ${comp}_PeriodStart 2> /dev/null
[269]784
[544]785  done
[269]786
[544]787  IGCM_debug_PopStack "IGCM_comp_PeriodStart"
[269]788}
789
790#=======================================================================
[2]791function IGCM_comp_Update
792{
[544]793  IGCM_debug_PushStack "IGCM_comp_Update"
[2]794
795    # Debug Print :
[544]796  echo
797  IGCM_debug_Print 1 "IGCM_comp_Update"
798  echo
[2]799
[544]800  typeset ExeNameIn ExeNameOut
801  typeset comp compname comptagname
802  for comp in ${config_ListOfComponents[*]} ; do
803    # Define component
804    eval compname=\${config_ListOfComponents_${comp}[0]} > /dev/null 2>&1
805    eval comptagname=\${config_ListOfComponents_${comp}[1]} > /dev/null 2>&1
[2]806
[544]807    # Copy executable for this component
808    eval ExeNameIn=\${config_Executable_${comp}[0]}
809    eval ExeNameOut=\${config_Executable_${comp}[1]}
[151]810
[544]811    # If missing executable then stop!
812    #if [ ! X${ExeNameIn} = X ] && [ ! -f ${R_EXE}/${ExeNameIn} ] ; then
813    #    IGCM_debug_Exit "IGCM_comp_Update missing executable ${ExeNameIn}"
814    #fi
[236]815
[544]816    if [ ${Period} -eq 1 ] && [ -f ${R_EXE}/${ExeNameIn} ] ; then
817      eval IGCM_sys_Cp ${R_EXE}/${ExeNameIn} ${ExeNameOut}
818      if [ -f ${RUN_DIR}/${ExeNameOut} ] ; then
819        eval IGCM_sys_Chmod +rx ${RUN_DIR}/${ExeNameOut}
820      fi
821    elif [ -f ${R_EXE}/${ExeNameIn} ] && [ ! -f ${RUN_DIR}/${ExeNameOut} ] ; then
822      eval IGCM_sys_Cp ${R_EXE}/${ExeNameIn} ${ExeNameOut}
823      if [ -f ${RUN_DIR}/${ExeNameOut} ] ; then
824        eval IGCM_sys_Chmod +rx ${RUN_DIR}/${ExeNameOut}
825      fi
826    fi
[2]827
[544]828    # Debug Print
829    IGCM_debug_Print 1 "Update ${compname} Parameter Files."
830    # UPDATE component
831    ${comp}_Update
[2]832
[544]833  done
[2]834
[544]835  IGCM_debug_PopStack "IGCM_comp_Update"
[2]836}
837
838#=======================================================================
839function IGCM_comp_Finalize
840{
[544]841  IGCM_debug_PushStack "IGCM_comp_Finalize"
[2]842
[544]843  # Debug Print :
844  echo
845  IGCM_debug_Print 1 "IGCM_comp_Finalize"
846  echo
[2]847
[544]848  typeset ListTextName TextName0
849  typeset comp compname comptagname card ListFilesName FileName0 NbFiles SaveOnArchive
850  typeset i i_ file_in file_in_ file_out file_out_ file_outin file_outin_ generic_file_name nb_rebuild_file
851  typeset -Z4 j4
852  typeset list_file nlist_file
853  typeset compactoutputs
[429]854
[544]855  compactoutputs=false
856  if [ X${JobType} != XRUN ] ; then
857    compactoutputs=true
858  elif [ X${config_UserChoices_CompactText} != Xn ] ; then
859    compactoutputs=true
860  fi
[433]861
[544]862  for comp in ${config_ListOfComponents[*]} ; do
863    # Define component
864    eval compname=\${config_ListOfComponents_${comp}[0]} > /dev/null 2>&1
865    eval comptagname=\${config_ListOfComponents_${comp}[1]} > /dev/null 2>&1
[2]866
[544]867    # Debug Print
868    IGCM_debug_Print 1 "Finalize ${comp} : ${compname} component."
869    # FINALIZE component
870    ${comp}_Finalize
[2]871
[544]872    card=${SUBMIT_DIR}/COMP/${compname}.card   
[2]873
[544]874    # Save Restarts files
875    #--------------------
876    IGCM_debug_Print 2 "Save Restart files for ${comp} : ${compname} component."
877    IGCM_card_DefineArrayFromOption ${card} RestartFiles List
878    ListFilesName=${compname}_RestartFiles_List
879    eval FileName0=\${${ListFilesName}[0]} > /dev/null 2>&1
880   
881    if ( [ X${FileName0} != X${NULL_STR} ] && [ X${FileName0} != XNONE ] ) ; then
882      eval NbFiles=\${#${ListFilesName}[@]} > /dev/null 2>&1
883     
884      (( i=0 ))
885      until [ $i -ge $NbFiles ]; do
886        eval file_in_=\${${ListFilesName}[$i]} > /dev/null 2>&1
887        eval file_in=${file_in_}
[2]888
[544]889        (( i_ = i+1 ))
890        eval file_out_=\${${ListFilesName}[$i_]} > /dev/null 2>&1
891        eval file_out=${file_out_}
[151]892
[544]893        (( i_ = i+2 ))
894        eval file_outin_=\${${ListFilesName}[$i_]} > /dev/null 2>&1
895        eval file_outin=${file_outin_}
[151]896
[544]897        generic_restart_file_name_in=$(    basename ${file_in} .nc )
898        generic_restart_file_name_out=$(   basename ${config_UserChoices_JobName}_${PeriodDateEnd}_${file_out} .nc )
899        generic_restart_file_name_outin=$( basename ${file_outin} .nc )
900       
901        nb_restart_file=$( ls ${generic_restart_file_name_in}_????.nc 2>/dev/null | wc -l ) 
902        if [ ${nb_restart_file} -gt 1 ] ; then
903          j=0
904          until [ $j -ge $nb_restart_file ]; do
905            j4=${j}
906            #eval IGCM_sys_Put_Rest ${generic_restart_file_name_in}_${j4}.nc \${R_OUT_${comp}_R}/${generic_restart_file_name_out}_${j4}.nc
907            eval IGCM_sys_PutBuffer_Rest ${generic_restart_file_name_in}_${j4}.nc \${R_BUF_${comp}_R}/${generic_restart_file_name_out}_${j4}.nc
908            if [ ! ${file_in} = ${file_outin} ] ; then
909              if ( ${ExitFlag} ) ; then
910                echo "IGCM_sys_Mv ${generic_restart_file_name_in}_${j4}.nc ${generic_restart_file_name_outin}_${j4}.nc not executed."
911              else
912                IGCM_sys_Mv ${generic_restart_file_name_in}_${j4}.nc ${generic_restart_file_name_outin}_${j4}.nc
913              fi
914            fi
915            (( j=j+1 ))
916          done
[2]917        else
[544]918          #eval IGCM_sys_Put_Rest ${file_in} \${R_OUT_${comp}_R}/${config_UserChoices_JobName}_${PeriodDateEnd}_${file_out}
919          eval IGCM_sys_PutBuffer_Rest ${file_in} \${R_BUF_${comp}_R}/${config_UserChoices_JobName}_${PeriodDateEnd}_${file_out}
920          if [ ! ${file_in} = ${file_outin} ] ; then
921            if ( ${ExitFlag} ) ; then
922              echo "IGCM_sys_Mv ${file_in} ${file_outin} not executed."
[2]923            else
[544]924              IGCM_sys_Mv ${file_in} ${file_outin}
[2]925            fi
[544]926          fi
[2]927        fi
928
[544]929        (( i=i+3 ))
930      done
931    else
932      if [ X${FileName0} != XNONE ] ; then
933        IGCM_debug_Exit "IGCM_comp_Finalize : No file in restart list for ${compname}."
934      else
935        IGCM_debug_Print 1 "IGCM_comp_Finalize : NONE specified in Restart List ${compname}."
936      fi
937    fi
[2]938
[544]939    # Save Output files
940    #------------------
941    IGCM_debug_Print 2 "Save Output files for ${comp} : ${compname} component."
942    IGCM_card_DefineArrayFromOption ${card} OutputFiles List
943    ListFilesName=${compname}_OutputFiles_List
944    eval FileName0=\${${ListFilesName}[0]} > /dev/null 2>&1
[2]945
[544]946    if [ X${FileName0} != X${NULL_STR} ] ; then
947      eval NbFiles=\${#${ListFilesName}[@]} > /dev/null 2>&1
[149]948
[544]949      (( i=0 ))
950      until [ $i -ge $NbFiles ]; do
951        SaveOnArchive=true
952        eval file_in_=\${${ListFilesName}[$i]} > /dev/null 2>&1
953        eval file_in=${file_in_}
954        (( i_ = i+1 ))
955        eval file_out_=\${${ListFilesName}[$i_]} > /dev/null 2>&1
956        eval file_out=${file_out_}
957        (( i_ = i+2 ))
958        eval flag_post=\${${ListFilesName}[$i_]} > /dev/null 2>&1
959        #
960        generic_file_name=$( basename ${file_in} .nc )
961        nb_rebuild_file=$( ls | grep "^${generic_file_name}_[0-9]*.nc" | wc -l )
962        #
963        if ( [ ${nb_rebuild_file} -eq 1 ] && [ -f ${generic_file_name}_0000.nc ] ) ; then
964          IGCM_debug_Print 2 "Parallelism with 1 process. Rebuilding ${file_in} not needed"
965          IGCM_sys_Mv ${generic_file_name}_0000.nc ${file_in}
966        elif [ ${nb_rebuild_file} -gt 1 ] ; then
967          IGCM_debug_Print 2 "Parallelism detected rebuilding ${file_in} is needed"
968          if ( [ X${config_Post_RebuildFrequency} = X${NULL_STR} ] || [ X${config_Post_RebuildFrequency} = XNONE ] ) ; then
969            IGCM_debug_Print 2 "Rebuilding ${file_in} online"
970            IGCM_sys_rebuild ${file_in} ${generic_file_name}_*.nc
971          else
972            IGCM_debug_Print 2 "Preparing offline rebuild for ${file_in}"
973            [ ! -d ${RUN_DIR}/REBUILD_${PeriodDateBegin} ] && IGCM_sys_Mkdir ${RUN_DIR}/REBUILD_${PeriodDateBegin}
974            IGCM_sys_Mv ${generic_file_name}_????.nc ${RUN_DIR}/REBUILD_${PeriodDateBegin}
975
976            # Prepare headers for the shell dedicated to offline rebuild
977            if [ ! -f ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh ] ; then
978              if [ $DRYRUN -le 1 ]; then
979                echo "#!/bin/ksh                                        " >  ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
980                echo "function IGCM_FlushRebuild                        " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
981                echo "{                                                 " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
982                echo "IGCM_debug_PushStack \"IGCM_FlushRebuild\"        " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
983                echo "echo                                              " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
984                echo "IGCM_debug_Print 1 \"IGCM_FlushRebuild\"          " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
985                echo "echo                                              " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
986                echo "export R_SAVE=${R_SAVE}                           " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
987                echo "export config_UserChoices_JobName=${config_UserChoices_JobName} " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
988              fi
989            fi
990            # Prepare the shell dedicated to offline rebuild
991            if [ $DRYRUN -le 1 ]; then
992              echo "IGCM_sys_rebuild ${file_in} ${generic_file_name}_*.nc" >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
993              echo "IGCM_debug_Verif_Exit_Post                           " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
994            fi
995            #
996            # Load Patch we need to apply and apply
997            if [ $DRYRUN -le 1 ]; then
998              if [ X$( eval echo \${${compname}_${flag_post}_Patches[0]} ) !=  X${NULL_STR} ]; then
999                for Patch in $( eval echo \${${compname}_${flag_post}_Patches[*]} ); do
1000                  echo ". ${libIGCM_POST}/libIGCM_post/IGCM_${Patch}.ksh" >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1001                  echo "IGCM_${Patch} ${file_in}                        " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1002                  echo "IGCM_debug_Verif_Exit_Post                      " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1003                done
1004              fi
1005            fi
1006            #
1007            if [ $DRYRUN -le 1 ]; then
1008              echo "IGCM_sys_Put_Out ${file_in} ${file_out}             " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1009              echo "IGCM_debug_Verif_Exit_Post                          " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1010              echo "IGCM_sys_Rm ${generic_file_name}_*.nc               " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1011            fi
1012            SaveOnArchive=false
1013          fi
1014        fi
1015        #
1016        if [ ${SaveOnArchive} = true ] ; then
1017          #
1018          # If we need to apply a patch we use TMP DIRECTORY before ARCHIVING if asynchronous rebuild is on
1019          #
1020          thereisapatch=$( eval echo \${${compname}_${flag_post}_Patches[0]} )
1021         
1022          if ( [ ! X${thereisapatch} = X${NULL_STR} ] && [ ! X${config_Post_RebuildFrequency} = X ] && [ ! X${config_Post_RebuildFrequency} = XNONE ] ) ; then
1023            if [ -f ${file_in} ] ; then
1024              [ ! -d ${RUN_DIR}/REBUILD_${PeriodDateBegin} ] && IGCM_sys_Mkdir ${RUN_DIR}/REBUILD_${PeriodDateBegin}
1025
1026              IGCM_sys_Mv ${file_in} ${RUN_DIR}/REBUILD_${PeriodDateBegin}
1027              eval FileToBeDeleted[${#FileToBeDeleted[@]}]=REBUILD_${PeriodDateBegin}/${file_in} > /dev/null 2>&1
1028              #
1029              if [ $DRYRUN -le 1 ]; then
1030                if [ ! -f ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh ] ; then
1031                  echo "#!/bin/ksh                                      " >  ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1032                  echo "function IGCM_FlushRebuild                      " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1033                  echo "{                                               " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1034                  echo "IGCM_debug_PushStack \"IGCM_FlushRebuild\"      " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1035                  echo "echo                                            " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1036                  echo "IGCM_debug_Print 1 \"IGCM_FlushRebuild\"        " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1037                  echo "echo                                            " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1038                  echo "export R_SAVE=${R_SAVE}                         " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1039                  echo "export config_UserChoices_JobName=${config_UserChoices_JobName} " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
[2]1040                fi
[544]1041                #
1042                for Patch in $( eval echo \${${compname}_${flag_post}_Patches[*]} ); do
1043                  echo ". ${libIGCM_POST}/libIGCM_post/IGCM_${Patch}.ksh" >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1044                  echo "IGCM_${Patch} ${file_in}                        " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1045                  echo "IGCM_debug_Verif_Exit_Post                      " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1046                done
[22]1047                #
[544]1048                echo "IGCM_sys_Put_Out ${file_in} ${file_out}           " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1049                echo "IGCM_debug_Verif_Exit_Post                        " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1050                #
1051              fi
1052            fi
1053          else
1054            [ ! -d ${RUN_DIR}/REBUILD_${PeriodDateBegin} ] && IGCM_sys_Mkdir ${RUN_DIR}/REBUILD_${PeriodDateBegin}
1055            if [ ! -f ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh ] ; then
1056              echo "#!/bin/ksh                                          " >  ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1057              echo "function IGCM_FlushRebuild                          " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1058              echo "{                                                   " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1059              echo "IGCM_debug_PushStack \"IGCM_FlushRebuild\"          " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1060              echo "echo                                                " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1061              echo "IGCM_debug_Print 1 \"IGCM_FlushRebuild\"            " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1062              echo "echo                                                " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1063              echo "export R_SAVE=${R_SAVE}                             " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1064              echo "export config_UserChoices_JobName=${config_UserChoices_JobName} " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1065            fi
[307]1066
[544]1067            IGCM_sys_Put_Out ${file_in} ${file_out}
1068            eval FileToBeDeleted[${#FileToBeDeleted[@]}]="${file_in}" > /dev/null 2>&1
1069            if [ ${nb_rebuild_file} -gt 1 ] ; then
1070              for DelFile in $( ls | grep "${generic_file_name}[_0-9]*.nc" ) ; do
1071                eval FileToBeDeleted[${#FileToBeDeleted[@]}]=${DelFile} > /dev/null 2>&1
1072              done
1073            fi
1074          fi
[2]1075        fi
[544]1076        (( i=i+3 ))
1077      done
1078    fi
[2]1079
[544]1080    # Save Output Text files of models
1081    #---------------------------------
1082    IGCM_debug_Print 2 "Save Output Text files for ${comp} : ${compname} component."
1083    IGCM_card_DefineArrayFromOption ${card} OutputText List
1084    ListTextName=${compname}_OutputText_List
1085   
1086    eval TextName0=\${${ListTextName}[0]} > /dev/null 2>&1
1087    if [ X${TextName0} != X${NULL_STR} ] ; then
1088      eval NbFiles=\${#${ListTextName}[@]} > /dev/null 2>&1
[2]1089
[544]1090      (( i=0 ))
1091      until [ $i -eq $NbFiles ]; do
1092        eval file_in=\${${ListTextName}[$i]} > /dev/null 2>&1
1093        eval file_out=${PREFIX}_${file_in}
[2]1094
[544]1095        (( i=i+1 ))
[429]1096
[544]1097        unset list_file
1098        #set +A list_file -- $( ls ${file_in}* | sort 2>/dev/null )
1099        # result for a a1 a10 a2 with file_in=a a a1 a2 a10
1100        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 )
1101        nlist_file=${#list_file[@]}
1102          if [ ${nlist_file} -gt 1 ] ; then
1103            if ( ${compactoutputs} ) ; then
1104              IGCM_debug_Print 2 "Parallelism of Text Output with ${nlist_file} files."
1105              IGCM_debug_Print 2 "Compact files in ${file_out} : " ${list_file[*]}
1106              echo ${list_file[*]} > ${file_out}
1107              echo "" >> ${file_out}
1108             
1109              (( i_ = 0 ))
1110              for file in ${list_file[@]}
1111              do
1112                echo "_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ " >> ${file_out}
1113                echo "| " ${i_} " " ${file} >> ${file_out}
1114                echo "- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - " >> ${file_out}
1115                cat ${file} | sed "s/\(.*\)/${i_}\1/" ${file} >> ${file_out}
1116                echo "" >> ${file_out}
1117                eval FileToBeDeleted[${#FileToBeDeleted[@]}]="${file}" > /dev/null 2>&1
1118                    (( i_ = i_ + 1 ))
1119              done
1120              #eval IGCM_sys_Put_Out ${file_out} \${R_OUT_${comp}_D}/${file_out}
1121              eval IGCM_sys_PutBuffer_Out ${file_out} \${R_BUF_${comp}_D}/${file_out}
1122              eval FileToBeDeleted[${#FileToBeDeleted[@]}]="${file_out}" > /dev/null 2>&1
[433]1123
[544]1124              if ( ${ExecutionFail} ) ; then
1125                IGCM_sys_Cp ${file_out} ${SUBMIT_DIR}/Debug
1126              fi
1127            else
1128              for file in ${list_file[@]}
1129              do
1130                #eval IGCM_sys_Put_Out ${file} \${R_OUT_${comp}_D}/${PREFIX}_${file}
1131                eval IGCM_sys_PutBuffer_Out ${file} \${R_BUF_${comp}_D}/${PREFIX}_${file}
1132                eval FileToBeDeleted[${#FileToBeDeleted[@]}]="${file}" > /dev/null 2>&1
[433]1133
[544]1134                if ( ${ExecutionFail} ) ; then
1135                  IGCM_sys_Cp ${file} ${SUBMIT_DIR}/Debug/${PREFIX}_${file}
[2]1136                fi
[544]1137              done
1138            fi
1139          else
1140            if ( [ -f ${file_in}_0000 ] || [ -f ${file_in}0 ] ) ; then
1141              eval IGCM_sys_Mv ${file_in}* ${file_in}
1142            fi
1143            #eval IGCM_sys_Put_Out ${file_in} \${R_OUT_${comp}_D}/${file_out}
1144            eval IGCM_sys_PutBuffer_Out ${file_in} \${R_BUF_${comp}_D}/${file_out}
1145            eval FileToBeDeleted[${#FileToBeDeleted[@]}]="${file_in}" > /dev/null 2>&1
[2]1146
[544]1147            if ( ${ExecutionFail} ) ; then
1148              IGCM_sys_Cp ${file_in} ${SUBMIT_DIR}/Debug/${file_out}
1149            fi
1150          fi
1151      done
1152    fi
1153    echo
1154  done
1155  IGCM_debug_PopStack "IGCM_comp_Finalize"
[2]1156}
Note: See TracBrowser for help on using the repository browser.