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

Last change on this file since 239 was 239, checked in by sdipsl, 14 years ago
  • Hopefully the last step towards backward compatibilty
  • 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 Date Author Revision
File size: 31.2 KB
Line 
1#!/bin/ksh
2
3#**************************************************************
4# Author: Sebastien Denvil, Martial Mancip
5# Contact: Sebastien.Denvil@ipsl.jussieu.fr Martial.Mancip@ipsl.jussieu.fr
6# $Date$
7# $Author$
8# $Revision$
9# IPSL (2006)
10#  This software is governed by the CeCILL licence see libIGCM/libIGCM_CeCILL.LIC
11# History:
12# Modification:
13#
14#**************************************************************
15
16#========================================================================
17function IGCM_comp_Initialize
18{
19    IGCM_debug_PushStack "IGCM_comp_Initialize"
20
21    # Debug Print :
22    echo
23    IGCM_debug_Print 1 "IGCM_comp_Initialize :"
24    echo
25
26    typeset comp compname comptagname CompatibilityTag auxprint card_UserChoices first_option i j
27    for comp in ${config_ListOfComponents[*]} ; do
28        # Debug Print
29        IGCM_debug_Print 1 ${comp}
30        # Define component
31        IGCM_card_DefineArrayFromOption ${SUBMIT_DIR}/config.card ListOfComponents ${comp}
32        eval compname=\${config_ListOfComponents_${comp}[0]} > /dev/null 2>&1
33        eval comptagname=\${config_ListOfComponents_${comp}[1]} > /dev/null 2>&1
34
35        # Read libIGCM compatibility version in ${compname}.card
36        card=${SUBMIT_DIR}/COMP/${compname}.card
37        IGCM_card_DefineVariableFromOption ${card} Compatibility libIGCM
38        eval CompatibilityTag=\${${compname}_Compatibility_libIGCM} > /dev/null 2>&1   
39
40        if [ ! "${CompatibilityTag}" = "${libIGCM_CurrentTag}" ] ; then
41            IGCM_debug_Exit "${compname}.card is not compatible with libIGCM version ${libIGCM_CurrentTag} see libIGCM FAQ http://wiki.ipsl.jussieu.fr/wiki_ipsl/IGCMG/libIGCM/DocUtilisateur/FAQ ."
42        fi
43
44        # Manage component executable
45        IGCM_card_DefineArrayFromOption ${SUBMIT_DIR}/config.card Executable ${comp}
46
47        # Read component Write Frequency in config.card
48        IGCM_card_DefineVariableFromOption ${SUBMIT_DIR}/config.card ${comp} WriteFrequency
49        # Debug Print :
50        eval auxprint=\${config_${comp}_WriteFrequency}
51        IGCM_debug_Print 1 "Write frequency for ${compname} : ${auxprint} "
52        #2> /dev/null
53
54        # Debug Print :
55        IGCM_debug_Print 1 "Initialize following component library :"
56        IGCM_debug_Print 1 ${SUBMIT_DIR}/COMP/${compname}.driver
57        IGCM_debug_Print 3 "With tag : ${comptagname}"
58        # Source component library
59        . ${SUBMIT_DIR}/COMP/${compname}.driver
60
61        # Debug Print
62        IGCM_debug_Print 3 "Initialize ${comp} output directory."
63        # Define Dirs   
64        eval R_OUT_${comp}=${R_SAVE}/${comp}
65        eval IGCM_sys_MkdirArchive \${R_OUT_${comp}}
66
67        eval R_OUT_${comp}_O=\${R_OUT_${comp}}/Output
68        eval IGCM_sys_MkdirArchive \${R_OUT_${comp}_O}
69
70        eval R_OUT_${comp}_R=\${R_OUT_${comp}}/Restart
71        eval IGCM_sys_MkdirArchive \${R_OUT_${comp}_R}
72
73        eval R_OUT_${comp}_D=\${R_OUT_${comp}}/Debug
74        eval IGCM_sys_MkdirArchive \${R_OUT_${comp}_D}
75
76        eval R_OUT_${comp}_O_I=\${R_OUT_${comp}_O}/INS
77        eval R_OUT_${comp}_O_H=\${R_OUT_${comp}_O}/HF
78        eval R_OUT_${comp}_O_D=\${R_OUT_${comp}_O}/DA
79        eval R_OUT_${comp}_O_M=\${R_OUT_${comp}_O}/MO
80        eval R_OUT_${comp}_O_Y=\${R_OUT_${comp}_O}/YE
81
82        # Read UserChoices section of component card
83        IGCM_debug_Print 1 "DefineArrayFromSection : ${compname}_UserChoices ${card}"
84        IGCM_card_DefineArrayFromSection ${card} UserChoices
85        eval first_option=\${${compname}_UserChoices[0]} > /dev/null 2>&1
86        if [ X${first_option} != X"Error:" ] ; then
87            eval IGCM_debug_Print 2 "${compname}_UserChoices_Options:" \${${compname}_UserChoices[*]}
88            if [ X${card_UserChoices[0]} != X ] ; then
89                unset card_UserChoices
90            fi
91            eval set +A card_UserChoices -- \${${compname}_UserChoices[*]} > /dev/null 2>&1
92            typeset option
93            for option in ${card_UserChoices[*]} ; do
94                IGCM_card_DefineVariableFromOption ${card} UserChoices ${option}
95                eval IGCM_debug_Print 3 "${compname}_UserChoices_values: ${option} \${card_UserChoices_${option}}"
96            done
97        fi
98
99        # Read and Build Output File stuff
100        IGCM_debug_Print 1 "DefineArrayFromOption  : ${compname}_OutputFiles ${card}"
101        IGCM_card_DefineArrayFromOption ${card} OutputFiles List
102        ListFilesName=${compname}_OutputFiles_List
103        eval FileName0=\${${ListFilesName}[0]} > /dev/null 2>&1
104        #
105        if [ X${FileName0} != X${NULL_STR} ] ; then
106            #
107            #IGCM_debug_Print 1 "Component      : ${compname}"
108            #
109            # INITIALISATION
110            #
111            eval NbFiles=\${#${ListFilesName}[@]} > /dev/null 2>&1
112            i=2
113            #
114            until [ $i -ge $NbFiles ]; do
115                #
116                eval flag_post=\${${ListFilesName}[$i]} > /dev/null 2>&1
117                #
118                if [ X${flag_post} != XNONE ] ; then
119                    #
120                    # First of all
121                    #
122                    IGCM_card_DefineArrayFromSection ${card} ${flag_post}
123                    #
124                    # Seasonal case : If option Seasonal is not found (old cards) put SEASONAL ON by default
125                    #
126                    # variable option allready typeset above
127                    for option in $( eval echo \${${compname}_${flag_post}[*]} ) ; do
128                        if [ ${option} = Seasonal ] ; then
129                            FoundSeasonal=true
130                            IGCM_card_DefineVariableFromOption ${card} ${flag_post} Seasonal
131                        fi
132                    done
133                    #
134                    if [ ! X${FoundSeasonal} = Xtrue ] ; then
135                        eval ${compname}_${flag_post}_Seasonal=ON
136                    fi
137                    #
138                    if [ $( eval echo \${${compname}_${flag_post}_Seasonal} ) = ON ] ; then
139                        Seasonal=true
140                    fi
141                   
142                    # Dimension = vide si vieille card.
143                    IGCM_card_DefineArrayFromOption ${card} ${flag_post} TimeSeriesVars
144                    IGCM_card_DefineArrayFromOption ${card} ${flag_post} Patches
145                    if [ "$( eval echo \${${compname}_${flag_post}_TimeSeriesVars[*]} )" = "Option not found ${flag_post}" ] ; then
146                        # New TimeSeriesVar description, with 2D, 3D and associate ChunckJob.
147                        ListDimension[0]=2D
148                        ListDimension[1]=3D
149                        TimeSeries=false
150                        iLoop=${#ListDimension[*]}
151                        j=0
152                        until [ $j -ge ${iLoop} ]; do
153                            Dimension=${ListDimension[${j}]}
154                            IGCM_card_DefineArrayFromOption ${card} ${flag_post} TimeSeriesVars${Dimension}
155                            IGCM_card_DefineVariableFromOption ${card} ${flag_post} ChunckJob${Dimension}
156                            #
157                            # Time series WITHOUT chunk
158                            #
159                            if [ ! $( eval echo \${${compname}_${flag_post}_TimeSeriesVars${Dimension}} ) = ${NULL_STR} ] ; then
160                                if [ $( eval echo \${${compname}_${flag_post}_ChunckJob${Dimension}} ) = NONE ] ; then
161                                    IGCM_debug_Print 3 "${Dimension} time series activated for ${flag_post} according to ${card}"
162                                    eval TimeSeries${Dimension}=true
163                                fi
164                            fi
165                            #
166                            # Time series WITH chunk
167                            #
168                            if [ ! $( eval echo \${${compname}_${flag_post}_TimeSeriesVars${Dimension}} ) = ${NULL_STR} ] ; then
169                                chunck_size=$( eval echo \${${compname}_${flag_post}_ChunckJob${Dimension}} )
170                                if [ ! ${chunck_size} = NONE ] &&  [ ! ${chunck_size} = OFF ] ; then
171                                    IGCM_debug_Print 3 "${Dimension} time series activated with chunck for ${flag_post} according to ${card}"
172                                    eval TimeSeriesChunck${Dimension}=true
173                                    eval set +A CHUNCK${Dimension}_COMP \${CHUNCK${Dimension}_COMP[*]} ${comp}
174                                    eval set +A CHUNCK${Dimension}_FLAG \${CHUNCK${Dimension}_FLAG[*]} ${i}
175                                    eval set +A CHUNCK${Dimension}_SIZE \${CHUNCK${Dimension}_SIZE[*]} ${chunck_size}
176                                fi
177                            fi
178                            (( j=j+1 ))
179                        done
180                    else
181                        ListDimension[0]=""
182                        TimeSeries=true
183                        TimeSeries2D=false
184                        TimeSeries3D=false
185                        TimeSeriesChunck2D=false
186                        TimeSeriesChunck3D=false
187                    fi
188                fi
189                (( i=i+3 ))
190            done
191        fi
192        # Debug Print
193        IGCM_debug_Print 3 "Initialize ${compname} with driver."
194        # INIT component
195        ${comp}_Initialize
196        echo
197    done
198    echo "-----"
199    echo
200    IGCM_debug_Print 1 "DefineArrayFromOption  : ListOfComponents"
201    IGCM_debug_PrintVariables 3 config_ListOfComponents
202
203    IGCM_debug_PopStack "IGCM_comp_Initialize"
204}
205
206#=======================================================================
207function IGCM_comp_PrepareDeletedFiles
208{
209    IGCM_debug_PushStack "IGCM_comp_PrepareDeletedFiles" $@
210   
211    if [ X${2} != X. ] ; then
212        eval FileToBeDeleted[${#FileToBeDeleted[@]}]=$( basename ${2} ) > /dev/null 2>&1
213    else
214        eval FileToBeDeleted[${#FileToBeDeleted[@]}]=$( basename ${1} ) > /dev/null 2>&1
215    fi
216
217    IGCM_debug_PopStack "IGCM_comp_PrepareDeletedFiles"
218}
219
220#=======================================================================
221function IGCM_comp_GetInputInitialStateFiles
222{
223    IGCM_debug_PushStack "IGCM_comp_GetInputInitialStateFiles"
224
225    # Debug Print :
226    echo
227    IGCM_debug_Print 1 "IGCM_comp_GetInputInitialStateFiles :"
228    echo
229
230    # Only the first time step need InitialStateFiles
231    # otherwise it's BoundaryConditions
232    if ( ${FirstInitialize} ) ; then
233      typeset comp compname comptagname card ListFilesName FileName0 NbFiles i i_
234      typeset file_in_ file_in file_out_ file_out do_init
235      for comp in ${config_ListOfComponents[*]} ; do
236          # Initialize
237          do_init="y"
238          # Do we need to bring initial state file for this component
239          if [ "${config_Restarts_OverRule}" = "y" ] ; then
240              eval do_init="n"
241          else
242              # Read component Restarts parameters
243              IGCM_card_DefineVariableFromOption ${SUBMIT_DIR}/config.card ${comp} Restart
244              eval do_start=\${config_${comp}_Restart} > /dev/null 2>&1
245              if [ "${do_start}" = "y" ] ; then
246                    do_init="n"
247              else
248                    do_init="y"
249              fi
250          fi
251
252          if [ "${do_init}" = "y" ] ; then
253              # Define component
254              eval compname=\${config_ListOfComponents_${comp}[0]} > /dev/null 2>&1
255              eval comptagname=\${config_ListOfComponents_${comp}[1]} > /dev/null 2>&1
256
257              # Debug Print :
258              IGCM_debug_Print 3 "Initialisation files ${compname}"
259
260              card=${SUBMIT_DIR}/COMP/${compname}.card
261
262              IGCM_card_DefineArrayFromOption ${card} InitialStateFiles List
263              ListFilesName=${compname}_InitialStateFiles_List
264
265              eval FileName0=\${${ListFilesName}[0]} > /dev/null 2>&1
266              if [ X${FileName0} != X${NULL_STR} ] ; then
267                  eval NbFiles=\${#${ListFilesName}[@]} > /dev/null 2>&1
268
269                  (( i=0 ))
270                  until [ $i -ge $NbFiles ]; do
271                      eval file_in_=\${${ListFilesName}[$i]} > /dev/null 2>&1
272                      eval file_in=${file_in_}
273                      (( i_ = i+1 ))
274                      eval file_out_=\${${ListFilesName}[$i_]} > /dev/null 2>&1
275                      eval file_out=${file_out_}
276                     
277                      IGCM_sys_Get ${file_in} ${file_out}
278                      #IGCM_comp_PrepareDeletedFiles ${file_in} ${file_out}
279
280                      (( i=i+2 ))
281                  done
282              fi
283          fi
284      done
285    fi
286    IGCM_debug_PopStack "IGCM_comp_GetInputInitialStateFiles"
287}
288
289#=======================================================================
290function IGCM_comp_GetInputBoundaryFiles
291{
292    IGCM_debug_PushStack "IGCM_comp_GetInputBoundaryFiles"
293
294    # Debug Print :
295    echo
296    IGCM_debug_Print 1 "IGCM_comp_GetInputBoundaryFiles :"
297    echo
298
299    typeset comp compname comptagname card ListFilesName FileName0 NbFiles i i_
300    typeset file_in_ file_in file_out_ file_out
301
302    if [ ${Period} = 1 ]; then
303        ListFixBoundary=" "
304    fi
305
306    for comp in ${config_ListOfComponents[*]} ; do
307
308        echo "-----"
309        # Define component
310        eval compname=\${config_ListOfComponents_${comp}[0]} > /dev/null 2>&1
311        eval comptagname=\${config_ListOfComponents_${comp}[1]} > /dev/null 2>&1
312
313        # Debug Print :
314        IGCM_debug_Print 3 "Boundary files ${compname}"
315
316        card=${SUBMIT_DIR}/COMP/${compname}.card
317
318        IGCM_card_DefineArrayFromOption ${card} BoundaryFiles List
319        ListFilesName=${compname}_BoundaryFiles_List
320        eval FileName0=\${${ListFilesName}[0]} > /dev/null 2>&1
321
322        if [ X${FileName0} != X${NULL_STR} ] ; then
323            eval NbFiles=\${#${ListFilesName}[@]} > /dev/null 2>&1
324
325            (( i=0 ))
326            until [ $i -ge $NbFiles ]; do
327                eval file_in_=\${${ListFilesName}[$i]} > /dev/null 2>&1
328                eval file_in=${file_in_}
329                (( i_ = i+1 ))
330                eval file_out_=\${${ListFilesName}[$i_]} > /dev/null 2>&1
331                eval file_out=${file_out_}
332
333                IGCM_sys_Get ${file_in} ${file_out}
334                IGCM_comp_PrepareDeletedFiles ${file_in} ${file_out}
335
336                (( i=i+2 ))
337            done
338        fi
339
340        # Get non deleted files
341        if [ ${Period} = 1 ]; then
342
343            IGCM_card_DefineArrayFromOption ${card} BoundaryFiles ListNonDel
344            ListFilesName=${compname}_BoundaryFiles_ListNonDel
345            eval FileName0=\${${ListFilesName}[0]} > /dev/null 2>&1
346           
347            if [ X${FileName0} != X${NULL_STR} ] ; then
348                eval NbFiles=\${#${ListFilesName}[@]} > /dev/null 2>&1
349               
350                (( i=0 ))
351                until [ $i -ge $NbFiles ]; do
352                    eval file_in_=\${${ListFilesName}[$i]} > /dev/null 2>&1
353                    eval file_in=${file_in_}
354                    (( i_ = i+1 ))
355                    eval file_out_=\${${ListFilesName}[$i_]} > /dev/null 2>&1
356                    eval file_out=${file_out_}
357
358                    IGCM_sys_Get ${file_in} ${file_out}
359
360                    if [ X${file_out} != X. ] ; then
361                        ListFixBoundary=${ListFixBoundary}" "${file_out}
362                    else
363                        ListFixBoundary=${ListFixBoundary}" "$( basename ${file_in} )
364                    fi
365
366                    (( i=i+2 ))
367                done
368            fi
369        fi
370    done
371   
372    IGCM_debug_PopStack "IGCM_comp_GetInputBoundaryFiles"
373}
374
375#=======================================================================
376function IGCM_comp_DelFixeBoundaryFiles
377{
378    IGCM_debug_PushStack "IGCM_comp_DelFixeBoundaryFiles"
379
380    # Debug Print :
381    echo
382    IGCM_debug_Print 1 "IGCM_comp_DelFixeBoundaryFiles :"
383    echo
384
385    ls -l ${ListFixBoundary}
386    rm -f ${ListFixBoundary}
387
388    IGCM_debug_PopStack "IGCM_comp_DelFixeBoundaryFiles"
389}
390
391#=======================================================================
392function IGCM_comp_GetInputParametersFiles
393{
394    IGCM_debug_PushStack "IGCM_comp_GetInputParametersFiles"
395
396    # Debug Print :
397    echo
398    IGCM_debug_Print 1 "IGCM_comp_GetInputParametersFiles :"
399    echo
400
401    typeset comp compname comptagname card ListFilesName FileName0 NbFiles i i_ file_in file_out
402    for comp in ${config_ListOfComponents[*]} ; do
403        # Define component
404        eval compname=\${config_ListOfComponents_${comp}[0]} > /dev/null 2>&1
405        eval comptagname=\${config_ListOfComponents_${comp}[1]} > /dev/null 2>&1
406
407        # Debug Print :
408        IGCM_debug_Print 3 "Parameters ${compname}"
409
410        card=${SUBMIT_DIR}/COMP/${compname}.card       
411
412        IGCM_card_DefineArrayFromOption ${card} ParametersFiles List
413        ListFilesName=${compname}_ParametersFiles_List
414        eval FileName0=\${${ListFilesName}[0]} > /dev/null 2>&1
415
416        if [ X${FileName0} != X${NULL_STR} ] ; then
417            eval NbFiles=\${#${ListFilesName}[@]} > /dev/null 2>&1
418
419            (( i=0 ))
420            until [ $i -ge $NbFiles ]; do
421                eval file_in_=\${${ListFilesName}[$i]} > /dev/null 2>&1
422                eval file_in=${file_in_}
423                (( i_ = i+1 ))
424                eval file_out_=\${${ListFilesName}[$i_]} > /dev/null 2>&1
425                eval file_out=${file_out_} 
426
427                IGCM_sys_Cp ${file_in} ${file_out} 
428                IGCM_comp_PrepareDeletedFiles ${file_in} ${file_out}
429
430                (( i=i+2 ))
431            done
432        fi
433    done
434
435    IGCM_debug_PopStack "IGCM_comp_GetInputParametersFiles"
436}
437
438#=======================================================================
439function IGCM_comp_GetInputRestartFiles
440{
441    IGCM_debug_PushStack "IGCM_comp_GetInputRestartFiles"
442
443    # Debug Print :
444    echo
445    IGCM_debug_Print 1 "IGCM_comp_GetInputRestartFiles :"
446    echo
447
448    typeset Date_tmp Date_r Path_r do_start CompOldName Path_temp
449    typeset comp compname comptagname card ListFilesName FileName0 NbFiles i i_
450    typeset file_in file_out file_in_ file_out_ file_in_Name
451    typeset -Z4 j4
452
453    for comp in ${config_ListOfComponents[*]} ; do
454        # Define component
455        eval compname=\${config_ListOfComponents_${comp}[0]} > /dev/null 2>&1
456        eval comptagname=\${config_ListOfComponents_${comp}[1]} > /dev/null 2>&1
457        #
458        card=${SUBMIT_DIR}/COMP/${compname}.card
459        #
460        IGCM_card_DefineArrayFromOption ${card} RestartFiles List
461        ListFilesName=${compname}_RestartFiles_List
462        eval FileName0=\${${ListFilesName}[0]} > /dev/null 2>&1
463
464        # Debug Print :
465        IGCM_debug_Print 3 "restart ${compname}"
466
467        if ( ${FirstInitialize} ) ; then
468
469            if [ "${config_Restarts_OverRule}" = "y" ] ; then
470                eval config_${comp}_Restart="y"
471                eval config_${comp}_RestartDate=${config_Restarts_RestartDate}
472                eval config_${comp}_RestartJobName=${config_Restarts_RestartJobName}
473                eval config_${comp}_RestartPath=${config_Restarts_RestartPath}
474                eval do_start=\${config_${comp}_Restart} > /dev/null 2>&1
475                eval CompOldName=${comp}
476            else
477                # Read component Restarts parameters
478                IGCM_card_DefineVariableFromOption ${SUBMIT_DIR}/config.card ${comp} Restart
479                eval do_start=\${config_${comp}_Restart} > /dev/null 2>&1
480
481                if [ "${do_start}" = "y" ] ; then
482                    IGCM_card_DefineVariableFromOption ${SUBMIT_DIR}/config.card ${comp} RestartDate
483                    IGCM_card_DefineVariableFromOption ${SUBMIT_DIR}/config.card ${comp} RestartJobName
484                    IGCM_card_DefineVariableFromOption ${SUBMIT_DIR}/config.card ${comp} RestartPath
485                else
486                    eval config_${comp}_RestartDate=-1
487                    eval config_${comp}_RestartJobName=${NULL_STR}
488                    eval config_${comp}_RestartPath=${NULL_STR}
489                fi
490                IGCM_card_DefineVariableFromOption ${SUBMIT_DIR}/config.card ${comp} OldName
491                eval CompOldName=\${config_${comp}_OldName}
492                if [ X${CompOldName} = X ] ; then
493                    eval CompOldName=${comp}
494                fi
495            fi
496
497            if [ "${do_start}" = "y" ] ; then
498
499                if ( [ X${FileName0} != X${NULL_STR} ] && [ X${FileName0} != XNONE ] ) ; then
500                    eval NbFiles=\${#${ListFilesName}[@]} > /dev/null 2>&1
501
502                    (( i=1 ))
503                    until [ $i -gt $NbFiles ]; do
504                        eval file_in_=\${${ListFilesName}[$i]} > /dev/null 2>&1
505                        eval file_in=${file_in_}
506
507                        (( i_ = i+1 ))
508                        eval file_out_=\${${ListFilesName}[$i_]} > /dev/null 2>&1
509                        eval file_out=${file_out_}
510                       
511                        eval Date_tmp=\${config_${comp}_RestartDate}
512                        Date_r=$( IGCM_date_ConvertFormatToGregorian ${Date_tmp} )
513                        eval Path_r=\${config_${comp}_RestartPath}/\${config_${comp}_RestartJobName}/${CompOldName}/Restart
514                        eval file_in_Name=\${config_${comp}_RestartJobName}_${Date_r}_${file_in}
515
516                        generic_restart_file_name_in=$( basename ${file_in_Name} .nc )
517                        generic_restart_file_name_out=$( basename ${file_out} .nc )
518                       
519                        eval Path_temp=\${Path_r}/${generic_restart_file_name_in}
520                        nb_restart_file=$(IGCM_sys_CountFileArchive ${Path_temp}_????.nc)
521
522                        if [ ${nb_restart_file} -gt 1 ] ; then
523                            j=0
524                            until [ $j -ge $nb_restart_file ]; do
525                                j4=${j}
526                                eval IGCM_sys_Get ${Path_r}/${generic_restart_file_name_in}_${j4}.nc ${generic_restart_file_name_out}_${j4}.nc
527                                #IGCM_comp_PrepareDeletedFiles ${generic_restart_file_name_in}_${j4}.nc ${generic_restart_file_name_out}_${j4}.nc
528                                #eval FileToBeDeleted[${#FileToBeDeleted[@]}]="${generic_restart_file_name_out}_${j4}.nc" > /dev/null 2>&1
529                                (( j=j+1 ))
530                            done
531                        else
532                            eval IGCM_sys_Get ${Path_r}/${file_in_Name} ${file_out} 
533                            #IGCM_comp_PrepareDeletedFiles ${file_in} ${file_out}
534                        fi
535               
536                        (( i=i+3 ))
537                    done
538                else
539                    if [ X${FileName0} != XNONE ] ; then
540                        IGCM_debug_Exit "IGCM_comp_GetInputRestartFiles : No file in list for ${compname}."
541                    else
542                        IGCM_debug_Print 1 "IGCM_comp_GetInputRestartFiles : NONE specified in Restart List ${compname}."
543                    fi
544                fi
545            fi
546        elif [ ${Period} -eq 1 ] ; then
547            # if not FirstInitialize and first loop of this job
548
549            # Restore Restarts files
550            #-----------------------
551            if ( [ X${FileName0} != X${NULL_STR} ] && [ X${FileName0} != XNONE ] ) ; then
552                eval NbFiles=\${#${ListFilesName}[@]} > /dev/null 2>&1
553
554                (( i=1 ))
555                until [ $i -gt $NbFiles ]; do
556                    eval file_in_=\${${ListFilesName}[$i]} > /dev/null 2>&1
557                    eval file_in=${file_in_}
558                    (( i_ = i+1 ))
559                    eval file_out_=\${${ListFilesName}[$i_]} > /dev/null 2>&1
560                    eval file_out=${file_out_}
561                   
562                    file_in_Name=${run_Configuration_OldPrefix}_${file_in}
563
564                    generic_restart_file_name_in=$( basename ${file_in_Name} .nc )
565                    generic_restart_file_name_out=$( basename ${file_out} .nc )
566
567                    eval Path_temp=\${R_OUT_${comp}_R}/${generic_restart_file_name_in}
568                    nb_restart_file=$(IGCM_sys_CountFileArchive ${Path_temp}_????.nc)
569
570                    if [ ${nb_restart_file} -gt 1 ] ; then
571                        j=0
572                        until [ $j -ge $nb_restart_file ]; do
573                            j4=${j}
574                            eval IGCM_sys_Get \${R_OUT_${comp}_R}/${generic_restart_file_name_in}_${j4}.nc ${generic_restart_file_name_out}_${j4}.nc
575                            #IGCM_comp_PrepareDeletedFiles ${generic_restart_file_name_in}_${j4}.nc ${generic_restart_file_name_out}_${j4}.nc
576                            #eval FileToBeDeleted[${#FileToBeDeleted[@]}]="${generic_restart_file_name_out}_${j4}.nc" > /dev/null 2>&1
577
578                            (( j=j+1 ))
579                        done
580                    else
581                        eval IGCM_sys_Get \${R_OUT_${comp}_R}/${file_in_Name} ${file_out}
582                        #IGCM_comp_PrepareDeletedFiles ${file_in} ${file_out}
583                    fi
584
585                    (( i=i+3 ))
586                done
587            else
588                if [ X${FileName0} != XNONE ] ; then
589                    IGCM_debug_Exit "IGCM_comp_GetInputRestartFiles : No file in list for ${compname}."
590                else
591                    IGCM_debug_Print 1 "IGCM_comp_GetInputRestartFiles : NONE specified in Restart List ${compname}."
592                fi
593            fi
594        fi
595    done
596    IGCM_sys_Chmod u+rw *
597
598    IGCM_debug_PopStack "IGCM_comp_GetInputRestartFiles"
599}
600
601#=======================================================================
602function IGCM_comp_Update
603{
604    IGCM_debug_PushStack "IGCM_comp_Update"
605
606    # Debug Print :
607    echo
608    IGCM_debug_Print 1 "IGCM_comp_Update :"
609    echo
610
611    typeset ExeNameIn ExeNameOut
612    typeset comp compname comptagname
613    for comp in ${config_ListOfComponents[*]} ; do
614        # Define component
615        eval compname=\${config_ListOfComponents_${comp}[0]} > /dev/null 2>&1
616        eval comptagname=\${config_ListOfComponents_${comp}[1]} > /dev/null 2>&1
617
618        # Copy executable for this component
619        eval ExeNameIn=\${config_Executable_${comp}[0]}
620        eval ExeNameOut=\${config_Executable_${comp}[1]}
621
622        # If missing executable then stop!
623        #if [ ! X${ExeNameIn} = X ] && [ ! -f ${R_EXE}/${ExeNameIn} ] ; then
624        #    IGCM_debug_Exit "IGCM_comp_Update missing executable ${ExeNameIn}"
625        #fi
626
627        if [ ${Period} -eq 1 ] && [ -f ${R_EXE}/${ExeNameIn} ] ; then
628            eval IGCM_sys_Cp ${R_EXE}/${ExeNameIn} ${ExeNameOut}
629            if [ -f ${RUN_DIR}/${ExeNameOut} ] ; then
630                eval IGCM_sys_Chmod +rx ${RUN_DIR}/${ExeNameOut}
631            fi
632        elif [ -f ${R_EXE}/${ExeNameIn} ] && [ ! -f ${RUN_DIR}/${ExeNameOut} ] ; then
633            eval IGCM_sys_Cp ${R_EXE}/${ExeNameIn} ${ExeNameOut}
634            if [ -f ${RUN_DIR}/${ExeNameOut} ] ; then
635                eval IGCM_sys_Chmod +rx ${RUN_DIR}/${ExeNameOut}
636            fi
637        fi
638
639        # Debug Print
640        IGCM_debug_Print 3 "Update ${compname} Parameter Files."
641        # UPDATE component
642        ${comp}_Update
643
644    done
645
646    IGCM_debug_PopStack "IGCM_comp_Update"
647}
648
649#=======================================================================
650function IGCM_comp_Finalize
651{
652    IGCM_debug_PushStack "IGCM_comp_Finalize"
653
654    # Debug Print :
655    echo
656    IGCM_debug_Print 1 "IGCM_comp_Finalize :"
657    echo
658
659    typeset ListTextName TextName0
660    typeset comp compname comptagname card ListFilesName FileName0 NbFiles SaveOnArchive
661    typeset i i_ file_in file_in_ file_out file_out_ file_outin file_outin_ generic_file_name nb_rebuild_file
662    typeset -Z4 j4
663    for comp in ${config_ListOfComponents[*]} ; do
664        # Define component
665        eval compname=\${config_ListOfComponents_${comp}[0]} > /dev/null 2>&1
666        eval comptagname=\${config_ListOfComponents_${comp}[1]} > /dev/null 2>&1
667
668        # Debug Print
669        IGCM_debug_Print 1 "Finalize ${compname} component."
670        # FINALIZE component
671        ${comp}_Finalize
672
673        card=${SUBMIT_DIR}/COMP/${compname}.card       
674
675        # Save Restarts files
676        #--------------------
677        IGCM_card_DefineArrayFromOption ${card} RestartFiles List
678        ListFilesName=${compname}_RestartFiles_List
679        eval FileName0=\${${ListFilesName}[0]} > /dev/null 2>&1
680       
681        if ( [ X${FileName0} != X${NULL_STR} ] && [ X${FileName0} != XNONE ] ) ; then
682            eval NbFiles=\${#${ListFilesName}[@]} > /dev/null 2>&1
683           
684            (( i=0 ))
685            until [ $i -ge $NbFiles ]; do
686                eval file_in_=\${${ListFilesName}[$i]} > /dev/null 2>&1
687                eval file_in=${file_in_}
688
689                (( i_ = i+1 ))
690                eval file_out_=\${${ListFilesName}[$i_]} > /dev/null 2>&1
691                eval file_out=${file_out_}
692
693                (( i_ = i+2 ))
694                eval file_outin_=\${${ListFilesName}[$i_]} > /dev/null 2>&1
695                eval file_outin=${file_outin_}
696
697                generic_restart_file_name_in=$(    basename ${file_in} .nc )
698                generic_restart_file_name_out=$(   basename ${config_UserChoices_JobName}_${PeriodDateEnd}_${file_out} .nc )
699                generic_restart_file_name_outin=$( basename ${file_outin} .nc )
700                       
701                nb_restart_file=$( ls ${generic_restart_file_name_in}_????.nc 2>/dev/null | wc -l ) 
702                if [ ${nb_restart_file} -gt 1 ] ; then
703                    j=0
704                    until [ $j -ge $nb_restart_file ]; do
705                        j4=${j}
706                        eval IGCM_sys_Put_Rest ${generic_restart_file_name_in}_${j4}.nc \${R_OUT_${comp}_R}/${generic_restart_file_name_out}_${j4}.nc
707                        [ ! ${file_in} = ${file_outin} ] && IGCM_sys_Mv ${generic_restart_file_name_in}_${j4}.nc ${generic_restart_file_name_outin}_${j4}.nc
708                        #eval FileToBeDeleted[${#FileToBeDeleted[@]}]="${generic_restart_file_name_in}_${j4}.nc" > /dev/null 2>&1
709                        (( j=j+1 ))
710                    done
711                else
712                    eval IGCM_sys_Put_Rest ${file_in} \${R_OUT_${comp}_R}/${config_UserChoices_JobName}_${PeriodDateEnd}_${file_out}
713                    [ ! ${file_in} = ${file_outin} ] && IGCM_sys_Mv ${file_in} ${file_outin}
714                    #eval FileToBeDeleted[${#FileToBeDeleted[@]}]="${file_in}" > /dev/null 2>&1
715                fi
716
717                (( i=i+3 ))
718            done
719        else
720            if [ X${FileName0} != XNONE ] ; then
721                IGCM_debug_Exit "IGCM_comp_Finalize : No file in restart list for ${compname}."
722            else
723                IGCM_debug_Print 1 "IGCM_comp_Finalize : NONE specified in Restart List ${compname}."
724            fi
725        fi
726
727        # Save Output files
728        #------------------
729        IGCM_card_DefineArrayFromOption ${card} OutputFiles List
730        ListFilesName=${compname}_OutputFiles_List
731        eval FileName0=\${${ListFilesName}[0]} > /dev/null 2>&1
732
733        if [ X${FileName0} != X${NULL_STR} ] ; then
734            eval NbFiles=\${#${ListFilesName}[@]} > /dev/null 2>&1
735
736            (( i=0 ))
737            until [ $i -ge $NbFiles ]; do
738                SaveOnArchive=true
739                eval file_in_=\${${ListFilesName}[$i]} > /dev/null 2>&1
740                eval file_in=${file_in_}
741                (( i_ = i+1 ))
742                eval file_out_=\${${ListFilesName}[$i_]} > /dev/null 2>&1
743                eval file_out=${file_out_}
744                (( i_ = i+2 ))
745                eval flag_post=\${${ListFilesName}[$i_]} > /dev/null 2>&1
746                #
747                generic_file_name=$( basename ${file_in} .nc )
748                nb_rebuild_file=$( ls | grep "^${generic_file_name}[_0-9]*.nc" | wc -l )
749                #
750                if ( [ ${nb_rebuild_file} -eq 1 ] && [ -f ${generic_file_name}_0000.nc ] ) ; then
751                    IGCM_debug_Print 2 "Parallelism with 1 process. Rebuilding ${file_in} not needed"
752                    IGCM_sys_Mv ${generic_file_name}_0000.nc ${file_in}
753                elif [ ${nb_rebuild_file} -gt 1 ] ; then
754                    IGCM_debug_Print 2 "Parallelism detected rebuilding ${file_in} is needed"
755                    if ( [ X${config_Post_RebuildFrequency} = X${NULL_STR} ] || [ X${config_Post_RebuildFrequency} = XNONE ] ) ; then
756                        IGCM_debug_Print 2 "Rebuilding ${file_in} online"
757                        IGCM_sys_rebuild ${file_in} ${generic_file_name}_*.nc
758                    else
759                        IGCM_debug_Print 2 "Preparing offline rebuild for ${file_in}"
760                        [ ! -d ${RUN_DIR}/REBUILD_${PeriodDateBegin} ] && IGCM_sys_Mkdir ${RUN_DIR}/REBUILD_${PeriodDateBegin}
761                        IGCM_sys_Mv ${generic_file_name}_????.nc ${RUN_DIR}/REBUILD_${PeriodDateBegin}
762
763                        # Prepare headers for the shell dedicated to offline rebuild
764                        if [ ! -f ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh ] ; then
765                            if [ $DRYRUN -le 1 ]; then
766                            echo \#!/bin/ksh                                           > ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
767                            echo function IGCM_FlushRebuild                           >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
768                            echo {                                                    >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
769                            echo IGCM_debug_PushStack "IGCM_FlushRebuild"             >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
770                            echo echo                                                 >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
771                            echo IGCM_debug_Print 1 "IGCM_FlushRebuild"               >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
772                            echo echo                                                 >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
773                            fi
774                        fi
775                        # Prepare the shell dedicated to offline rebuild
776                        if [ $DRYRUN -le 1 ]; then
777                            echo IGCM_sys_rebuild ${file_in} ${generic_file_name}_*.nc    >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
778                            echo IGCM_debug_Verif_Exit                                    >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
779                        fi
780                        #
781                        # Load Patch we need to apply and apply
782                        if [ $DRYRUN -le 1 ]; then
783                            if [ X$( eval echo \${${compname}_${flag_post}_Patches[0]} ) !=  X${NULL_STR} ]; then
784                                for Patch in $( eval echo \${${compname}_${flag_post}_Patches[*]} ); do
785                                    echo . ${libIGCM_POST}/libIGCM_post/IGCM_${Patch}.ksh >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
786                                    echo IGCM_${Patch} ${file_in}                         >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
787                                done
788                            fi
789                        fi
790                        #
791                        if [ $DRYRUN -le 1 ]; then
792                            echo IGCM_sys_Put_Out ${file_in} ${file_out}                  >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
793                            echo IGCM_debug_Verif_Exit                                    >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
794                            echo IGCM_sys_Rm ${generic_file_name}_*.nc                    >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
795                        fi
796                        SaveOnArchive=false
797                    fi
798                fi
799                #
800                if [ ${SaveOnArchive} = true ] ; then
801                    #
802                    # If we need to apply a patch we use TMP DIRECTORY before ARCHIVING if asynchronous rebuild is on
803                    #
804                    if ( [ ! X$( eval echo \${${compname}_${flag_post}_Patches[0]} ) =  X${NULL_STR} ] && [ ! X${config_Post_RebuildFrequency} = X ] && [ ! X${config_Post_RebuildFrequency} = XNONE ] ) ; then
805                        if [ -f ${file_in} ] ; then
806                            IGCM_sys_Mv ${file_in} ${RUN_DIR}/REBUILD_${PeriodDateBegin}
807                            eval FileToBeDeleted[${#FileToBeDeleted[@]}]=REBUILD_${PeriodDateBegin}/${file_in} > /dev/null 2>&1
808                            #
809                            if [ $DRYRUN -le 1 ]; then
810                                for Patch in $( eval echo \${${compname}_${flag_post}_Patches[*]} ); do
811                                    echo . ${libIGCM_POST}/libIGCM_post/IGCM_${Patch}.ksh     >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
812                                    echo IGCM_${Patch} ${file_in}                             >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
813                                done
814                                #
815                                echo IGCM_sys_Put_Out ${file_in} ${file_out}                  >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
816                                echo IGCM_debug_Verif_Exit                                    >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
817                                #
818                            fi
819                        fi
820                    else
821                        IGCM_sys_Put_Out ${file_in} ${file_out}
822                        [ $? -eq 0 ] && eval FileToBeDeleted[${#FileToBeDeleted[@]}]="${file_in}" > /dev/null 2>&1
823                        if [ ${nb_rebuild_file} -gt 1 ] ; then
824                            for DelFile in $( ls | grep "${generic_file_name}[_0-9]*.nc" ) ; do
825                                eval FileToBeDeleted[${#FileToBeDeleted[@]}]=${DelFile} > /dev/null 2>&1
826                            done
827                        fi
828                    fi
829                fi
830                (( i=i+3 ))
831            done
832        fi
833
834        # Save Output Text files of models
835        #---------------------------------
836       
837        IGCM_card_DefineArrayFromOption ${card} OutputText List
838        ListTextName=${compname}_OutputText_List
839       
840        eval TextName0=\${${ListTextName}[0]} > /dev/null 2>&1
841        if [ X${TextName0} != X${NULL_STR} ] ; then
842            eval NbFiles=\${#${ListTextName}[@]} > /dev/null 2>&1
843
844            (( i=0 ))
845            until [ $i -eq $NbFiles ]; do
846                eval file_in=\${${ListTextName}[$i]} > /dev/null 2>&1
847                (( i=i+1 ))
848
849                nb_text_file=$( ls ${file_in}* 2>/dev/null | wc -l )
850                if [ ${nb_text_file} -gt 1 ] ; then
851                    list_file=$( ls ${file_in}* )
852                    for file in ${list_file}
853                      do
854                      eval IGCM_sys_Put_Out ${file} \${R_OUT_${comp}_D}/${PREFIX}_${file}
855                      eval FileToBeDeleted[${#FileToBeDeleted[@]}]="${file}" > /dev/null 2>&1
856                    done
857                else
858                    if ( [ -f ${file_in}_0000 ] || [ -f ${file_in}0 ] ) ; then
859                        eval IGCM_sys_Mv ${file_in}* ${file_in}
860                    fi
861                    eval IGCM_sys_Put_Out ${file_in} \${R_OUT_${comp}_D}/${PREFIX}_${file_in}
862                    [ $? -eq 0 ] && eval FileToBeDeleted[${#FileToBeDeleted[@]}]="${file_in}" > /dev/null 2>&1
863                fi
864            done
865        fi
866    done
867
868    IGCM_debug_PopStack "IGCM_comp_Finalize"
869}
Note: See TracBrowser for help on using the repository browser.