source: trunk/libIGCM/libIGCM_sys/libIGCM_sys_calculo.ksh @ 39

Last change on this file since 39 was 39, checked in by sdipsl, 16 years ago

SD : Add sleep 60 in function IGCM_sys_Get_Master to prevent NFS problem

  • 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: 32.7 KB
Line 
1#!/bin/ksh
2
3#**************************************************************
4# Author: Sebastien Denvil, Martial Mancip
5# Contact: 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#=========================================================
17# The documentation of this file can be automatically generated
18# if you use the prefix #D- for comments to be extracted.
19# Extract with command: cat lib* | grep "^#D-" | cut -c "4-"
20#=========================================================
21 
22#D-#==================================================
23#D-LibIGCM_sys for IPSL calculo
24#D-#==================================================
25#D-
26#D- This ksh library if a layer under some usefull
27#D- environment variables and shell commands.
28#D- All those definitions depend on host particularities.
29#D- It manages a stack mechanism and test validity of operations.
30#D- All function described bellow must be prefixed by IGCM_sys.
31
32#====================================================
33# libIGCM_sys PARAMETERS
34#====================================================
35
36#====================================================
37#set DEBUG_sys to true to output calls of function
38typeset -r DEBUG_sys=${DEBUG_sys:=true}
39
40#====================================================
41# Turn in dry run mode ? (sys_Put_Rest, sys_Put_Out, sys_Get)
42typeset -r DRYRUN=${DRYRUN:=0}
43
44# YOU MUST COMPILE YOUR EXE FILES FOR DRYRUN MODE !
45# -------------------------------------------------------------------------------------
46# | DRYRUN=  |  Date computations, | sys_Get    |  Exe    | sys_Put_Out; sys_Put_Rest |
47# |          |  Cp/Exe param files |            |  Chmod  |                           |
48# |          |      Qsub           |            |         |                           |
49# -------------------------------------------------------------------------------------
50# |    0     |       yes           |    yes     |  yes    |      yes                  |
51# -------------------------------------------------------------------------------------
52# |    1     |       yes           |    yes     |  yes    |      no                   |
53# -------------------------------------------------------------------------------------
54# |    2     |       yes           |    yes     |  no     |      no                   |
55# -------------------------------------------------------------------------------------
56# |    3     |       yes           |    no      |  no     |      no                   |
57# -------------------------------------------------------------------------------------
58
59#=====================================================
60#Global Variables :
61#=====================================================
62# Language : "fr" or "en"
63typeset -r MYLANG="fr"
64
65#=====================================================
66# Host and user names
67# $hostname ou hostname
68typeset -r HOST=$( hostname )
69# $username ou whoami
70typeset -r LOGIN=$( whoami )
71
72#D-
73#D-#==================================================
74#D-Program used in libIGCM
75#D-#==================================================
76
77# rsync with path
78typeset -r RSYNC=/usr/bin/rsync 
79#RSYNC_opt args to rsync
80typeset -r RSYNC_opt="-Lt -v"
81
82#====================================================
83# Source Ferret
84. /usr/local/ferret/ferret_paths_ksh
85. /home/brocksce/.atlas_env_calcul_ksh
86
87export FER_DATA="$FER_DATA /home/mc2ipsl/temp_local/grids"
88
89#=========================================================
90# Host specific DIRECTORIES
91#====================================================
92
93#====================================================
94#- R_EXE   (==> BIN_DIR = ${MODIPSL}/bin )
95typeset -r R_EXE="${MODIPSL}/bin"
96
97#====================================================
98#- libIGCM_POST
99typeset -r libIGCM_POST=${libIGCM}
100
101#====================================================
102#- SCRATCHDIR (=> ${R_DONNEES})
103typeset -r SCRATCHDIR=/home/${LOGIN}/TEMP_LOCAL
104
105#====================================================
106#- SUBMIT_DIR : submission dir
107typeset -r SUBMIT_DIR=${SUBMIT_DIR:=${PWD}}
108
109#====================================================
110#- ARCHIVE
111typeset -r ARCHIVE=/home
112
113#====================================================
114#- IN
115typeset -r R_IN=${R_IN:=${ARCHIVE}/${LOGIN}/TEMP_LOCAL/SCRIPTS}
116
117#====================================================
118#- OUT
119typeset -r R_OUT=${ARCHIVE}/${LOGIN}/TEMP_LOCAL/SCRIPTS/IGCM_OUT
120
121#====================================================
122#- OUT_POST
123typeset -r R_OUT_POST=${SCRATCHDIR}
124
125#====================================================
126#- RUN_DIR_PATH : Temporary working directory (=> TMP)
127typeset -r RUN_DIR_PATH=${RUN_DIR_PATH:=${SCRATCHDIR}/tmp$$}
128
129#=========================================================
130#- Add "time" before mpirun command
131MPIRUN_COMMAND="time "${MPIRUN_COMMAND}
132echo ${MPIRUN_COMMAND}
133
134#D-#==================================================
135#D-function IGCM_sys_RshMaster
136#D-* Purpose: Master rsh command
137#D-* Examples:
138#D-
139function IGCM_sys_RshMaster {
140    IGCM_debug_PushStack "IGCM_sys_RshMaster" $@
141    ssh ${HOST} /bin/ksh  <<-EOF
142    export libIGCM=${libIGCM}
143    . ${libIGCM}/libIGCM_debug/libIGCM_debug.ksh
144    . ${libIGCM}/libIGCM_card/libIGCM_card.ksh
145    ${@}
146EOF
147    if [ $? -gt 0 ] ; then
148        echo "IGCM_sys_RshMaster : erreur."
149        IGCM_debug_Exit "IGCM_sys_RshMaster"
150    fi
151    IGCM_debug_PopStack "IGCM_sys_RshMaster"
152}
153
154#D-#==================================================
155#D-function IGCM_sys_RshArchive
156#D-* Purpose: Archive rsh command
157#D-* Examples:
158#D-
159function IGCM_sys_RshArchive {
160    IGCM_debug_PushStack "IGCM_sys_RshArchive" $@
161    /bin/ksh ${@}
162    if [ $? -gt 0 ] ; then
163        echo "IGCM_sys_RshArchive : erreur."
164        IGCM_debug_Exit "IGCM_sys_RshArchive"
165    fi
166    IGCM_debug_PopStack "IGCM_sys_RshArchive"
167}
168
169#D-#==================================================
170#D-function IGCM_sys_RshPost
171#D-* Purpose: Master rsh command
172#D-* Examples:
173#D-
174(( RshPNum = 0 ))
175function IGCM_sys_RshPost {
176    IGCM_debug_PushStack "IGCM_sys_RshPost" $@
177    if ( $DEBUG_sys ) ; then
178        echo "IGCM_sys_RshPost :" $@
179    fi
180    #ssh ${HOST} exec /bin/ksh -vx $@ > out_RshPost.${RshPNum}
181    ssh ${HOST} exec /bin/ksh $@ > out_RshPost.${RshPNum}
182    if [ $? -gt 0 ] ; then
183        echo "IGCM_sys_RshPost : erreur."
184        IGCM_debug_Exit "IGCM_sys_RshPost"
185    fi
186    (( RshPNum = RshPNum + 1 ))
187    IGCM_debug_PopStack "IGCM_sys_RshPost"
188}
189
190#D-#==================================================
191#D-function IGCM_sys_Mkdir
192#D-* Purpose: Master locale mkdir command
193#D-* Examples:
194#D-
195function IGCM_sys_Mkdir {
196    IGCM_debug_PushStack "IGCM_sys_Mkdir" $@
197    if ( $DEBUG_sys ) ; then
198        echo "IGCM_sys_Mkdir :" $@
199    fi
200    if [ ! -d ${1} ]; then
201        \mkdir -p $1
202        if [ $? -gt 0 ] ; then
203            echo "IGCM_sys_Mkdir : erreur."
204            IGCM_debug_Exit "IGCM_sys_Mkdir"
205        fi
206    fi
207    # vérification :
208    if [ ! -d ${1} ] ; then
209        echo "IGCM_sys_Mkdir : erreur."
210        IGCM_debug_Exit "IGCM_sys_Mkdir"
211    fi
212    IGCM_debug_PopStack "IGCM_sys_Mkdir"
213}
214
215#D-#==================================================
216#D-function IGCM_sys_MkdirArchive
217#D-* Purpose: Mkdir on Archive
218#D-* Examples:
219#D-
220function IGCM_sys_MkdirArchive {
221    IGCM_debug_PushStack "IGCM_sys_MkdirArchive" $@
222    if ( $DEBUG_sys ) ; then
223        echo "IGCM_sys_MkdirArchive :" $@
224    fi
225    #- creation de repertoire sur le serveur fichier
226    if [ ! -d ${1} ]; then 
227        \mkdir -p $1
228        if [ $? -gt 0 ] ; then
229            echo "IGCM_sys_MkdirArchive : erreur."
230            IGCM_debug_Exit "IGCM_sys_MkdirArchive"
231        fi
232    fi
233    # vérification ?? :
234    if [ ! -d ${1} ] ; then
235        echo "IGCM_sys_MkdirArchive : erreur."
236        IGCM_debug_Exit "IGCM_sys_MkdirArchive"
237    fi
238    IGCM_debug_PopStack "IGCM_sys_MkdirArchive"
239}
240
241#D-#==================================================
242#D-function IGCM_sys_MkdirWork
243#D-* Purpose: Mkdir on Work
244#D-* Examples:
245#D-
246function IGCM_sys_MkdirWork {
247    IGCM_debug_PushStack "IGCM_sys_MkdirWork" $@
248    if ( $DEBUG_sys ) ; then
249        echo "IGCM_sys_MkdirWork :" $@
250    fi
251    #- creation de repertoire sur le serveur fichier
252    if [ ! -d ${1} ]; then 
253        \mkdir -p $1
254        if [ $? -gt 0 ] ; then
255            echo "IGCM_sys_MkdirWork : erreur."
256            IGCM_debug_Exit "IGCM_sys_MkdirWork"
257        fi
258    fi
259    # vérification ?? :
260    if [ ! -d ${1} ] ; then
261        echo "IGCM_sys_MkdirWork : erreur."
262        IGCM_debug_Exit "IGCM_sys_MkdirWork"
263    fi
264    IGCM_debug_PopStack "IGCM_sys_MkdirWork"
265}
266IGCM_sys_MkdirWork ${RUN_DIR_PATH}
267echo "RUN_DIR_PATH ${RUN_DIR_PATH} ok."
268
269#D-#==================================================
270#D-function IGCM_sys_Cd
271#D-* Purpose: master cd command
272#D-* Examples:
273#D-
274function IGCM_sys_Cd {
275    IGCM_debug_PushStack "IGCM_sys_Cd" $@
276    if ( $DEBUG_sys ) ; then
277        echo "IGCM_sys_Cd :" $@
278    fi
279    \cd $1
280    if [ $? -gt 0 ] ; then
281        echo "IGCM_sys_Cd : erreur."
282        IGCM_debug_Exit "IGCM_sys_Cd"
283    fi
284    IGCM_debug_PopStack "IGCM_sys_Cd"
285}
286
287#D-#==================================================
288#D-function IGCM_sys_Chmod
289#D-* Purpose: Chmod
290#D-* Examples:
291#D-
292function IGCM_sys_Chmod {
293    IGCM_debug_PushStack "IGCM_sys_Chmod" $@
294    if ( $DEBUG_sys ) ; then
295        echo "IGCM_sys_Chmod :" $@
296    fi
297    if [ $DRYRUN -le 1 ]; then
298        \chmod $@
299        if [ $? -gt 0 ] ; then
300            echo "IGCM_sys_Chmod : erreur."
301            IGCM_debug_Exit "IGCM_sys_Chmod"
302        fi
303    else
304        ( ${DEBUG_debug} ) && echo "DRYRUN mode = " $DRYRUN >> stack
305    fi
306    IGCM_debug_PopStack "IGCM_sys_Chmod"
307}
308
309#D-#==================================================
310#D-function IGCM_sys_FileSize
311#D-* Purpose: Filesize
312#D-* Examples:
313#D-
314function IGCM_sys_FileSize {
315    IGCM_debug_PushStack "IGCM_sys_FileSize" $@
316
317    typeset sizeF
318    set +A sizeF -- $( ls -la ${1} )
319    if [ $? -gt 0 ] ; then
320        IGCM_debug_Exit "IGCM_sys_FileSize"
321    fi
322    eval ${2}=${sizeF[4]}
323
324    IGCM_debug_PopStack "IGCM_sys_FileSize"
325}
326
327#D-#==================================================
328#D-function IGCM_sys_TestDir
329#D-* Purpose: Test Directory that must exists
330#D-* Examples:
331#D-
332function IGCM_sys_TestDir {
333    IGCM_debug_PushStack "IGCM_sys_TestDir" $@
334    if ( $DEBUG_sys ) ; then
335        echo "IGCM_sys_TestDir :" $@
336    fi
337    if [ ! -d ${1} ]; then
338        echo "IGCM_sys_TestDir : Directory $1 does not exist."
339        IGCM_debug_Exit "IGCM_sys_TestDir"
340    fi
341    IGCM_debug_PopStack "IGCM_sys_TestDir"
342}
343
344#D-#==================================================
345#D-function IGCM_sys_TestDirArchive
346#D-* Purpose: Test Directory that must exists on Archive
347#D-* Examples:
348#D-
349function IGCM_sys_TestDirArchive {
350    IGCM_debug_PushStack "IGCM_sys_TestDirArchive" $@
351    if ( $DEBUG_sys ) ; then
352        echo "IGCM_sys_TestDirArchive :" $@
353    fi
354    if [ ! -d ${1} ]; then
355        echo "IGCM_sys_TestDirArchive : Directory $1 does not exist on ${ARCHIVE}."
356        IGCM_debug_Exit "IGCM_sys_TestDirArchive"
357    fi
358    IGCM_debug_PopStack "IGCM_sys_TestDirArchive"
359}
360
361#D-#==================================================
362#D-function IGCM_sys_TestFileArchive
363#D-* Purpose: Test file that must NOT EXISTS on Archive
364#D-* Examples:
365#D-
366function IGCM_sys_TestFileArchive {
367    IGCM_debug_PushStack "IGCM_sys_TestFileArchive" $@
368    if ( $DEBUG_sys ) ; then
369        echo "IGCM_sys_TestFileArchive :" $@
370    fi
371    if [ ! -f ${1} ]; then
372        IGCM_debug_PopStack "IGCM_sys_TestFileArchive"
373        return 1
374    else
375        IGCM_debug_PopStack "IGCM_sys_TestFileArchive"
376        return 0
377    fi
378}
379
380#D-#==================================================
381#D-function IGCM_sys_Tree
382#D-* Purpose: Tree directories with files on ${ARCHIVE}
383#D-* Examples: IGCM_sys_Tree ${R_IN} ${R_OUT}
384#D-
385function IGCM_sys_Tree {
386    IGCM_debug_PushStack "IGCM_sys_Tree" $@
387    if ( $DEBUG_sys ) ; then
388        echo "IGCM_sys_Tree :" $@
389    fi
390
391    /home/mmaipsl/BIN/tree -f $@
392
393    IGCM_debug_PopStack "IGCM_sys_Tree"
394}
395
396#D-#==================================================
397#D-function IGCM_sys_Tar
398#D-* Purpose: master un-tar command
399#D-* Examples:
400#D-
401function IGCM_sys_Tar {
402    IGCM_debug_PushStack "IGCM_sys_Tar" $@
403    if ( $DEBUG_sys ) ; then
404        echo "IGCM_sys_Tar :" $@
405    fi
406    \tar cvf $@
407    if [ $? -gt 0 ] ; then
408        echo "IGCM_sys_Tar : erreur."
409        IGCM_debug_Exit "IGCM_sys_Tar"
410    fi
411    \tar tvf $1
412
413    IGCM_debug_PopStack "IGCM_sys_Tar"
414}
415
416#D-#==================================================
417#D-function IGCM_sys_UnTar
418#D-* Purpose: master un-tar command
419#D-* Examples:
420#D-
421function IGCM_sys_UnTar {
422    IGCM_debug_PushStack "IGCM_sys_UnTar" $@
423    if ( $DEBUG_sys ) ; then
424        echo "IGCM_sys_UnTar :" $@
425    fi
426    \tar xvf $1
427    if [ $? -gt 0 ] ; then
428        echo "IGCM_sys_UnTar : erreur."
429        IGCM_debug_Exit "IGCM_sys_UnTar"
430    fi
431    IGCM_debug_PopStack "IGCM_sys_UnTar"
432}
433
434#D-#==================================================
435#D-function IGCM_sys_Qsub
436#D-* Purpose: Qsub new job
437#D-* Examples:
438#D-
439function IGCM_sys_Qsub {
440    IGCM_debug_PushStack "IGCM_sys_Qsub" $@
441    if ( $DEBUG_sys ) ; then
442        echo "IGCM_sys_Qsub :" $@
443    fi
444    echo "ssh -l ${LOGIN} ${HOST} ""cd ${SUBMIT_DIR} ; ${@}"" > ${Script_Output} 2>&1 &"
445    ssh -l ${LOGIN} ${HOST} "cd ${SUBMIT_DIR} ; ${@}" > ${Script_Output} 2>&1 &
446    if [ $? -gt 0 ] ; then
447        echo "IGCM_sys_Qsub : erreur."
448        IGCM_debug_Exit "IGCM_sys_Qsub"
449    fi
450    IGCM_debug_PopStack "IGCM_sys_Qsub"
451}
452
453#D-#==================================================
454#D-function IGCM_sys_QsubPost
455#D-* Purpose: Qsub new job on scalaire
456#D-* Examples:
457#D-
458function IGCM_sys_QsubPost {
459    IGCM_debug_PushStack "IGCM_sys_QsubPost" $@
460    if ( $DEBUG_sys ) ; then
461        echo "IGCM_sys_QsubPost :" $@
462    fi
463    #echo "ssh -x -l ${LOGIN} ${HOST} ${3} > ${2} 2>&1 &"
464    #    ssh -x -l ${LOGIN} ${HOST}
465    echo "${3} > ${2} 2>&1 &"
466    ${3} > ${2} 2>&1 &
467    if [ $? -gt 0 ] ; then
468        echo "IGCM_sys_QsubPost : erreur."
469        IGCM_debug_Exit "IGCM_sys_QsubPost"
470    fi
471    IGCM_debug_PopStack "IGCM_sys_QsubPost"
472}
473
474#D-*************************
475#D- File transfer functions
476#D-*************************
477#D-
478
479#D-#==================================================
480#D-function IGCM_sys_Rsync_out
481#D-* Purpose: treat return val of rsync
482#D-* Examples:  IGCM_sys_Rsync_out out_RET_rsync
483#D-  Error values and explanations can depend on your system version.
484function IGCM_sys_Rsync_out {
485    RET=$1
486    if [ ! $RET ] ; then
487        echo "rsync error !"
488    fi
489
490    if [ $MYLANG = "fr" ]; then
491        case $RET in
492            0)  return ;;
493            1)  echo "Erreur de rsync ; RERR_SYNTAX : "
494                echo "Erreur de syntaxe ou d'utilisation."
495                return;;
496            2)  echo "Erreur de rsync ; RERR_PROTOCOL : "
497                echo "Incompatibilité de protocole."
498                return;;
499            3)  echo "Erreur de rsync ; RERR_FILESELECT 3"
500                echo "Erreurs  lors  de  la  sélection des fichiers d'entrée sortie et"
501                echo "répertoires"
502                return;;
503            4)  echo "Erreur de rsync ; RERR_UNSUPPORTED"
504                echo "Action demandée non supportée : une tentative de manipulation de"
505                echo "fichiers  64-bits  sur une plate-forme qui ne les supporte pas a"
506                echo "été faite ; ou une option qui est supportée par le  client  mais"
507                echo "pas par le serveur a été spécifiée."
508                return;;
509            10) echo "Erreur de rsync ; RERR_SOCKETIO"
510                echo "Erreur dans le socket d'entrée sortie"
511                return;;
512            11) echo "Erreur de rsync ; RERR_FILEIO"
513                echo "Erreur d'entrée sortie fichier"
514                return;;
515            12) echo "Erreur de rsync ; RERR_STREAMIO"
516                echo "Erreur dans flux de donnée du protocole rsync"
517                return;;
518            13) echo "Erreur de rsync ; RERR_MESSAGEIO"
519                echo "Erreur avec les diagnostics du programme"
520                return;;
521            14) echo "Erreur de rsync ; RERR_IPC"
522                echo "Erreur dans le code IPC"
523                return;;
524            20) echo "Erreur de rsync ; RERR_SIGNAL"
525                echo "SIGUSR1 ou SIGINT reçu"
526                return;;
527            21) echo "Erreur de rsync ; RERR_WAITCHILD"
528                echo "Une erreur retournée par waitpid()"
529                return;;
530            22) echo "Erreur de rsync ; RERR_MALLOC"
531                echo "Erreur lors de l'allocation des tampons de mémoire de coeur"
532                return;;
533            23) echo ""
534                echo "Erreur fichier inexistant"
535                return;;
536            30) echo "Erreur de rsync ; RERR_TIMEOUT"
537                echo "Temps d'attente écoulé dans l'envoi/réception de données"
538                return;;
539            *)  echo "Erreur de rsync : code de retour de rsync inconnu :" $RET
540                return;;
541        esac
542    elif [ $MYLANG = "en" ] ; then
543        case $RET in
544            0)  return;;               
545            1)  echo "rsync error : Syntax or usage error "
546                return;;
547            2)  echo "rsync error : Protocol incompatibility "
548                return;;
549            3)  echo "rsync error : Errors selecting input/output files, dirs"
550                return;;
551            4)  echo "rsync error : Requested action not supported: an attempt"
552                echo "was made to manipulate 64-bit files on a platform that cannot support"
553                echo "them; or an option was specified that is supported by the client and"
554                echo "not by the server."
555                return;;
556            5)  echo "rsync error : Error starting client-server protocol"
557                return;;
558            10) echo "rsync error : Error in socket I/O "
559                return;;
560            11) echo "rsync error : Error in file I/O "
561                return;;
562            12) echo "rsync error : Error in rsync protocol data stream "
563                return;;
564            13) echo "rsync error : Errors with program diagnostics "
565                return;;
566            14) echo "rsync error : Error in IPC code "
567                return;;
568            20) echo "rsync error : Received SIGUSR1 or SIGINT "
569                return;;
570            21) echo "rsync error : Some error returned by waitpid() "
571                return;;
572            22) echo "rsync error : Error allocating core memory buffers "
573                return;;
574            23) echo "rsync error : Partial transfer due to error"
575                return;;
576            24) echo "rsync error : Partial transfer due to vanished source files"
577                return;;
578            30) echo "rsync error : Timeout in data send/receive "
579                return;;
580            *)  echo "rsync error : return code of rsync unknown :" $RET
581                return;;
582        esac
583    else
584        echo "unknown language $MYLANG."
585        return
586    fi
587}
588   
589#D-#==================================================
590#D-function IGCM_sys_Cp
591#D-* Purpose: generic cp
592#D-* Examples:
593#D-
594function IGCM_sys_Cp {
595    IGCM_debug_PushStack "IGCM_sys_Cp" $@
596    if ( $DEBUG_sys ) ; then
597        echo "IGCM_sys_Cp :" $@
598    fi
599
600    typeset RET
601
602    echo cp --preserve=timestamps $@ > out_rsync 2>&1
603    \cp --preserve=timestamps $@ >> out_rsync 2>&1
604    RET=$?
605   
606    if [ ${RET} -gt 0 ] ; then
607        echo "IGCM_sys_Cp : error."
608        cat out_rsync
609        IGCM_debug_Exit "IGCM_sys_Cp"
610    fi
611    IGCM_debug_PopStack "IGCM_sys_Cp"
612}
613
614#D-#==================================================
615#D-function IGCM_sys_Rm
616#D-* Purpose: generic rm
617#D-* Examples:
618#D-
619function IGCM_sys_Rm {
620    IGCM_debug_PushStack "IGCM_sys_Rm" $@
621    if ( $DEBUG_sys ) ; then
622        echo "IGCM_sys_Rm :" $@
623    fi
624
625    typeset RET
626
627    echo rm $@ > out_rsync 2>&1
628    \rm $@ >> out_rsync 2>&1
629    RET=$?
630   
631    if [ ${RET} -gt 0 ] ; then
632        echo "IGCM_sys_Rm : error."
633        cat out_rsync
634        IGCM_debug_Exit "IGCM_sys_Rm"
635    fi
636    IGCM_debug_PopStack "IGCM_sys_Rm"
637}
638
639#D-#==================================================
640#D-function IGCM_sys_Mv
641#D-* Purpose: generic move
642#D-* Examples:
643#D-
644function IGCM_sys_Mv {
645    IGCM_debug_PushStack "IGCM_sys_Mv" $@
646    if ( $DEBUG_sys ) ; then
647        echo "IGCM_sys_Mv :" $@
648    fi
649
650    typeset RET
651
652    echo mv $@ > out_rsync 2>&1
653    \mv $@ >> out_rsync 2>&1
654    RET=$?
655   
656    if [ ${RET} -gt 0 ] ; then
657        echo "IGCM_sys_Mv : error in mv."
658        cat out_rsync
659        IGCM_debug_Exit "IGCM_sys_Mv"
660    fi
661
662    IGCM_debug_PopStack "IGCM_sys_Mv"
663}
664
665#D-#==================================================
666#D-function IGCM_sys_Put_Dir
667#D-* Purpose: Copy a complete directory on $(ARCHIVE)
668#D-* Examples:
669#D-
670function IGCM_sys_Put_Dir {
671    IGCM_debug_PushStack "IGCM_sys_Put_Dir" $@
672    if ( $DEBUG_sys ) ; then
673        echo "IGCM_sys_Put_Dir :" $@
674    fi
675    if [ $DRYRUN = 0 ]; then
676        if [ ! -d ${1} ] ; then
677            echo "WARNING : IGCM_sys_Put_Dir ${1} DOES NOT EXIST ."
678            IGCM_debug_PopStack "IGCM_sys_Put_Dir"
679            return
680        fi
681
682        typeset RET
683
684        #
685        #USUAL WAY
686        \cp -R $1 $2 > out_rsync 2>&1
687        RET=$?
688
689        if [ ${RET} -gt 0 ] ; then
690            echo "IGCM_sys_Put_Dir : error."
691            cat out_rsync
692            IGCM_debug_Exit "IGCM_sys_Put_Dir"
693        fi
694    else
695        ( ${DEBUG_debug} ) && echo "DRYRUN mode = " $DRYRUN >> stack
696    fi
697    IGCM_debug_PopStack "IGCM_sys_Put_Dir"
698}
699
700#D-#==================================================
701#D-function IGCM_sys_Get_Dir
702#D-* Purpose: Copy a complete directory from $(ARCHIVE)
703#D-* Examples:
704#D-
705function IGCM_sys_Get_Dir {
706    IGCM_debug_PushStack "IGCM_sys_Get_Dir" $@
707    if ( $DEBUG_sys ) ; then
708        echo "IGCM_sys_Get_Dir :" $@
709    fi
710    if [ $DRYRUN = 0 ]; then
711        if [ ! -d ${1} ] ; then
712            echo "WARNING : IGCM_sys_Get_Dir ${1} DOES NOT EXIST ."
713            IGCM_debug_PopStack "IGCM_sys_Get_Dir"
714            return
715        fi
716
717        typeset RET
718
719        # Only if we use rsync
720        #IGCM_sys_TestDirArchive $( dirname $2 )
721        #
722        #USUAL WAY
723        \cp -R $1 $2 > out_rsync 2>&1
724        RET=$?
725
726        if [ ${RET} -gt 0 ] ; then
727            echo "IGCM_sys_Get_Dir : error."
728            cat out_rsync
729            IGCM_debug_Exit "IGCM_sys_Get_Dir"
730        fi
731    else
732        ( ${DEBUG_debug} ) && echo "DRYRUN mode = " $DRYRUN >> stack
733    fi
734    IGCM_debug_PopStack "IGCM_sys_Get_Dir"
735}
736
737#D-#==================================================
738#D-function IGCM_sys_Get_Master
739#D-* Purpose: Copy a complete directory from MASTER filesystem
740#D-* Examples:
741#D-
742function IGCM_sys_Get_Master {
743    IGCM_debug_PushStack "IGCM_sys_Get_Master" $@
744    if ( $DEBUG_sys ) ; then
745        echo "IGCM_sys_Get_Master :" $@
746    fi
747    if [ $DRYRUN = 0 ]; then
748        if [ ! -d ${1} ] ; then
749            echo "WARNING : IGCM_sys_Get_Master ${1} DOES NOT EXIST ."
750            IGCM_debug_PopStack "IGCM_sys_Get_Master"
751            return
752        fi
753
754        typeset RET
755        sleep 60
756
757        #USUAL WAY
758        \cp -R $1 $2 > out_rsync 2>&1
759        RET=$?
760
761        if [ ${RET} -gt 0 ] ; then
762            echo "IGCM_sys_Get_Master : error."
763            cat out_rsync
764            IGCM_debug_Exit "IGCM_sys_Get_Master"
765        fi
766    else
767        ( ${DEBUG_debug} ) && echo "DRYRUN mode = " $DRYRUN >> stack
768    fi
769    IGCM_debug_PopStack "IGCM_sys_Get_Master"
770}
771
772#D-#==================================================
773#D-function IGCM_sys_Put_Rest
774#D-* Purpose: commande de transfert des restarts $(ARCHIVE).
775#D-           Quitte si le fichier ou si le répertoire d'arriver n'existe pas.
776#D-* Examples:
777#D-
778function IGCM_sys_Put_Rest {
779    IGCM_debug_PushStack "IGCM_sys_Put_Rest" $@
780    if ( $DEBUG_sys ) ; then
781        echo "IGCM_sys_Put_Rest :" $@
782    fi
783    if [ $DRYRUN = 0 ]; then
784
785        IGCM_sys_TestDirArchive $( dirname $2 )
786
787        if [ ! -f ${1} ] ; then
788            echo "ERROR : IGCM_sys_Put_Rest ${1} DOES NOT EXIST ."
789            IGCM_debug_Exit "IGCM_sys_Put_Rest"
790        fi
791        IGCM_sys_Chmod 444 ${1}
792
793        typeset RET
794
795        echo ${RSYNC} ${RSYNC_opt} $1 $2 > out_rsync 2>&1
796        ${RSYNC} ${RSYNC_opt} $1 $2 >> out_rsync 2>&1
797        RET=$?
798        IGCM_sys_Rsync_out $RET
799
800        ${libIGCM}/libIGCM_sys/IGCM_analyse_rsync_out.awk out_rsync
801        (( RET=RET+$? ))
802
803        if [ ${RET} -gt 0 ] ; then
804            echo "IGCM_sys_Put_Rest : error."
805            cat out_rsync
806            IGCM_debug_Exit "IGCM_sys_Put_Rest"
807        fi
808    else
809        ( ${DEBUG_debug} ) && echo "DRYRUN mode = " $DRYRUN >> stack
810    fi
811    IGCM_debug_PopStack "IGCM_sys_Put_Rest"
812}
813
814#D-#==================================================
815#D-function IGCM_sys_Put_Out
816#D-* Purpose: Copy a file on $(ARCHIVE) after have chmod it in readonly
817#D-* Examples:
818#D-
819function IGCM_sys_Put_Out {
820    IGCM_debug_PushStack "IGCM_sys_Put_Out" $@
821    if ( $DEBUG_sys ) ; then
822        echo "IGCM_sys_Put_Out :" $@
823    fi
824    if [ $DRYRUN = 0 ]; then
825        if [ -f ${1} ] ; then
826            if [ ! -d $( dirname $2 ) ] ; then
827                IGCM_sys_MkdirArchive $( dirname $2 )
828            fi
829        else
830            echo "WARNING : IGCM_sys_Put_Out ${1} DOES NOT EXIST ."
831            IGCM_debug_PopStack "IGCM_sys_Put_Out"
832            return 1
833        fi
834
835        typeset RET
836        #
837        IGCM_sys_Chmod 444 ${1}
838        #
839
840        echo ${RSYNC} ${RSYNC_opt} $1 $2 > out_rsync 2>&1
841        ${RSYNC} ${RSYNC_opt} $1 $2 >> out_rsync 2>&1
842        RET=$?
843        IGCM_sys_Rsync_out $RET
844
845        ${libIGCM}/libIGCM_sys/IGCM_analyse_rsync_out.awk out_rsync
846        (( RET=RET+$? ))
847
848        if [ ${RET} -gt 0 ] ; then
849            echo "IGCM_sys_Put_Out : error."
850            cat out_rsync
851            IGCM_debug_Exit "IGCM_sys_Put_Out"
852        fi
853    else
854        ( ${DEBUG_debug} ) && echo "DRYRUN mode = " $DRYRUN >> stack
855    fi
856    IGCM_debug_PopStack "IGCM_sys_Put_Out"
857    return 0
858}
859
860#D-#==================================================
861#D-function IGCM_sys_Get
862#D-* Purpose: Get a file from ${ARCHIVE}
863#D-* Examples: IGCM_sys_Get myfile /destpath/myfile_with_PREFIX
864#D-            IGCM_sys_Get /l Array_contain_myfiles /destpath/
865function IGCM_sys_Get {
866    IGCM_debug_PushStack "IGCM_sys_Get" $@
867
868    typeset DEST RET dm_liste ifile target
869
870    if ( $DEBUG_sys ) ; then
871        echo "IGCM_sys_Get :" $@
872    fi
873    if [ $DRYRUN -le 2 ]; then
874        if [ X${1} = X'/l' ] ; then
875            # test if the first file is present in the old computation :
876            eval set +A dm_liste \${${2}}
877        else
878            dm_liste=${1}
879        fi
880        eval DEST=\${${#}}
881
882        # test if the (first) file is present in the old computation :
883        IGCM_sys_TestFileArchive ${dm_liste[0]}
884        RET=$?
885        if [ ${RET} -gt 0 ] ; then
886            echo "IGCM_sys_Get, ERROR : regular file ${dm_liste[0]} DOES NOT EXIST ."
887            IGCM_debug_Exit "IGCM_sys_Get"
888            return
889        fi
890
891        (( RET=0 ))
892        for target in ${dm_liste[*]} ; do
893          ln -s ${target} ${DEST} >> out_rsync 2>&1
894          (( RET=RET+$? ))
895        done
896
897#       echo ${RSYNC} ${RSYNC_opt} $@ > out_rsync 2>&1
898#       ${RSYNC} ${RSYNC_opt} $@ >> out_rsync 2>&1
899#       RET=$?
900#       IGCM_sys_Rsync_out $RET
901
902#       ${libIGCM}/libIGCM_sys/IGCM_analyse_rsync_out.awk out_rsync
903#       (( RET=RET+$? ))
904
905        if [ ${RET} -gt 0 ] ; then
906            echo "IGCM_sys_Get : copy error."
907            cat out_rsync
908            IGCM_debug_Exit "IGCM_sys_Get"
909        fi
910    else
911        ( ${DEBUG_debug} ) && echo "DRYRUN mode = " $DRYRUN >> stack
912    fi
913    IGCM_debug_PopStack "IGCM_sys_Get"
914}
915
916#D-#==================================================
917#D-function IGCM_sys_Put_Dods
918#D-* Purpose: DO NOTHING ! Put $(ARCHIVE) files on DODS internet protocole.
919#D-* Examples:
920#D-
921function IGCM_sys_Put_Dods {
922    IGCM_debug_PushStack "IGCM_sys_Put_Dods" $@
923    if ( $DEBUG_sys ) ; then
924        echo "IGCM_sys_Put_Dods :" $@
925    fi
926    if [ $DRYRUN = 0 ]; then
927        if [ ! -f ${1} ] ; then
928            echo "WARNING : IGCM_sys_Put_Dods ${1} DOES NOT EXIST ."
929            IGCM_debug_PopStack "IGCM_sys_Put_Dods"
930            return
931        fi
932        #DO NOTHING
933    else
934        IGCM_err "DRYRUN mode = " $DRYRUN
935    fi
936    IGCM_debug_PopStack "IGCM_sys_Put_Dods"
937}
938
939############################################################## A REVOIR !!
940
941#D-#==================================================
942#D-function IGCM_sys_Rapatrie
943#D-* Purpose: Rapatrie
944#D-* Examples:
945#D-
946function IGCM_sys_Rapatrie {
947    IGCM_debug_PushStack "IGCM_sys_Rapatrie" $@
948    if ( $DEBUG_sys ) ; then
949        echo "IGCM_sys_Rapatrie :" $@
950    fi
951
952    typeset RET=0
953
954    IGCM_sys_Get ${R_STOCKAGE}/$2 $1 ;
955    let $(( RET=RET+$? ))
956    IGCM_sys_Cd $1 ;
957    let $(( RET=RET+$? ))
958    IGCM_sys_UnTar $2 ;
959    let $(( RET=RET+$? ))
960
961    if [ ${RET} -gt 0 ] ; then
962        echo "IGCM_sys_Rapatrie : erreur."
963        IGCM_debug_Exit "IGCM_sys_Rapatrie"
964    fi
965    IGCM_debug_PopStack "IGCM_sys_Rapatrie"
966}
967
968############################################################## A FINIR !!
969
970#D-#==================================================
971#D-function IGCM_sys_GetDate_FichWork
972#D-* Purpose: donne la date filesys d'un fichier sur le filesystem WORK
973#D-* Examples:
974#D-
975function IGCM_sys_GetDate_FichWork {
976    IGCM_debug_PushStack "IGCM_sys_FichWork" $@
977    if ( $DEBUG_sys ) ; then
978        echo "IGCM_sys_GetDate_FichWork :" $@
979    fi
980    # donne la date filesys d'un fichier sur la machine work
981    IGCM_debug_PopStack "IGCM_sys_FichWork"
982}
983
984#D-#==================================================
985#D-function IGCM_sys_GetDate_FichArchive
986#D-* Purpose: donne la date filesys d'un fichier sur le filesystem ARCHIVE
987#D-* Examples:
988#D-
989function IGCM_sys_GetDate_FichArchive {
990    IGCM_debug_PushStack "IGCM_sys_FichArchive" $@
991    if ( $DEBUG_sys ) ; then
992        echo "IGCM_sys_GetDate_FichArchive :" $@
993    fi
994    IGCM_debug_PopStack "IGCM_sys_FichArchive"
995}
996
997
998##############################################################
999# REBUILD OPERATOR
1000
1001function IGCM_sys_rebuild {
1002    IGCM_debug_PushStack "IGCM_sys_rebuild" -- $@
1003    if ( $DEBUG_sys ) ; then
1004        echo "IGCM_sys_rebuild :" $@
1005    fi
1006    /home/mmaipsl/TEMP_LOCAL/PARALLEL/modipsl/bin/rebuild -f -o $@
1007    if [ $? -gt 0 ] ; then
1008       echo "IGCM_sys_rebuild : erreur ${@}."
1009       IGCM_debug_Exit "rebuild"
1010    fi
1011
1012    IGCM_debug_PopStack "IGCM_sys_rebuild"
1013}
1014
1015##############################################################
1016# NCO OPERATOR
1017
1018function IGCM_sys_ncap {
1019    IGCM_debug_PushStack "IGCM_sys_ncap" -- $@
1020    if ( $DEBUG_sys ) ; then
1021        echo "IGCM_sys_ncap :" $@
1022    fi
1023    /usr/local/bin/ncap $@
1024    if [ $? -gt 0 ] ; then
1025       echo "IGCM_sys_ncap : erreur ${@}."
1026#       IGCM_debug_Exit "ncap"
1027    fi
1028
1029    IGCM_debug_PopStack "IGCM_sys_ncap"
1030}
1031
1032ncatted=/usr/local/bin/ncatted
1033# Problem with ksh and string passed in this function to ncatted !
1034# function IGCM_sys_ncatted {
1035#     IGCM_debug_PushStack "IGCM_sys_ncatted" -- $@
1036#     if ( $DEBUG_sys ) ; then
1037#       echo "IGCM_sys_ncatted :" $@
1038#     fi
1039#     /usr/local/bin/ncatted $@
1040#     if [ $? -gt 0 ] ; then
1041#        echo "IGCM_sys_ncatted : erreur ${@}."
1042#        IGCM_debug_Exit "ncatted"
1043#     fi
1044
1045#     IGCM_debug_PopStack "IGCM_sys_ncatted"
1046# }
1047
1048function IGCM_sys_ncbo {
1049    IGCM_debug_PushStack "IGCM_sys_ncbo" -- $@
1050    if ( $DEBUG_sys ) ; then
1051        echo "IGCM_sys_ncbo :" $@
1052    fi
1053    /usr/local/bin/ncbo $@
1054    if [ $? -gt 0 ] ; then
1055       echo "IGCM_sys_ncbo : erreur ${@}."
1056#       IGCM_debug_Exit "ncbo"
1057    fi
1058
1059    IGCM_debug_PopStack "IGCM_sys_ncbo"
1060}
1061
1062function IGCM_sys_ncdiff {
1063    IGCM_debug_PushStack "IGCM_sys_ncdiff" -- $@
1064    if ( $DEBUG_sys ) ; then
1065        echo "IGCM_sys_ncdiff :" $@
1066    fi
1067    /usr/local/bin/ncdiff $@
1068    if [ $? -gt 0 ] ; then
1069       echo "IGCM_sys_ncdiff : erreur ${@}."
1070#       IGCM_debug_Exit "ncdiff"
1071    fi
1072
1073    IGCM_debug_PopStack "IGCM_sys_ncdiff"
1074}
1075
1076function IGCM_sys_ncea {
1077    IGCM_debug_PushStack "IGCM_sys_ncea" -- $@
1078    if ( $DEBUG_sys ) ; then
1079        echo "IGCM_sys_ncea :" $@
1080    fi
1081    /usr/local/bin/ncea $@
1082    if [ $? -gt 0 ] ; then
1083       echo "IGCM_sys_ncea : erreur ${@}."
1084#       IGCM_debug_Exit "ncea"
1085    fi
1086
1087    IGCM_debug_PopStack "IGCM_sys_ncea"
1088}
1089
1090function IGCM_sys_ncecat {
1091    IGCM_debug_PushStack "IGCM_sys_ncecat" -- $@
1092    if ( $DEBUG_sys ) ; then
1093        echo "IGCM_sys_ncecat :" $@
1094    fi
1095    /usr/local/bin/ncecat $@
1096    if [ $? -gt 0 ] ; then
1097       echo "IGCM_sys_ncecat : erreur ${@}."
1098#       IGCM_debug_Exit "ncecat"
1099    fi
1100
1101    IGCM_debug_PopStack "IGCM_sys_ncecat"
1102}
1103
1104function IGCM_sys_ncflint {
1105    IGCM_debug_PushStack "IGCM_sys_ncflint" -- $@
1106    if ( $DEBUG_sys ) ; then
1107        echo "IGCM_sys_ncflint :" $@
1108    fi
1109    /usr/local/bin/ncflint $@
1110    if [ $? -gt 0 ] ; then
1111       echo "IGCM_sys_ncflint : erreur ${@}."
1112#       IGCM_debug_Exit "ncflint"
1113    fi
1114
1115    IGCM_debug_PopStack "IGCM_sys_ncflint"
1116}
1117
1118function IGCM_sys_ncks {
1119    IGCM_debug_PushStack "IGCM_sys_ncks" -- $@
1120    if ( $DEBUG_sys ) ; then
1121        echo "IGCM_sys_ncks :" $@
1122    fi
1123    /usr/local/bin/ncks $@
1124    if [ $? -gt 0 ] ; then
1125       echo "IGCM_sys_ncks : erreur ${@}."
1126#       IGCM_debug_Exit "ncks"
1127    fi
1128
1129    IGCM_debug_PopStack "IGCM_sys_ncks"
1130}
1131
1132function IGCM_sys_ncpdq {
1133    IGCM_debug_PushStack "IGCM_sys_ncpdq" -- $@
1134    if ( $DEBUG_sys ) ; then
1135        echo "IGCM_sys_ncpdq :" $@
1136    fi
1137    /usr/local/bin/ncpdq $@
1138    if [ $? -gt 0 ] ; then
1139       echo "IGCM_sys_ncpdq : erreur ${@}."
1140#       IGCM_debug_Exit "ncpdq"
1141    fi
1142
1143    IGCM_debug_PopStack "IGCM_sys_ncpdq"
1144}
1145
1146function IGCM_sys_ncra {
1147    IGCM_debug_PushStack "IGCM_sys_ncra" -- $@
1148    if ( $DEBUG_sys ) ; then
1149        echo "IGCM_sys_ncra :" $@
1150    fi
1151    /usr/local/bin/ncra $@
1152    if [ $? -gt 0 ] ; then
1153       echo "IGCM_sys_ncra : erreur ${@}."
1154#       IGCM_debug_Exit "ncra"
1155    fi
1156
1157    IGCM_debug_PopStack "IGCM_sys_ncra"
1158}
1159
1160function IGCM_sys_ncrcat {
1161    IGCM_debug_PushStack "IGCM_sys_ncrcat" -- $@
1162    if ( $DEBUG_sys ) ; then
1163        echo "IGCM_sys_ncrcat :" $@
1164    fi
1165    /usr/local/bin/ncrcat $@
1166    if [ $? -gt 0 ] ; then
1167       echo "IGCM_sys_ncrcat : erreur ${@}."
1168#       IGCM_debug_Exit "ncrcat"
1169    fi
1170
1171    IGCM_debug_PopStack "IGCM_sys_ncrcat"
1172}
1173
1174function IGCM_sys_ncrename {
1175    IGCM_debug_PushStack "IGCM_sys_ncrename" -- $@
1176    if ( $DEBUG_sys ) ; then
1177        echo "IGCM_sys_ncrename :" $@
1178    fi
1179    /usr/local/bin/ncrename $@
1180    if [ $? -gt 0 ] ; then
1181       echo "IGCM_sys_ncrename : erreur ${@}."
1182#       IGCM_debug_Exit "ncrename"
1183    fi
1184
1185    IGCM_debug_PopStack "IGCM_sys_ncrename"
1186}
1187
1188function IGCM_sys_ncwa {
1189    IGCM_debug_PushStack "IGCM_sys_ncwa" -- $@
1190    if ( $DEBUG_sys ) ; then
1191        echo "IGCM_sys_ncwa :" $@
1192    fi
1193    /usr/local/bin/ncwa $@
1194    if [ $? -gt 0 ] ; then
1195       echo "IGCM_sys_ncwa : erreur ${@}."
1196#       IGCM_debug_Exit "ncwa"
1197    fi
1198
1199    IGCM_debug_PopStack "IGCM_sys_ncwa"
1200}
1201
1202############################################################
1203# Activate Running Environnment Variables
1204
1205function IGCM_sys_activ_variables {
1206    IGCM_debug_PushStack "IGCM_sys_activ_variables"
1207    if ( $DEBUG_sys ) ; then
1208        echo "IGCM_sys_activ_variables"
1209    fi
1210    IGCM_debug_PopStack "IGCM_sys_activ_variables"
1211}
1212
1213############################################################
1214# Desactivate Running Environnment Variables
1215
1216function IGCM_sys_desactiv_variables {
1217    IGCM_debug_PushStack "IGCM_sys_desactiv_variables"
1218    if ( $DEBUG_sys ) ; then
1219        echo "IGCM_sys_desactiv_variables "
1220    fi
1221    IGCM_debug_PopStack "IGCM_sys_desactiv_variables "
1222}
1223
1224############################################################
1225# Build run file
1226
1227function IGCM_sys_build_run_file {
1228    IGCM_debug_PushStack "IGCM_sys_build_run_file"
1229    if ( $DEBUG_sys ) ; then
1230        echo "IGCM_sys_build_run_file "
1231    fi
1232    IGCM_debug_PopStack "IGCM_sys_build_run_file "
1233}
Note: See TracBrowser for help on using the repository browser.