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

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

Take into account [599] change from trunk.

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