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

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

ACa/SD : Function IGCM_sys_RshArchive will be use to manage NEMO restart in the parallel case

  • 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
756        #USUAL WAY
757        \cp -R $1 $2 > out_rsync 2>&1
758        RET=$?
759
760        if [ ${RET} -gt 0 ] ; then
761            echo "IGCM_sys_Get_Master : error."
762            cat out_rsync
763            IGCM_debug_Exit "IGCM_sys_Get_Master"
764        fi
765    else
766        ( ${DEBUG_debug} ) && echo "DRYRUN mode = " $DRYRUN >> stack
767    fi
768    IGCM_debug_PopStack "IGCM_sys_Get_Master"
769}
770
771#D-#==================================================
772#D-function IGCM_sys_Put_Rest
773#D-* Purpose: commande de transfert des restarts $(ARCHIVE).
774#D-           Quitte si le fichier ou si le répertoire d'arriver n'existe pas.
775#D-* Examples:
776#D-
777function IGCM_sys_Put_Rest {
778    IGCM_debug_PushStack "IGCM_sys_Put_Rest" $@
779    if ( $DEBUG_sys ) ; then
780        echo "IGCM_sys_Put_Rest :" $@
781    fi
782    if [ $DRYRUN = 0 ]; then
783
784        IGCM_sys_TestDirArchive $( dirname $2 )
785
786        if [ ! -f ${1} ] ; then
787            echo "ERROR : IGCM_sys_Put_Rest ${1} DOES NOT EXIST ."
788            IGCM_debug_Exit "IGCM_sys_Put_Rest"
789        fi
790        IGCM_sys_Chmod 444 ${1}
791
792        typeset RET
793
794        echo ${RSYNC} ${RSYNC_opt} $1 $2 > out_rsync 2>&1
795        ${RSYNC} ${RSYNC_opt} $1 $2 >> out_rsync 2>&1
796        RET=$?
797        IGCM_sys_Rsync_out $RET
798
799        ${libIGCM}/libIGCM_sys/IGCM_analyse_rsync_out.awk out_rsync
800        (( RET=RET+$? ))
801
802        if [ ${RET} -gt 0 ] ; then
803            echo "IGCM_sys_Put_Rest : error."
804            cat out_rsync
805            IGCM_debug_Exit "IGCM_sys_Put_Rest"
806        fi
807    else
808        ( ${DEBUG_debug} ) && echo "DRYRUN mode = " $DRYRUN >> stack
809    fi
810    IGCM_debug_PopStack "IGCM_sys_Put_Rest"
811}
812
813#D-#==================================================
814#D-function IGCM_sys_Put_Out
815#D-* Purpose: Copy a file on $(ARCHIVE) after have chmod it in readonly
816#D-* Examples:
817#D-
818function IGCM_sys_Put_Out {
819    IGCM_debug_PushStack "IGCM_sys_Put_Out" $@
820    if ( $DEBUG_sys ) ; then
821        echo "IGCM_sys_Put_Out :" $@
822    fi
823    if [ $DRYRUN = 0 ]; then
824        if [ -f ${1} ] ; then
825            if [ ! -d $( dirname $2 ) ] ; then
826                IGCM_sys_MkdirArchive $( dirname $2 )
827            fi
828        else
829            echo "WARNING : IGCM_sys_Put_Out ${1} DOES NOT EXIST ."
830            IGCM_debug_PopStack "IGCM_sys_Put_Out"
831            return 1
832        fi
833
834        typeset RET
835        #
836        IGCM_sys_Chmod 444 ${1}
837        #
838
839        echo ${RSYNC} ${RSYNC_opt} $1 $2 > out_rsync 2>&1
840        ${RSYNC} ${RSYNC_opt} $1 $2 >> out_rsync 2>&1
841        RET=$?
842        IGCM_sys_Rsync_out $RET
843
844        ${libIGCM}/libIGCM_sys/IGCM_analyse_rsync_out.awk out_rsync
845        (( RET=RET+$? ))
846
847        if [ ${RET} -gt 0 ] ; then
848            echo "IGCM_sys_Put_Out : error."
849            cat out_rsync
850            IGCM_debug_Exit "IGCM_sys_Put_Out"
851        fi
852    else
853        ( ${DEBUG_debug} ) && echo "DRYRUN mode = " $DRYRUN >> stack
854    fi
855    IGCM_debug_PopStack "IGCM_sys_Put_Out"
856    return 0
857}
858
859#D-#==================================================
860#D-function IGCM_sys_Get
861#D-* Purpose: Get a file from ${ARCHIVE}
862#D-* Examples: IGCM_sys_Get myfile /destpath/myfile_with_PREFIX
863#D-            IGCM_sys_Get /l Array_contain_myfiles /destpath/
864function IGCM_sys_Get {
865    IGCM_debug_PushStack "IGCM_sys_Get" $@
866
867    typeset DEST RET dm_liste ifile target
868
869    if ( $DEBUG_sys ) ; then
870        echo "IGCM_sys_Get :" $@
871    fi
872    if [ $DRYRUN -le 2 ]; then
873        if [ X${1} = X'/l' ] ; then
874            # test if the first file is present in the old computation :
875            eval set +A dm_liste \${${2}}
876        else
877            dm_liste=${1}
878        fi
879        eval DEST=\${${#}}
880
881        # test if the (first) file is present in the old computation :
882        IGCM_sys_TestFileArchive ${dm_liste[0]}
883        RET=$?
884        if [ ${RET} -gt 0 ] ; then
885            echo "IGCM_sys_Get, ERROR : regular file ${dm_liste[0]} DOES NOT EXIST ."
886            IGCM_debug_Exit "IGCM_sys_Get"
887            return
888        fi
889
890        (( RET=0 ))
891        for target in ${dm_liste[*]} ; do
892          ln -s ${target} ${DEST} >> out_rsync 2>&1
893          (( RET=RET+$? ))
894        done
895
896#       echo ${RSYNC} ${RSYNC_opt} $@ > out_rsync 2>&1
897#       ${RSYNC} ${RSYNC_opt} $@ >> out_rsync 2>&1
898#       RET=$?
899#       IGCM_sys_Rsync_out $RET
900
901#       ${libIGCM}/libIGCM_sys/IGCM_analyse_rsync_out.awk out_rsync
902#       (( RET=RET+$? ))
903
904        if [ ${RET} -gt 0 ] ; then
905            echo "IGCM_sys_Get : copy error."
906            cat out_rsync
907            IGCM_debug_Exit "IGCM_sys_Get"
908        fi
909    else
910        ( ${DEBUG_debug} ) && echo "DRYRUN mode = " $DRYRUN >> stack
911    fi
912    IGCM_debug_PopStack "IGCM_sys_Get"
913}
914
915#D-#==================================================
916#D-function IGCM_sys_Put_Dods
917#D-* Purpose: DO NOTHING ! Put $(ARCHIVE) files on DODS internet protocole.
918#D-* Examples:
919#D-
920function IGCM_sys_Put_Dods {
921    IGCM_debug_PushStack "IGCM_sys_Put_Dods" $@
922    if ( $DEBUG_sys ) ; then
923        echo "IGCM_sys_Put_Dods :" $@
924    fi
925    if [ $DRYRUN = 0 ]; then
926        if [ ! -f ${1} ] ; then
927            echo "WARNING : IGCM_sys_Put_Dods ${1} DOES NOT EXIST ."
928            IGCM_debug_PopStack "IGCM_sys_Put_Dods"
929            return
930        fi
931        #DO NOTHING
932    else
933        IGCM_err "DRYRUN mode = " $DRYRUN
934    fi
935    IGCM_debug_PopStack "IGCM_sys_Put_Dods"
936}
937
938############################################################## A REVOIR !!
939
940#D-#==================================================
941#D-function IGCM_sys_Rapatrie
942#D-* Purpose: Rapatrie
943#D-* Examples:
944#D-
945function IGCM_sys_Rapatrie {
946    IGCM_debug_PushStack "IGCM_sys_Rapatrie" $@
947    if ( $DEBUG_sys ) ; then
948        echo "IGCM_sys_Rapatrie :" $@
949    fi
950
951    typeset RET=0
952
953    IGCM_sys_Get ${R_STOCKAGE}/$2 $1 ;
954    let $(( RET=RET+$? ))
955    IGCM_sys_Cd $1 ;
956    let $(( RET=RET+$? ))
957    IGCM_sys_UnTar $2 ;
958    let $(( RET=RET+$? ))
959
960    if [ ${RET} -gt 0 ] ; then
961        echo "IGCM_sys_Rapatrie : erreur."
962        IGCM_debug_Exit "IGCM_sys_Rapatrie"
963    fi
964    IGCM_debug_PopStack "IGCM_sys_Rapatrie"
965}
966
967############################################################## A FINIR !!
968
969#D-#==================================================
970#D-function IGCM_sys_GetDate_FichWork
971#D-* Purpose: donne la date filesys d'un fichier sur le filesystem WORK
972#D-* Examples:
973#D-
974function IGCM_sys_GetDate_FichWork {
975    IGCM_debug_PushStack "IGCM_sys_FichWork" $@
976    if ( $DEBUG_sys ) ; then
977        echo "IGCM_sys_GetDate_FichWork :" $@
978    fi
979    # donne la date filesys d'un fichier sur la machine work
980    IGCM_debug_PopStack "IGCM_sys_FichWork"
981}
982
983#D-#==================================================
984#D-function IGCM_sys_GetDate_FichArchive
985#D-* Purpose: donne la date filesys d'un fichier sur le filesystem ARCHIVE
986#D-* Examples:
987#D-
988function IGCM_sys_GetDate_FichArchive {
989    IGCM_debug_PushStack "IGCM_sys_FichArchive" $@
990    if ( $DEBUG_sys ) ; then
991        echo "IGCM_sys_GetDate_FichArchive :" $@
992    fi
993    IGCM_debug_PopStack "IGCM_sys_FichArchive"
994}
995
996
997##############################################################
998# REBUILD OPERATOR
999
1000function IGCM_sys_rebuild {
1001    IGCM_debug_PushStack "IGCM_sys_rebuild" -- $@
1002    if ( $DEBUG_sys ) ; then
1003        echo "IGCM_sys_rebuild :" $@
1004    fi
1005    /home/mmaipsl/TEMP_LOCAL/PARALLEL/modipsl/bin/rebuild -f -o $@
1006    if [ $? -gt 0 ] ; then
1007       echo "IGCM_sys_rebuild : erreur ${@}."
1008       IGCM_debug_Exit "rebuild"
1009    fi
1010
1011    IGCM_debug_PopStack "IGCM_sys_rebuild"
1012}
1013
1014##############################################################
1015# NCO OPERATOR
1016
1017function IGCM_sys_ncap {
1018    IGCM_debug_PushStack "IGCM_sys_ncap" -- $@
1019    if ( $DEBUG_sys ) ; then
1020        echo "IGCM_sys_ncap :" $@
1021    fi
1022    /usr/local/bin/ncap $@
1023    if [ $? -gt 0 ] ; then
1024       echo "IGCM_sys_ncap : erreur ${@}."
1025#       IGCM_debug_Exit "ncap"
1026    fi
1027
1028    IGCM_debug_PopStack "IGCM_sys_ncap"
1029}
1030
1031ncatted=/usr/local/bin/ncatted
1032# Problem with ksh and string passed in this function to ncatted !
1033# function IGCM_sys_ncatted {
1034#     IGCM_debug_PushStack "IGCM_sys_ncatted" -- $@
1035#     if ( $DEBUG_sys ) ; then
1036#       echo "IGCM_sys_ncatted :" $@
1037#     fi
1038#     /usr/local/bin/ncatted $@
1039#     if [ $? -gt 0 ] ; then
1040#        echo "IGCM_sys_ncatted : erreur ${@}."
1041#        IGCM_debug_Exit "ncatted"
1042#     fi
1043
1044#     IGCM_debug_PopStack "IGCM_sys_ncatted"
1045# }
1046
1047function IGCM_sys_ncbo {
1048    IGCM_debug_PushStack "IGCM_sys_ncbo" -- $@
1049    if ( $DEBUG_sys ) ; then
1050        echo "IGCM_sys_ncbo :" $@
1051    fi
1052    /usr/local/bin/ncbo $@
1053    if [ $? -gt 0 ] ; then
1054       echo "IGCM_sys_ncbo : erreur ${@}."
1055#       IGCM_debug_Exit "ncbo"
1056    fi
1057
1058    IGCM_debug_PopStack "IGCM_sys_ncbo"
1059}
1060
1061function IGCM_sys_ncdiff {
1062    IGCM_debug_PushStack "IGCM_sys_ncdiff" -- $@
1063    if ( $DEBUG_sys ) ; then
1064        echo "IGCM_sys_ncdiff :" $@
1065    fi
1066    /usr/local/bin/ncdiff $@
1067    if [ $? -gt 0 ] ; then
1068       echo "IGCM_sys_ncdiff : erreur ${@}."
1069#       IGCM_debug_Exit "ncdiff"
1070    fi
1071
1072    IGCM_debug_PopStack "IGCM_sys_ncdiff"
1073}
1074
1075function IGCM_sys_ncea {
1076    IGCM_debug_PushStack "IGCM_sys_ncea" -- $@
1077    if ( $DEBUG_sys ) ; then
1078        echo "IGCM_sys_ncea :" $@
1079    fi
1080    /usr/local/bin/ncea $@
1081    if [ $? -gt 0 ] ; then
1082       echo "IGCM_sys_ncea : erreur ${@}."
1083#       IGCM_debug_Exit "ncea"
1084    fi
1085
1086    IGCM_debug_PopStack "IGCM_sys_ncea"
1087}
1088
1089function IGCM_sys_ncecat {
1090    IGCM_debug_PushStack "IGCM_sys_ncecat" -- $@
1091    if ( $DEBUG_sys ) ; then
1092        echo "IGCM_sys_ncecat :" $@
1093    fi
1094    /usr/local/bin/ncecat $@
1095    if [ $? -gt 0 ] ; then
1096       echo "IGCM_sys_ncecat : erreur ${@}."
1097#       IGCM_debug_Exit "ncecat"
1098    fi
1099
1100    IGCM_debug_PopStack "IGCM_sys_ncecat"
1101}
1102
1103function IGCM_sys_ncflint {
1104    IGCM_debug_PushStack "IGCM_sys_ncflint" -- $@
1105    if ( $DEBUG_sys ) ; then
1106        echo "IGCM_sys_ncflint :" $@
1107    fi
1108    /usr/local/bin/ncflint $@
1109    if [ $? -gt 0 ] ; then
1110       echo "IGCM_sys_ncflint : erreur ${@}."
1111#       IGCM_debug_Exit "ncflint"
1112    fi
1113
1114    IGCM_debug_PopStack "IGCM_sys_ncflint"
1115}
1116
1117function IGCM_sys_ncks {
1118    IGCM_debug_PushStack "IGCM_sys_ncks" -- $@
1119    if ( $DEBUG_sys ) ; then
1120        echo "IGCM_sys_ncks :" $@
1121    fi
1122    /usr/local/bin/ncks $@
1123    if [ $? -gt 0 ] ; then
1124       echo "IGCM_sys_ncks : erreur ${@}."
1125#       IGCM_debug_Exit "ncks"
1126    fi
1127
1128    IGCM_debug_PopStack "IGCM_sys_ncks"
1129}
1130
1131function IGCM_sys_ncpdq {
1132    IGCM_debug_PushStack "IGCM_sys_ncpdq" -- $@
1133    if ( $DEBUG_sys ) ; then
1134        echo "IGCM_sys_ncpdq :" $@
1135    fi
1136    /usr/local/bin/ncpdq $@
1137    if [ $? -gt 0 ] ; then
1138       echo "IGCM_sys_ncpdq : erreur ${@}."
1139#       IGCM_debug_Exit "ncpdq"
1140    fi
1141
1142    IGCM_debug_PopStack "IGCM_sys_ncpdq"
1143}
1144
1145function IGCM_sys_ncra {
1146    IGCM_debug_PushStack "IGCM_sys_ncra" -- $@
1147    if ( $DEBUG_sys ) ; then
1148        echo "IGCM_sys_ncra :" $@
1149    fi
1150    /usr/local/bin/ncra $@
1151    if [ $? -gt 0 ] ; then
1152       echo "IGCM_sys_ncra : erreur ${@}."
1153#       IGCM_debug_Exit "ncra"
1154    fi
1155
1156    IGCM_debug_PopStack "IGCM_sys_ncra"
1157}
1158
1159function IGCM_sys_ncrcat {
1160    IGCM_debug_PushStack "IGCM_sys_ncrcat" -- $@
1161    if ( $DEBUG_sys ) ; then
1162        echo "IGCM_sys_ncrcat :" $@
1163    fi
1164    /usr/local/bin/ncrcat $@
1165    if [ $? -gt 0 ] ; then
1166       echo "IGCM_sys_ncrcat : erreur ${@}."
1167#       IGCM_debug_Exit "ncrcat"
1168    fi
1169
1170    IGCM_debug_PopStack "IGCM_sys_ncrcat"
1171}
1172
1173function IGCM_sys_ncrename {
1174    IGCM_debug_PushStack "IGCM_sys_ncrename" -- $@
1175    if ( $DEBUG_sys ) ; then
1176        echo "IGCM_sys_ncrename :" $@
1177    fi
1178    /usr/local/bin/ncrename $@
1179    if [ $? -gt 0 ] ; then
1180       echo "IGCM_sys_ncrename : erreur ${@}."
1181#       IGCM_debug_Exit "ncrename"
1182    fi
1183
1184    IGCM_debug_PopStack "IGCM_sys_ncrename"
1185}
1186
1187function IGCM_sys_ncwa {
1188    IGCM_debug_PushStack "IGCM_sys_ncwa" -- $@
1189    if ( $DEBUG_sys ) ; then
1190        echo "IGCM_sys_ncwa :" $@
1191    fi
1192    /usr/local/bin/ncwa $@
1193    if [ $? -gt 0 ] ; then
1194       echo "IGCM_sys_ncwa : erreur ${@}."
1195#       IGCM_debug_Exit "ncwa"
1196    fi
1197
1198    IGCM_debug_PopStack "IGCM_sys_ncwa"
1199}
1200
1201############################################################
1202# Activate Running Environnment Variables
1203
1204function IGCM_sys_activ_variables {
1205    IGCM_debug_PushStack "IGCM_sys_activ_variables"
1206    if ( $DEBUG_sys ) ; then
1207        echo "IGCM_sys_activ_variables"
1208    fi
1209    IGCM_debug_PopStack "IGCM_sys_activ_variables"
1210}
1211
1212############################################################
1213# Desactivate Running Environnment Variables
1214
1215function IGCM_sys_desactiv_variables {
1216    IGCM_debug_PushStack "IGCM_sys_desactiv_variables"
1217    if ( $DEBUG_sys ) ; then
1218        echo "IGCM_sys_desactiv_variables "
1219    fi
1220    IGCM_debug_PopStack "IGCM_sys_desactiv_variables "
1221}
1222
1223############################################################
1224# Build run file
1225
1226function IGCM_sys_build_run_file {
1227    IGCM_debug_PushStack "IGCM_sys_build_run_file"
1228    if ( $DEBUG_sys ) ; then
1229        echo "IGCM_sys_build_run_file "
1230    fi
1231    IGCM_debug_PopStack "IGCM_sys_build_run_file "
1232}
Note: See TracBrowser for help on using the repository browser.