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

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