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

Last change on this file since 149 was 149, checked in by sdipsl, 15 years ago
  • New post-processing functionnality for cmip5 like post-processing
    • You can ask for fixed lenght time series (10 years chunck or 50 years chunck or ...) and specify it for each files.
    • Separation of concern between 2D and 3D fields.
    • Backward compatible with previous style comp.card
    • example : TimeSeriesVars2D = (cldt, psol, q2m, slp, SWnetOR, SWdownOR, LWdownOR, precip) ChunckJob2D = NONE TimeSeriesVars3D = (temp, theta, ovap, ovapinit, geop, vitu, vitv, vitw, pres) ChunckJob3D = 10Y
  • In case of asynchronous rebuild save patched files on archive filesystem. (so that they have good time axis)
  • 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.3 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        # Debug Print :
437        IGCM_debug_Print 3 "restart ${compname}"
438
439        card=${SUBMIT_DIR}/COMP/${compname}.card       
440
441        if ( ${FirstInitialize} ) ; then
442
443            if [ "${config_Restarts_OverRule}" = "y" ] ; then
444                eval config_${comp}_Restart="y"
445                eval config_${comp}_RestartDate=${config_Restarts_RestartDate}
446                eval config_${comp}_RestartJobName=${config_Restarts_RestartJobName}
447                eval config_${comp}_RestartPath=${config_Restarts_RestartPath}
448                eval do_start=\${config_${comp}_Restart} > /dev/null 2>&1
449                eval CompOldName=${comp}
450            else
451                # Read component Restarts parameters
452                IGCM_card_DefineVariableFromOption ${SUBMIT_DIR}/config.card ${comp} Restart
453                eval do_start=\${config_${comp}_Restart} > /dev/null 2>&1
454
455                if [ "${do_start}" = "y" ] ; then
456                    IGCM_card_DefineVariableFromOption ${SUBMIT_DIR}/config.card ${comp} RestartDate
457                    IGCM_card_DefineVariableFromOption ${SUBMIT_DIR}/config.card ${comp} RestartJobName
458                    IGCM_card_DefineVariableFromOption ${SUBMIT_DIR}/config.card ${comp} RestartPath
459                else
460                    eval config_${comp}_RestartDate=-1
461                    eval config_${comp}_RestartJobName=${NULL_STR}
462                    eval config_${comp}_RestartPath=${NULL_STR}
463                fi
464                IGCM_card_DefineVariableFromOption ${SUBMIT_DIR}/config.card ${comp} OldName
465                eval CompOldName=\${config_${comp}_OldName}
466                if [ X${CompOldName} = X ] ; then
467                    eval CompOldName=${comp}
468                fi
469            fi
470
471            if [ "${do_start}" = "y" ] ; then
472
473                IGCM_card_DefineArrayFromOption ${card} RestartFiles List
474                ListFilesName=${compname}_RestartFiles_List
475                eval FileName0=\${${ListFilesName}[0]} > /dev/null 2>&1
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        else
525            # if not FirstInitialize
526
527            # Restore Restarts files
528            #-----------------------
529            IGCM_card_DefineArrayFromOption ${card} RestartFiles List
530            ListFilesName=${compname}_RestartFiles_List
531            eval FileName0=\${${ListFilesName}[0]} > /dev/null 2>&1
532           
533            if ( [ X${FileName0} != X${NULL_STR} ] && [ X${FileName0} != XNONE ] ) ; then
534                eval NbFiles=\${#${ListFilesName}[@]} > /dev/null 2>&1
535
536                (( i=1 ))
537                until [ $i -gt $NbFiles ]; do
538                    eval file_in_=\${${ListFilesName}[$i]} > /dev/null 2>&1
539                    eval file_in=${file_in_}
540                    (( i_ = i+1 ))
541                    eval file_out_=\${${ListFilesName}[$i_]} > /dev/null 2>&1
542                    eval file_out=${file_out_}
543                   
544                    file_in_Name=${run_Configuration_OldPrefix}_${file_in}
545
546                    generic_restart_file_name_in=$( basename ${file_in_Name} .nc )
547                    generic_restart_file_name_out=$( basename ${file_out} .nc )
548
549                    eval Path_temp=\${R_OUT_${comp}_R}/${generic_restart_file_name_in}
550                    nb_restart_file=$(IGCM_sys_CountFileArchive ${Path_temp}_????.nc)
551
552                    if [ ${nb_restart_file} -gt 1 ] ; then
553                        j=0
554                        until [ $j -ge $nb_restart_file ]; do
555                            j4=${j}
556                            eval IGCM_sys_Get \${R_OUT_${comp}_R}/${generic_restart_file_name_in}_${j4}.nc ${generic_restart_file_name_out}_${j4}.nc
557                            IGCM_comp_PrepareDeletedFiles ${generic_restart_file_name_in}_${j4}.nc ${generic_restart_file_name_out}_${j4}.nc
558                            eval FileToBeDeleted[${#FileToBeDeleted[@]}]="${generic_restart_file_name_out}_${j4}.nc" > /dev/null 2>&1
559
560                            (( j=j+1 ))
561                        done
562                    else
563                        eval IGCM_sys_Get \${R_OUT_${comp}_R}/${file_in_Name} ${file_out}
564                        IGCM_comp_PrepareDeletedFiles ${file_in} ${file_out}
565                    fi
566
567                    (( i=i+3 ))
568                done
569            else
570                if [ X${FileName0} != XNONE ] ; then
571                    IGCM_debug_Exit "IGCM_comp_GetInputRestartFiles : No file in list for ${compname}."
572                else
573                    IGCM_debug_Print 1 "IGCM_comp_GetInputRestartFiles : NONE specified in Restart List ${compname}."
574                fi
575            fi
576        fi
577    done
578    IGCM_sys_Chmod u+rw *
579
580    IGCM_debug_PopStack "IGCM_comp_GetInputRestartFiles"
581}
582
583#=======================================================================
584function IGCM_comp_Update
585{
586    IGCM_debug_PushStack "IGCM_comp_Update"
587
588    # Debug Print :
589    echo
590    IGCM_debug_Print 1 "IGCM_comp_Update :"
591    echo
592
593    typeset ExeNameIn ExeNameOut
594    typeset comp compname comptagname
595    for comp in ${config_ListOfComponents[*]} ; do
596        # Define component
597        eval compname=\${config_ListOfComponents_${comp}[0]} > /dev/null 2>&1
598        eval comptagname=\${config_ListOfComponents_${comp}[1]} > /dev/null 2>&1
599
600        # Copy executable for this component
601        eval ExeNameIn=\${config_Executable_${comp}[0]}
602        eval ExeNameOut=\${config_Executable_${comp}[1]}
603        if [ -f ${R_EXE}/${ExeNameIn} ]  ; then
604            eval IGCM_sys_Cp ${R_EXE}/${ExeNameIn} ${ExeNameOut}
605            if [ -f ${RUN_DIR}/${ExeNameOut} ] ; then
606                eval IGCM_sys_Chmod +rx ${RUN_DIR}/${ExeNameOut}
607            fi
608        fi
609
610        # Debug Print
611        IGCM_debug_Print 3 "Update ${compname} Parameter Files."
612        # UPDATE component
613        ${comp}_Update
614
615    done
616
617    IGCM_debug_PopStack "IGCM_comp_Update"
618}
619
620#=======================================================================
621function IGCM_comp_Finalize
622{
623    IGCM_debug_PushStack "IGCM_comp_Finalize"
624
625    # Debug Print :
626    echo
627    IGCM_debug_Print 1 "IGCM_comp_Finalize :"
628    echo
629
630    typeset ListTextName TextName0
631    typeset comp compname comptagname card ListFilesName FileName0 NbFiles SaveOnArchive
632    typeset i i_ file_in file_in_ file_out file_out_ generic_file_name nb_rebuild_file
633    typeset -Z4 j4
634    for comp in ${config_ListOfComponents[*]} ; do
635        # Define component
636        eval compname=\${config_ListOfComponents_${comp}[0]} > /dev/null 2>&1
637        eval comptagname=\${config_ListOfComponents_${comp}[1]} > /dev/null 2>&1
638
639        # Debug Print
640        IGCM_debug_Print 1 "Finalize ${compname} component."
641        # FINALIZE component
642        ${comp}_Finalize
643
644        card=${SUBMIT_DIR}/COMP/${compname}.card       
645
646        # Save Restarts files
647        #--------------------
648        IGCM_card_DefineArrayFromOption ${card} RestartFiles List
649        ListFilesName=${compname}_RestartFiles_List
650        eval FileName0=\${${ListFilesName}[0]} > /dev/null 2>&1
651       
652        if ( [ X${FileName0} != X${NULL_STR} ] && [ X${FileName0} != XNONE ] ) ; then
653            eval NbFiles=\${#${ListFilesName}[@]} > /dev/null 2>&1
654           
655            (( i=0 ))
656            until [ $i -ge $NbFiles ]; do
657                eval file_in_=\${${ListFilesName}[$i]} > /dev/null 2>&1
658                eval file_in=${file_in_}
659
660                (( i_ = i+1 ))
661                eval file_out_=\${${ListFilesName}[$i_]} > /dev/null 2>&1
662                eval file_out=${file_out_}
663               
664                generic_restart_file_name_in=$( basename ${file_in} .nc )
665                generic_restart_file_name_out=$( basename ${config_UserChoices_JobName}_${PeriodDateEnd}_${file_out} .nc )
666                       
667                nb_restart_file=$( ls ${generic_restart_file_name_in}_????.nc 2>/dev/null | wc -l ) 
668                if [ ${nb_restart_file} -gt 1 ] ; then
669                    j=0
670                    until [ $j -ge $nb_restart_file ]; do
671                        j4=${j}
672                        eval IGCM_sys_Put_Rest ${generic_restart_file_name_in}_${j4}.nc \${R_OUT_${comp}_R}/${generic_restart_file_name_out}_${j4}.nc
673                        eval FileToBeDeleted[${#FileToBeDeleted[@]}]="${generic_restart_file_name_in}_${j4}.nc" > /dev/null 2>&1
674                        (( j=j+1 ))
675                    done
676                else
677                    eval IGCM_sys_Put_Rest ${file_in} \${R_OUT_${comp}_R}/${config_UserChoices_JobName}_${PeriodDateEnd}_${file_out}
678                    eval FileToBeDeleted[${#FileToBeDeleted[@]}]="${file_in}" > /dev/null 2>&1
679                fi
680
681                (( i=i+3 ))
682            done
683        else
684            if [ X${FileName0} != XNONE ] ; then
685                IGCM_debug_Exit "IGCM_comp_Finalize : No file in restart list for ${compname}."
686            else
687                IGCM_debug_Print 1 "IGCM_comp_Finalize : NONE specified in Restart List ${compname}."
688            fi
689        fi
690
691        # Save Output files
692        #------------------
693        IGCM_card_DefineArrayFromOption ${card} OutputFiles List
694        ListFilesName=${compname}_OutputFiles_List
695        eval FileName0=\${${ListFilesName}[0]} > /dev/null 2>&1
696
697        if [ X${FileName0} != X${NULL_STR} ] ; then
698            eval NbFiles=\${#${ListFilesName}[@]} > /dev/null 2>&1
699
700            (( i=0 ))
701            until [ $i -ge $NbFiles ]; do
702                SaveOnArchive=true
703                eval file_in_=\${${ListFilesName}[$i]} > /dev/null 2>&1
704                eval file_in=${file_in_}
705                (( i_ = i+1 ))
706                eval file_out_=\${${ListFilesName}[$i_]} > /dev/null 2>&1
707                eval file_out=${file_out_}
708                (( i_ = i+2 ))
709                eval flag_post=\${${ListFilesName}[$i_]} > /dev/null 2>&1
710                #
711                generic_file_name=$( basename ${file_in} .nc )
712                nb_rebuild_file=$( ls | grep "^${generic_file_name}[_0-9]*.nc" | wc -l )
713                #
714                if ( [ ${nb_rebuild_file} -eq 1 ] && [ -f ${generic_file_name}_0000.nc ] ) ; then
715                    IGCM_debug_Print 2 "Parallelism with 1 process. Rebuilding ${file_in} not needed"
716                    IGCM_sys_Mv ${generic_file_name}_0000.nc ${file_in}
717                elif [ ${nb_rebuild_file} -gt 1 ] ; then
718                    IGCM_debug_Print 2 "Parallelism detected rebuilding ${file_in} is needed"
719                    if ( [ X${config_Post_RebuildFrequency} = X${NULL_STR} ] || [ X${config_Post_RebuildFrequency} = XNONE ] ) ; then
720                        IGCM_debug_Print 2 "Rebuilding ${file_in} online"
721                        IGCM_sys_rebuild ${file_in} ${generic_file_name}_*.nc
722                    else
723                        IGCM_debug_Print 2 "Preparing offline rebuild for ${file_in}"
724                        [ ! -d ${RUN_DIR}/REBUILD_${PeriodDateBegin} ] && IGCM_sys_Mkdir ${RUN_DIR}/REBUILD_${PeriodDateBegin}
725                        IGCM_sys_Mv ${generic_file_name}_????.nc ${RUN_DIR}/REBUILD_${PeriodDateBegin}
726                        # Attention au quota si on tourne dans un RUN_DIR_PATH maison
727                        for DelFile in $( ls REBUILD_${PeriodDateBegin}/* | grep "${generic_file_name}[_0-9]*.nc" ) ; do
728                            eval FileToBeDeleted[${#FileToBeDeleted[@]}]=${DelFile} > /dev/null 2>&1
729                        done
730
731                        # Prepare headers for the shell dedicated to offline rebuild
732                        if [ ! -f ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh ] ; then
733                            echo \#!/bin/ksh                                           > ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
734                            echo function IGCM_FlushRebuild                           >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
735                            echo {                                                    >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
736                            echo IGCM_debug_PushStack "IGCM_FlushRebuild"             >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
737                            echo echo                                                 >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
738                            echo IGCM_debug_Print 1 "IGCM_FlushRebuild"               >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
739                            echo echo                                                 >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
740                        fi
741                        # Prepare the shell dedicated to offline rebuild
742                        echo IGCM_sys_rebuild ${file_in} ${generic_file_name}_*.nc    >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
743                        #
744                        # Load Patch we need to apply and apply
745                        if [ X$( eval echo \${${compname}_${flag_post}_Patches[0]} ) !=  X${NULL_STR} ]; then
746                            for Patch in $( eval echo \${${compname}_${flag_post}_Patches[*]} ); do
747                                echo . ${libIGCM_POST}/libIGCM_post/IGCM_${Patch}.ksh >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
748                                echo IGCM_${Patch} ${file_in}                         >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
749                            done
750                        fi
751                        #
752                        echo IGCM_sys_Put_Out ${file_in} ${file_out}                  >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
753                        echo IGCM_sys_Rm ${generic_file_name}_*.nc                    >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
754                        SaveOnArchive=false
755                    fi
756                fi
757                #
758                if [ ${SaveOnArchive} = true ] ; then
759                    #
760                    # If we need to apply a patch we use TMP DIRECTORY before ARCHIVING if asynchronous rebuild is on
761                    #
762                    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
763                        if [ -f ${file_in} ] ; then
764                            IGCM_sys_Mv ${file_in} ${RUN_DIR}/REBUILD_${PeriodDateBegin}
765                            eval FileToBeDeleted[${#FileToBeDeleted[@]}]=REBUILD_${PeriodDateBegin}/${file_in} > /dev/null 2>&1
766                            #
767                            for Patch in $( eval echo \${${compname}_${flag_post}_Patches[*]} ); do
768                                echo . ${libIGCM_POST}/libIGCM_post/IGCM_${Patch}.ksh     >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
769                                echo IGCM_${Patch} ${file_in}                             >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
770                            done
771                            #
772                            echo IGCM_sys_Put_Out ${file_in} ${file_out}                  >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
773                            #
774                        fi
775                    else
776                        IGCM_sys_Put_Out ${file_in} ${file_out}
777                        [ $? -eq 0 ] && eval FileToBeDeleted[${#FileToBeDeleted[@]}]="${file_in}" > /dev/null 2>&1
778                        if [ ${nb_rebuild_file} -gt 1 ] ; then
779                            for DelFile in $( ls | grep "${generic_file_name}[_0-9]*.nc" ) ; do
780                                eval FileToBeDeleted[${#FileToBeDeleted[@]}]=${DelFile} > /dev/null 2>&1
781                            done
782                        fi
783                    fi
784                fi
785                (( i=i+3 ))
786            done
787        fi
788
789        # Save Output Text files of models
790        #---------------------------------
791       
792        IGCM_card_DefineArrayFromOption ${card} OutputText List
793        ListTextName=${compname}_OutputText_List
794       
795        eval TextName0=\${${ListTextName}[0]} > /dev/null 2>&1
796        if [ X${TextName0} != X${NULL_STR} ] ; then
797            eval NbFiles=\${#${ListTextName}[@]} > /dev/null 2>&1
798
799            (( i=0 ))
800            until [ $i -eq $NbFiles ]; do
801                eval file_in=\${${ListTextName}[$i]} > /dev/null 2>&1
802                (( i=i+1 ))
803
804                nb_text_file=$( ls ${file_in}* 2>/dev/null | wc -l )
805                if [ ${nb_text_file} -gt 1 ] ; then
806                    list_file=$( ls ${file_in}* )
807                    for file in ${list_file}
808                      do
809                      eval IGCM_sys_Put_Out ${file} \${R_OUT_${comp}_D}/${PREFIX}_${file}
810                      eval FileToBeDeleted[${#FileToBeDeleted[@]}]="${file}" > /dev/null 2>&1
811                    done
812                else
813                    if ( [ -f ${file_in}_0000 ] || [ -f ${file_in}0 ] ) ; then
814                        eval IGCM_sys_Mv ${file_in}* ${file_in}
815                    fi
816                    eval IGCM_sys_Put_Out ${file_in} \${R_OUT_${comp}_D}/${PREFIX}_${file_in}
817                    [ $? -eq 0 ] && eval FileToBeDeleted[${#FileToBeDeleted[@]}]="${file_in}" > /dev/null 2>&1
818                fi
819            done
820        fi
821    done
822
823    IGCM_debug_PopStack "IGCM_comp_Finalize"
824}
Note: See TracBrowser for help on using the repository browser.