source: tags/libIGCM_v1_8-old/libIGCM_sys/libIGCM_sys_mercurex8.ksh @ 1170

Last change on this file since 1170 was 354, checked in by mmaipsl, 14 years ago

First test with mercure-old. Not verified yet !
I will commit modipsl/util/mod.def file and send an email when it is OK.

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