source: tags/libIGCM_v1_5/libIGCM_sys/libIGCM_sys_obelix.ksh @ 235

Last change on this file since 235 was 228, checked in by mmaipsl, 14 years ago

Supress buggy space after HOST and LOGIN variables.
Add an optionnal argument to all IGCM_sys_Put_Out functions :
if any 3thrd argument is there, file won't be protected. If
there is no argument (default in libIGCM), file will be set read-only.

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