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

Last change on this file since 237 was 237, checked in by sdipsl, 14 years ago

-Add some default behavior to reach the backward compatibility

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