source: trunk/libIGCM/libIGCM_sys/libIGCM_sys_default.ksh @ 1439

Last change on this file since 1439 was 1431, checked in by sdipsl, 6 years ago
  • CMIP6 files go in CCCWORKDIR and alike.
  • 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 Revision Author Date
File size: 37.6 KB
Line 
1#!/bin/ksh
2
3#**************************************************************
4# Author: Sebastien Denvil, Martial Mancip
5# Contact: Martial.Mancip__at__ipsl.jussieu.fr
6# $Revision::                                          $ Revision of last commit
7# $Author::                                            $ Author of last commit
8# $Date::                                              $ Date of last commit
9# IPSL (2006)
10#  This software is governed by the CeCILL licence see libIGCM/libIGCM_CeCILL.LIC
11#
12#**************************************************************
13
14#=========================================================
15# The documentation of this file can be automatically generated
16# if you use the prefix #D- for comments to be extracted.
17# Extract with command: cat lib* | grep "^#D-" | cut -c "4-"
18#=========================================================
19
20#D-#==================================================
21#D-LibIGCM_sys Default host
22#D-#==================================================
23#D-
24#D- This ksh library if a layer under some usefull
25#D-environment variables and shell commands.
26#D-All those definitions depend on host particularities.
27#D-It manages a stack mechanism and test validity of operations.
28#D-All function described bellow must be prefixed by IGCM_sys.
29
30#====================================================
31# libIGCM_sys PARAMETERS
32#====================================================
33
34#====================================================
35# set DEBUG_sys to true to output calls of function
36typeset -r DEBUG_sys=${DEBUG_sys:=true}
37
38#====================================================
39# Turn in dry run mode ? (sys_Put_Rest, sys_Put_Out, sys_Get)
40typeset -r DRYRUN=${DRYRUN:=0}
41
42# YOU MUST COMPILE YOUR EXE FILES FOR DRYRUN MODE !
43# -------------------------------------------------------------------------------------
44# | DRYRUN=  |  Date computations, | sys_Get    |  Exe    | sys_Put_Out; sys_Put_Rest |
45# |          |  Cp/Exe/param/files |            |         |                           |
46# |          |  Chmod Qsub         |            |         |                           |
47# -------------------------------------------------------------------------------------
48# |    0     |       yes           |    yes     |  yes    |      yes                  |
49# -------------------------------------------------------------------------------------
50# |    1     |       yes           |    yes     |  yes    |      no                   |
51# -------------------------------------------------------------------------------------
52# |    2     |       yes           |    yes     |  no     |      no                   |
53# -------------------------------------------------------------------------------------
54# |    3     |       yes           |    no      |  no     |      no                   |
55# -------------------------------------------------------------------------------------
56
57#=====================================================
58# Global Variables :
59#=====================================================
60# Language : "fr" or "en"
61typeset -r MYLANG="fr"
62
63#=====================================================
64# Host user names project maxCpuTime
65# $hostname ou hostname
66typeset HOST=${HOST:=$( hostname )}
67# $username ou whoami
68typeset LOGIN=${LOGIN:=$( whoami )}
69# $hostname of the MASTER job
70typeset MASTER=${MASTER:=$( hostname )}
71# project name
72typeset PROJECT=NONE
73# jobWarningDelay in seconds
74typeset jobWarningDelay=NONE
75
76#D-
77#D-#==================================================
78#D-Program used in libIGCM
79#D-#==================================================
80
81# Submit command
82typeset SUBMIT=${SUBMIT:=qsub}
83# rsync with path
84typeset -r RSYNC=/usr/bin/rsync
85# RSYNC_opt args to rsync
86typeset -r RSYNC_opt="-va"
87# ie storage filesystem
88typeset -r STOREHOST=${MASTER}
89
90#====================================================
91# Set environment tools (ferret, nco, cdo, rebuild, ...)
92#====================================================
93#. /home/${LOGIN}/.atlas_env_${HOST}_ksh
94#export PATH=${PATH}:/home/${LOGIN}/rebuild/bin/
95
96#====================================================
97# Host specific DIRECTORIES
98#====================================================
99
100#====================================================
101#- MirrorlibIGCM for frontend
102typeset -r MirrorlibIGCM=${MirrorlibIGCM:=false}
103
104#====================================================
105#- libIGCM_POST for frontend
106typeset -r libIGCM_POST=${libIGCM}
107
108#====================================================
109#- R_EXE   (==> BIN_DIR = ${MODIPSL}/bin )
110typeset -r R_EXE="${MODIPSL}/bin"
111
112#====================================================
113#- SUBMIT_DIR : submission dir
114typeset -x SUBMIT_DIR=${SUBMIT_DIR:=${PWD}}
115
116#====================================================
117#- IN
118typeset -r R_IN=${R_IN:=/home/${LOGIN}/IGCM}
119typeset -r R_IN_ECMWF=${R_IN_ECMWF:=/home/${LOGIN}/IGCM}
120
121#====================================================
122#- RUN_DIR_PATH : Temporary working directory (=> TMP)
123typeset -r RUN_DIR_PATH=${RUN_DIR_PATH:=/home/${LOGIN}/RUN_DIR/tmp$$}
124
125#====================================================
126#- OUTCOMMAND_PATH : tmp place to store command lines standard error and outputs
127typeset -r OUTCOMMAND_PATH=/tmp
128
129#====================================================
130#- HOST_MPIRUN_COMMAND
131typeset -r HOST_MPIRUN_COMMAND=${HOST_MPIRUN_COMMAND:="time mpirun"}
132
133#====================================================
134#- Max number of arguments passed to nco operator or demigration command
135UNIX_MAX_LIMIT=360
136
137#====================================================
138#- set PackDefault to false on the default machine
139PackDefault=false
140
141#====================================================
142#- Default number of MPI task for IPSL coupled model
143#- required for backward compatibility
144#-
145DEFAULT_NUM_PROC_OCE=5
146DEFAULT_NUM_PROC_CPL=1
147(( DEFAULT_NUM_PROC_ATM = BATCH_NUM_PROC_TOT - DEFAULT_NUM_PROC_OCE - DEFAULT_NUM_PROC_CPL ))
148
149#D-#==================================================
150#D-function IGCM_sys_defineArchives
151#D-* Purpose:
152#D-* Define ARCHIVE : Dedicated to large files
153#D-* Define STORAGE : Dedicated to small/medium files
154#D-* Define R_OUT   : Output tree located on ARCHIVE
155#D-* Define R_FIG   : Output tree located on STORAGE hosting figures (monitoring and atlas, and/or small files)
156#D-* Define R_BUF   : Output tree located on STORAGE hosting files waiting for rebuild or pack processes
157#D-* if SpaceName=TEST nothing special will hapen
158#D-* Examples:
159#D-
160function IGCM_sys_defineArchives {
161  IGCM_debug_PushStack "IGCM_sys_defineArchives"
162
163  if [ ! X${config_UserChoices_ARCHIVE} = X ]; then
164    #====================================================
165    #- ARCHIVE (dedicated to large files)
166    ARCHIVE=${config_UserChoices_ARCHIVE}
167  else
168    #====================================================
169    #- ARCHIVE (dedicated to large files)
170    ARCHIVE=${ARCHIVE:=/home/${LOGIN}}
171  fi
172
173  if [ ! X${config_UserChoices_STORAGE} = X ]; then
174    #====================================================
175    #- STORAGE (dedicated to small/medium files)
176    STORAGE=${config_UserChoices_STORAGE}
177  else
178    #====================================================
179    #- STORAGE (dedicated to small/medium files)
180    STORAGE=${ARCHIVE}
181  fi
182
183  # ON DEFAULT MACHINE NO SPECIAL CASE WHEN X${config_UserChoices_SpaceName} = XTEST
184
185  #====================================================
186  #- R_OUT
187  R_OUT=${ARCHIVE}/IGCM_OUT
188
189  #====================================================
190  #- R_FIG (hosting figures : monitoring and atlas, and/or small files)
191  R_FIG=${STORAGE}/IGCM_OUT
192
193  #====================================================
194  #- CMIP6 (hosting CMIP6 files produced by XIOS2 and configured by dr2xml)
195  CMIP6_BUF=${STORAGE}/IGCM_OUT
196
197  #====================================================
198  #- R_BUF (ONLY FOR double copy an scratch)
199  R_BUF=${STORAGE}/IGCM_OUT
200
201  IGCM_debug_Print 1 "R_OUT has been defined = ${R_OUT}"
202  IGCM_debug_Print 1 "R_BUF has been defined = ${R_BUF}"
203  IGCM_debug_Print 1 "R_FIG has been defined = ${R_FIG}"
204
205  IGCM_debug_PopStack "IGCM_sys_defineArchives"
206}
207
208#D-#==================================================
209#D-function IGCM_sys_RshArchive
210#D-* Purpose: Archive rsh command
211#D-* Examples:
212#D-
213function IGCM_sys_RshArchive {
214  IGCM_debug_PushStack "IGCM_sys_RshArchive" $@
215  /bin/ksh <<-EOF
216    ${@}
217EOF
218  status=$?
219  if [ ${status} -gt 0 ] ; then
220    IGCM_debug_Print 2 "IGCM_sys_RshArchive : command failed error code ${status}"
221    IGCM_debug_Exit "IGCM_sys_RshArchive"
222  fi
223  IGCM_debug_PopStack "IGCM_sys_RshArchive"
224}
225
226#D-#==================================================
227#D-function IGCM_sys_RshArchive_NoError
228#D-* Purpose: Archive rsh command, without error
229#D-*          used only in monitoring.job
230#D-* Examples:
231#D-
232function IGCM_sys_RshArchive_NoError {
233  IGCM_debug_PushStack "IGCM_sys_RshArchive_NoError" $@
234  /bin/ksh <<-EOF
235    ${@} 2> /dev/null
236EOF
237  IGCM_debug_PopStack "IGCM_sys_RshArchive_NoError"
238}
239
240#D-#==================================================
241#D-function IGCM_sys_MkdirArchive
242#D-* Purpose: Mkdir on Archive
243#D-* Examples:
244#D-
245function IGCM_sys_MkdirArchive {
246  IGCM_debug_PushStack "IGCM_sys_MkdirArchive" $@
247  if ( $DEBUG_sys ) ; then
248    echo "IGCM_sys_MkdirArchive :" $@
249  fi
250  #- creation de repertoire sur le serveur fichier
251  if [ ! -d ${1} ]; then
252    \mkdir -p $1
253    status=$?
254
255    if [ ${status} -gt 0 ] ; then
256      IGCM_debug_Print 2 "IGCM_sys_MkdirArchive : mkdir failed error code ${status}"
257      IGCM_debug_Exit "IGCM_sys_MkdirArchive"
258    fi
259  fi
260  IGCM_debug_PopStack "IGCM_sys_MkdirArchive"
261}
262
263#D-#==================================================
264#D-function IGCM_sys_TestDirArchive
265#D-* Purpose: Test Directory that must exists on Archive
266#D-* Examples:
267#D-
268function IGCM_sys_TestDirArchive {
269  IGCM_debug_PushStack "IGCM_sys_TestDirArchive" $@
270  if ( $DEBUG_sys ) ; then
271    echo "IGCM_sys_TestDirArchive :" $@
272  fi
273  typeset ExistFlag
274  ExistFlag=$( [ -d $1 ] && echo 0 || echo 1 )
275  IGCM_debug_PopStack "IGCM_sys_TestDirArchive"
276  return ${ExistFlag}
277}
278
279#D-#==================================================
280#D-function IGCM_sys_IsFileArchived
281#D-* Purpose: Test file that must NOT EXISTS on Archive based on filename only
282#D-* Examples:
283#D-
284function IGCM_sys_IsFileArchived {
285  IGCM_debug_PushStack "IGCM_sys_IsFileArchived" $@
286  if ( $DEBUG_sys ) ; then
287    echo "IGCM_sys_IsFileArchived :" $@
288  fi
289  typeset IsArchivedFlag
290  # Never archived for this system
291  IsArchivedFlag=1
292  IGCM_debug_PopStack "IGCM_sys_IsFileArchived"
293
294  return ${IsArchivedFlag}
295}
296
297#D-#==================================================
298#D-function IGCM_sys_TestFileArchive
299#D-* Purpose: Test file that must NOT EXISTS on Archive
300#D-* Examples:
301#D-
302function IGCM_sys_TestFileArchive {
303  IGCM_debug_PushStack "IGCM_sys_TestFileArchive" $@
304  typeset ExistFlag
305  ExistFlag=$( [ -f $1 ] && echo 0 || echo 1 )
306  IGCM_debug_PopStack "IGCM_sys_TestFileArchive"
307
308  return ${ExistFlag}
309}
310
311#D-#==================================================
312#D-function IGCM_sys_CountFileArchive
313#D-* Purpose: Count files on Archive filesystem
314#D-* Examples:
315#D-
316function IGCM_sys_CountFileArchive {
317  IGCM_debug_PushStack "IGCM_sys_CountFileArchive" $@
318  ls ${@} 2>/dev/null | wc -l
319  if [ $? -gt 0 ] ; then
320    echo "IGCM_sys_CountFileArchive : erreur."
321  fi
322  IGCM_debug_PopStack "IGCM_sys_CountFileArchive"
323}
324
325#D-#==================================================
326#D-function IGCM_sys_Tree
327#D-* Purpose: Tree directories with files on ${ARCHIVE}
328#D-* Examples: IGCM_sys_Tree ${R_IN} ${R_OUT}
329#D-
330function IGCM_sys_Tree {
331  IGCM_debug_PushStack "IGCM_sys_Tree" $@
332  if ( $DEBUG_sys ) ; then
333    echo "IGCM_sys_Tree :" $@
334  fi
335
336  \ls -lR ${@}
337
338  IGCM_debug_PopStack "IGCM_sys_Tree"
339}
340
341#D-#==================================================
342#D-function IGCM_sys_Qsub
343#D-* Purpose: Qsub new job
344#D-* Examples:
345#D-
346function IGCM_sys_Qsub {
347  IGCM_debug_PushStack "IGCM_sys_Qsub" $@
348  if ( $DEBUG_sys ) ; then
349    echo "IGCM_sys_Qsub :" $@
350  fi
351  echo "${@} > ${SUBMIT_DIR}/${Script_Output} 2>&1 &"
352  ${@} > ${SUBMIT_DIR}/${Script_Output} 2>&1 &
353  if [ $? -gt 0 ] ; then
354    echo "IGCM_sys_Qsub : erreur ${options} $1"
355    IGCM_debug_Exit "IGCM_sys_Qsub"
356  fi
357  IGCM_debug_PopStack "IGCM_sys_Qsub"
358}
359
360#D-#==================================================
361#D-function IGCM_sys_QsubPost
362#D-* Purpose: Qsub new job on scalaire
363#D-* Examples:
364#D-
365function IGCM_sys_QsubPost {
366  IGCM_debug_PushStack "IGCM_sys_QsubPost" $@
367  if ( $DEBUG_sys ) ; then
368    echo "IGCM_sys_QsubPost :" $@
369  fi
370  echo "${libIGCM_POST}/$1.job > ${POST_DIR}/$1.${PeriodDateEnd}.out 2>&1 &"
371  ${libIGCM_POST}/$1.job > ${POST_DIR}/${Script_Post_Output}.out 2>&1 &
372  if [ $? -gt 0 ] ; then
373    echo "IGCM_sys_QsubPost : erreur " $@
374    IGCM_debug_Exit "IGCM_sys_QsubPost"
375  fi
376  IGCM_debug_PopStack "IGCM_sys_QsubPost"
377}
378
379#D-*************************
380#D- File transfer functions
381#D-*************************
382#D-
383
384#D-#==================================================
385#D-function IGCM_sys_RmRunDir
386#D-* Purpose: rm tmpdir (dummy function most of the time batch
387#D-                      scheduler will do the job)
388#D-* Examples:
389#D-
390function IGCM_sys_RmRunDir {
391  IGCM_debug_PushStack "IGCM_sys_RmRunDir" $@
392  if ( $DEBUG_sys ) ; then
393    echo "IGCM_sys_RmRunDir :" $@
394    IGCM_debug_Print 1 "Dummy call, let the user do that."
395  fi
396  IGCM_debug_PopStack "IGCM_sys_RmRunDir"
397}
398
399#D-#==================================================
400#D-function IGCM_sys_Put_Dir
401#D-* Purpose: Copy a complete directory on $(ARCHIVE)
402#D-* Examples:
403#D-
404function IGCM_sys_Put_Dir {
405  IGCM_debug_PushStack "IGCM_sys_Put_Dir" $@
406  if ( $DEBUG_sys ) ; then
407    echo "IGCM_sys_Put_Dir :" $@
408  fi
409  if [ $DRYRUN = 0 ]; then
410    if [ ! -d ${1} ] ; then
411      echo "WARNING : IGCM_sys_Put_Dir ${1} DOES NOT EXIST ."
412      IGCM_debug_PopStack "IGCM_sys_Put_Dir"
413      return
414    fi
415
416    typeset status
417
418    # Only if we use rsync
419    #IGCM_sys_TestDirArchive $( dirname $2 )
420    #
421    #USUAL WAY
422    \cp -r $1 $2 > ${OUTCOMMAND_PATH}/out_command_${LOGIN}.$$ 2>&1
423    status=$?
424
425    if [ ${status} -gt 0 ] ; then
426      IGCM_debug_Print 2 "IGCM_sys_Put_Dir : cp failed error code ${status}"
427      cat ${OUTCOMMAND_PATH}/out_command_${LOGIN}.$$
428      IGCM_debug_Exit "IGCM_sys_Put_Dir"
429    else
430      \rm ${OUTCOMMAND_PATH}/out_command_${LOGIN}.$$
431    fi
432  fi
433  IGCM_debug_PopStack "IGCM_sys_Put_Dir"
434}
435
436#D-#==================================================
437#D-function IGCM_sys_Get_Dir
438#D-* Purpose: Copy a complete directory from ${ARCHIVE}
439#D-* Examples:
440#D-
441function IGCM_sys_Get_Dir {
442  IGCM_debug_PushStack "IGCM_sys_Get_Dir" $@
443  if ( $DEBUG_sys ) ; then
444    echo "IGCM_sys_Get_Dir :" $@
445  fi
446  if [ $DRYRUN = 0 ]; then
447    typeset NB_ESSAI DELAI status i
448    # number of tentative
449    NB_ESSAI=3
450    # time delay between tentative
451    DELAI=2
452
453    #
454    # USUAL WAY
455    i=0
456    while [ $i -lt $NB_ESSAI ] ; do
457      \cp -ur $1 $2 >> ${OUTCOMMAND_PATH}/out_command_${LOGIN}.$$ 2>&1
458      status=$?
459      if [ ${status} -gt 0 ] ; then
460        IGCM_debug_Print 2 "IGCM_sys_Get_Dir : cp failed error code ${status} ${i}/${NB_ESSAI}"
461        IGCM_debug_Print 2 "IGCM_sys_Get_Dir : sleep ${DELAI} seconds and try again."
462        sleep $DELAI
463      else
464        break
465      fi
466      (( i = i + 1 ))
467    done
468
469    if [ ${status} -gt 0 ] ; then
470      IGCM_debug_Print 2 "IGCM_sys_Get_Dir : cp failed error code ${status}"
471      cat ${OUTCOMMAND_PATH}/out_command_${LOGIN}.$$
472      IGCM_debug_Exit "IGCM_sys_Get_Dir"
473    else
474      \rm ${OUTCOMMAND_PATH}/out_command_${LOGIN}.$$
475    fi
476  fi
477  IGCM_debug_PopStack "IGCM_sys_Get_Dir"
478}
479
480#D-#==================================================
481#D-function IGCM_sys_Put_Rest
482#D-* Purpose: Put computied restarts on ${ARCHIVE}.
483#D-           File and target directory must exist.
484#D-* Examples:
485#D-
486function IGCM_sys_Put_Rest {
487  IGCM_debug_PushStack "IGCM_sys_Put_Rest" $@
488  if ( $DEBUG_sys ) ; then
489    echo "IGCM_sys_Put_Rest :" $@
490  fi
491  if [ $DRYRUN = 0 ]; then
492    if [ ! -f ${1} ] ; then
493      echo "ERROR : IGCM_sys_Put_Rest ${1} DOES NOT EXIST ."
494      IGCM_debug_Exit "IGCM_sys_Put_Rest"
495    fi
496
497    typeset status
498    #
499    # USUAL WAY
500    \cp $1 $2 > ${OUTCOMMAND_PATH}/out_command_${LOGIN}.$$ 2>&1
501    status=$?
502
503#       #RSYNC WITH NETWORK SSH CALL
504#       echo ${RSYNC} ${RSYNC_opt} -e ssh ${RUN_DIR}/$1 ${STOREHOST}:${2} > ${OUTCOMMAND_PATH}/out_command_${LOGIN}.$$ 2>&1
505#       ${RSYNC} ${RSYNC_opt} -e ssh ${RUN_DIR}/$1 ${STOREHOST}:${2} >> ${OUTCOMMAND_PATH}/out_command_${LOGIN}.$$ 2>&1
506
507#       #RSYNC WITH NFS USE
508#       echo ${RSYNC} ${RSYNC_opt} ${RUN_DIR}/$1 ${2} > ${OUTCOMMAND_PATH}/out_command_${LOGIN}.$$ 2>&1
509#       ${RSYNC} ${RSYNC_opt} ${RUN_DIR}/$1 ${2} >> ${OUTCOMMAND_PATH}/out_command_${LOGIN}.$$ 2>&1
510
511#       status=$?
512#       IGCM_sys_Rsync_out $status
513
514#       ${libIGCM}/libIGCM_sys/IGCM_analyse_rsync_out.awk ${OUTCOMMAND_PATH}/out_command_${LOGIN}.$$
515#       (( status=status+$? ))
516
517    if [ ${status} -gt 0 ] ; then
518      IGCM_debug_Print 2 "IGCM_sys_Put_Rest : cp failed error code ${status}"
519      [ -f ${1} ] && ls -l ${1}
520      [ -f ${2} ] && ls -l ${2}
521      [ -f ${2}/${1} ] && ls -l ${2}/${1}
522      cat ${OUTCOMMAND_PATH}/out_command_${LOGIN}.$$
523      IGCM_debug_Exit "IGCM_sys_Put_Rest"
524    else
525
526      if [ X${JobType} = XRUN ] ; then
527        [ -f ${2} ] && IGCM_sys_Chmod 444 ${2}
528        [ -f ${2}/${1} ] && IGCM_sys_Chmod 444 ${2}/${1}
529      fi
530
531      \rm ${OUTCOMMAND_PATH}/out_command_${LOGIN}.$$
532    fi
533  fi
534  IGCM_debug_PopStack "IGCM_sys_Put_Rest"
535}
536
537#D-#==================================================
538#D-function IGCM_sys_Put_Out
539#D-* Purpose: Copy a file on ${ARCHIVE} after having chmod it in readonly
540#D-* Examples:
541#D-
542function IGCM_sys_Put_Out {
543  IGCM_debug_PushStack "IGCM_sys_Put_Out" $@
544  if ( $DEBUG_sys ) ; then
545    echo "IGCM_sys_Put_Out :" $@
546  fi
547
548  typeset status
549
550  if [ $DRYRUN = 0 ]; then
551    if [ ! -f ${1} ] ; then
552      echo "WARNING : IGCM_sys_Put_Out ${1} DOES NOT EXIST ."
553      IGCM_debug_PopStack "IGCM_sys_Put_Out"
554      return 1
555    fi
556    #
557    IGCM_sys_MkdirArchive $( dirname $2 )
558    #
559    if [ X${JobType} = XRUN ] ; then
560      if [ X${3} = X ] ; then
561        IGCM_sys_Chmod 444 ${1}
562      fi
563    fi
564    #
565
566    echo ${RSYNC} ${RSYNC_opt} $1 $2 > ${OUTCOMMAND_PATH}/out_command_${LOGIN}.$$ 2>&1
567    ${RSYNC} ${RSYNC_opt} $1 $2 >> ${OUTCOMMAND_PATH}/out_command_${LOGIN}.$$ 2>&1
568    status=$?
569    IGCM_sys_Rsync_out $status
570
571    ${libIGCM}/libIGCM_sys/IGCM_analyse_rsync_out.awk ${OUTCOMMAND_PATH}/out_command_${LOGIN}.$$
572    (( status=status+$? ))
573
574    if [ ${status} -gt 0 ] ; then
575      IGCM_debug_Print 2 "IGCM_sys_Put_Out : rsync failed error code ${status}"
576      cat ${OUTCOMMAND_PATH}/out_command_${LOGIN}.$$
577      IGCM_debug_Exit "IGCM_sys_Put_Out"
578    else
579      \rm ${OUTCOMMAND_PATH}/out_command_${LOGIN}.$$
580    fi
581  fi
582  IGCM_debug_PopStack "IGCM_sys_Put_Out"
583  return 0
584}
585
586#D-#==================================================
587#D-function IGCM_sys_Get
588#D-* Purpose: Get a file from ${ARCHIVE}
589#D-* Examples: IGCM_sys_Get myfile /destpath/myfile_with_PREFIX
590#D-            IGCM_sys_Get /l Array_contain_myfiles /destpath/
591function IGCM_sys_Get {
592  IGCM_debug_PushStack "IGCM_sys_Get" $@
593
594  typeset DEST status dm_liste
595
596  if ( $DEBUG_sys ) ; then
597    echo "IGCM_sys_Get :" $@
598  fi
599  if [ $DRYRUN -le 2 ]; then
600    if [ X${1} = X'/l' ] ; then
601      eval set +A dm_liste \${${2}}
602    else
603      dm_liste=${1}
604    fi
605    eval DEST=\${${#}}
606
607    # test if the (first) file is present in the old computation :
608    IGCM_sys_TestFileArchive ${dm_liste[0]}
609    status=$?
610    if [ ${status} -gt 0 ] ; then
611      echo "IGCM_sys_Get, ERROR : regular file ${dm_liste[0]} DOES NOT EXIST ."
612      IGCM_debug_Exit "IGCM_sys_Get"
613      return
614    fi
615
616    #USUAL WAY
617    \cp ${dm_liste[*]} ${DEST} > ${OUTCOMMAND_PATH}/out_command_${LOGIN}.$$ 2>&1
618    status=$?
619
620    if [ ${status} -gt 0 ] ; then
621      IGCM_debug_Print 2 "IGCM_sys_Get : cp failed error code ${status}"
622      cat ${OUTCOMMAND_PATH}/out_command_${LOGIN}.$$
623      IGCM_debug_Exit "IGCM_sys_Get"
624    else
625      \rm ${OUTCOMMAND_PATH}/out_command_${LOGIN}.$$
626    fi
627  fi
628  IGCM_debug_PopStack "IGCM_sys_Get"
629}
630
631#D-#==================================================
632#D-function IGCM_sys_GetDate_Monitoring
633#D-* Purpose: get the last year for which the monitoring has been computed
634#D-* Examples:
635#D-
636function IGCM_sys_GetDate_Monitoring {
637  IGCM_debug_PushStack "IGCM_sys_GetDate_Monitoring" $@
638  if ( $DEBUG_sys ) ; then
639    echo "IGCM_sys_GetDate_Monitoring :" $@
640  fi
641
642  eval ${2}=$( cdo showyear ${1} 2> /dev/null | gawk '{ print $NF }' )
643
644  IGCM_debug_PopStack "IGCM_sys_GetDate_Monitoring"
645}
646
647#D-#==================================================
648#D-function IGCM_sys_Dods_Rm
649#D-* Purpose: DO NOTHING ! Put ${ARCHIVE} files on DODS internet protocole.
650#D-* Examples:
651#D-
652function IGCM_sys_Dods_Rm {
653  if ( $DEBUG_sys ) ; then
654    echo "IGCM_sys_Dods_Rm :" $@
655  fi
656  return 0
657}
658
659#D-#==================================================
660#D-function IGCM_sys_Dods_Cp
661#D-* Purpose: Copy $(ARCHIVE) files on DODS internet protocole.
662#D-* Examples:
663#D-
664function IGCM_sys_Dods_Cp {
665  if ( $DEBUG_sys ) ; then
666    echo "IGCM_sys_Dods_Cp :" $@
667  fi
668  return 0
669}
670
671#D-#==================================================
672#D-function IGCM_sys_Put_Dods
673#D-* Purpose: Put ${ARCHIVE} files on DODS internet protocole. Dummy function here
674#D-* Examples:
675#D-
676function IGCM_sys_Put_Dods {
677  IGCM_debug_PushStack "IGCM_sys_Put_Dods" $@
678  if ( $DEBUG_sys ) ; then
679    echo "IGCM_sys_Put_Dods :" $@
680  fi
681  IGCM_debug_PopStack "IGCM_sys_Put_Dods"
682}
683
684##############################################################
685# REBUILD OPERATOR
686
687#D-#==================================================
688#D-function IGCM_sys_sync
689#D-* Purpose: flush buffer on disk (dummy function on Default machine)
690#D-* Examples:
691#D-
692function IGCM_sys_sync {
693  IGCM_debug_PushStack "IGCM_sys_sync" $@
694  if ( $DEBUG_sys ) ; then
695    echo "IGCM_sys_sync :" $@
696    echo "Dummy call, let the system do that."
697  fi
698  IGCM_debug_PopStack "IGCM_sys_sync"
699}
700
701############################################################
702# Activate Running Environnment Variables
703
704#D-#==================================================
705#D-function IGCM_sys_activ_variables
706#D-* Purpose: set environement variables prior to execution
707#D-* Examples:
708#D-
709function IGCM_sys_activ_variables {
710  IGCM_debug_PushStack "IGCM_sys_activ_variables"
711  if ( $DEBUG_sys ) ; then
712    echo "IGCM_sys_activ_variables"
713  fi
714
715# --------------------------------------------------------------------
716#D- MPI specifications
717# --------------------------------------------------------------------
718
719# --------------------------------------------------------------------
720#D- Other specifications
721# --------------------------------------------------------------------
722
723  ulimit -s unlimited
724
725  IGCM_debug_PopStack "IGCM_sys_activ_variables"
726}
727
728############################################################
729# Desactivate Running Environnment Variables
730
731#D-#==================================================
732#D-function IGCM_sys_desactiv_variables
733#D-* Purpose: unset environement variables after execution
734#D-* Examples:
735#D-
736function IGCM_sys_desactiv_variables {
737  IGCM_debug_PushStack "IGCM_sys_desactiv_variables"
738  if ( $DEBUG_sys ) ; then
739    echo "IGCM_sys_desactiv_variables"
740  fi
741# --------------------------------------------------------------------
742#D- MPI specifications
743# --------------------------------------------------------------------
744
745# --------------------------------------------------------------------
746#D- Other specifications
747# --------------------------------------------------------------------
748
749  IGCM_debug_PopStack "IGCM_sys_desactiv_variables"
750}
751
752############################################################
753# Update job headers to be used by the scheduler
754
755#D-#==================================================
756#D-function IGCM_sys_updateHeaders
757#D-* Purpose: Update job headers to be used by the scheduler
758#D-* Examples: IGCM_sys_updateHeaders /path/to/Job_MYEXP
759#D-
760function IGCM_sys_updateHeaders {
761  IGCM_debug_PushStack "IGCM_sys_updateHeaders"
762  if ( $DEBUG_sys ) ; then
763    echo "IGCM_sys_updateHeaders"
764  fi
765  typeset file
766  file=$1
767
768  if [ ${executionType} -eq 1 ] ; then
769    # MPMD + MPI
770    sed -e "/::openMPthreads::/d"                  \
771        -e "s/::JobNumProcTot::/${coreNumber}/"    \
772      ${file} > ${file}.tmp
773
774  elif [ ${executionType} -eq 2 ] ; then
775    # MPMD + MPI + OMP
776    sed -e "s/::openMPthreads::/${openMPthreads}/" \
777        -e "s/::JobNumProcTot::/${coreNumber}/"    \
778      ${file} > ${file}.tmp
779
780  elif [ ${executionType} -eq 3 ] ; then
781    # SPMD + MPI/OMP
782    sed -e "s/::openMPthreads::/${openMPthreads}/" \
783        -e "s/::JobNumProcTot::/${mpiTasks}/"      \
784      ${file} > ${file}.tmp
785
786  elif [ ${executionType} -eq 4 ] ; then
787    # SPMD + MPI only
788    sed -e "s/::JobNumProcTot::/${mpiTasks}/"      \
789        -e "/::openMPthreads::/d"                  \
790      ${file} > ${file}.tmp
791
792  elif [ ${executionType} -eq 5 ] ; then
793    # SPMD + OMP only
794    sed -e "s/::openMPthreads::/${openMPthreads}/" \
795        -e "/::JobNumProcTot::/d"                  \
796      ${file} > ${file}.tmp
797
798  elif [ ${executionType} -eq 6 ] ; then
799    # SEQUENTIAL THEN
800    sed -e "s/::JobNumProcTot::/1/"                \
801        -e "/::openMPthreads::/d"                  \
802      ${file} > ${file}.tmp
803
804  fi
805
806  IGCM_sys_Mv ${file}.tmp ${file}
807
808  IGCM_debug_PopStack "IGCM_sys_updateHeaders"
809}
810
811############################################################
812# Build MPI/OMP scripts run file (dummy function)
813
814#D-#==================================================
815#D-function IGCM_sys_build_run_file
816#D-* Purpose: build run file (deprecated)
817#D-* Examples:
818#D-
819function IGCM_sys_build_run_file {
820  IGCM_debug_Print 3 " dummy function : IGCM_sys_build_run_file "
821}
822
823############################################################
824# Build MPI/OMP scripts
825
826#D-#==================================================
827#D-function IGCM_sys_build_execution_scripts
828#D-* Purpose: build execution scripts to be launch by ${HOST_MPIRUN_COMMAND}
829#D-* Examples:
830#D-
831function IGCM_sys_build_execution_scripts
832{
833  IGCM_debug_PushStack "IGCM_sys_build_execution_scripts" $@
834  if ( $DEBUG_sys ) ; then
835    echo "IGCM_sys_build_execution_scripts " $@
836  fi
837
838  EXECUTION=${HOST_MPIRUN_COMMAND}
839
840  # MPMD mode
841  if ( ${OK_PARA_MPMD} ) ; then
842
843    # Only MPI (MPMD)
844    if  ( ! ${OK_PARA_OMP} ) ; then
845
846      if [ -f run_file ] ; then
847        IGCM_sys_Rm -f run_file
848      fi
849      touch run_file
850
851      # Build run_file
852
853      # First loop on the components for the coupler ie oasis (only if oasis3)
854      # the coupler ie oasis3 must be the first one
855      for comp in ${config_ListOfComponents[*]} ; do
856
857        eval ExeNameIn=\${config_Executable_${comp}[0]}
858        eval ExeNameOut=\${config_Executable_${comp}[1]}
859
860        # for CPL component only
861        if [ "X${comp}" = "XCPL" ]  && [ "X${ExeNameOut}" != X\"\" ] ; then
862          eval comp_proc_mpi_loc=\${${comp}_PROC_MPI}
863          eval comp_proc_omp_loc=\${${comp}_PROC_OMP}
864          echo "-np ${comp_proc_mpi_loc} ./${ExeNameOut} " >> run_file
865        fi
866      done
867
868      # Then second loop on the components
869      for comp in ${config_ListOfComponents[*]} ; do
870
871        eval ExeNameIn=\${config_Executable_${comp}[0]}
872        eval ExeNameOut=\${config_Executable_${comp}[1]}
873
874        # Only if we really have an executable for the component and not the coupler ie oasis:
875        if ( [ "X${ExeNameOut}" != X\"\" ] && [ "X${comp}" != "XCPL" ] ) ; then
876
877          eval comp_proc_mpi_loc=\${${comp}_PROC_MPI}
878          eval comp_proc_omp_loc=\${${comp}_PROC_OMP}
879          echo "-np ${comp_proc_mpi_loc} ./${ExeNameOut}" >> run_file
880        fi
881      done
882
883      EXECUTION="${HOST_MPIRUN_COMMAND} --app ./run_file"
884
885      IGCM_sys_Chmod u+x run_file
886      if ( $DEBUG_sys ) ; then
887        echo "run_file contains : "
888        cat run_file
889      fi
890 
891    # MPI-OpenMP (MPMD)
892    else
893
894      #  Hosts treatment
895      ${HOST_MPIRUN_COMMAND} hostname | sort | uniq > hosts.tmp
896
897      i=0
898      rm -f hosts
899      IGCM_debug_Print 1 "sys $( hostname ), Hosts available :"
900      for nodes in `cat hosts.tmp` ; do
901        host[$i]=$nodes
902        echo "${host[$i]} slots=1 max_slots=1" >> hosts
903        IGCM_debug_Print 1 ${host[$i]}
904        i=$((i+1))
905      done
906      rm -f hosts.tmp
907
908      listnodes=${host[*]}
909
910      EXECUTION="${HOST_MPIRUN_COMMAND} -hostfile hosts"
911
912      # Initialisation
913      rank=0
914      current_core=0
915      core_per_node=4
916      init_exec=n
917
918      # Loop on the components
919      for comp in ${config_ListOfComponents[*]} ; do
920
921        eval ExeNameIn=\${config_Executable_${comp}[0]}
922        eval ExeNameOut=\${config_Executable_${comp}[1]}
923
924        # Not possible if oasis has an executable (i.e old version of oasis3)
925        if ( [ "X${ExeNameOut}" != X\"\" ] &&  [ "X${comp}" = "XCPL" ] ) ; then
926          IGCM_debug_Exit "ERROR MPMD with hybrid MPI-OpenMP is not available with oasis3 version"
927          IGCM_debug_Print 2 "Only available with oasis3-MCT version coupler"
928          IGCM_debug_Verif_Exit
929        fi
930
931        # Only if we really have an executable for the component :
932        if [ "X${ExeNameOut}" != X\"\" ] ; then
933
934          eval comp_proc_mpi_loc=\${${comp}_PROC_MPI}
935          eval comp_proc_omp_loc=\${${comp}_PROC_OMP}
936
937          echo "#!/bin/ksh" > script_${ExeNameOut}.ksh
938          echo ""  >> script_${ExeNameOut}.ksh
939          if [ ${comp_proc_omp_loc} -gt 1 ] ; then
940
941            # Check if the number of threads is correct
942            case ${comp_proc_omp_loc} in
943            2|4)
944              IGCM_debug_Print 1 "You run ${ExeNameOut} on ${comp_proc_omp_loc} OMP threads"
945              ;;
946            *)
947              IGCM_debug_Exit "ERROR with OMP parameters !"
948              IGCM_debug_Print 2 "${comp_proc_omp_loc} is not possible as number of OMP threads"
949              IGCM_debug_Print 2 "Only 2,4 as number of OMP threads are possible "
950              IGCM_debug_Verif_Exit
951              ;;
952            esac
953            #echo "export KMP_STACKSIZE=3g"  >> script_${ExeNameOut}.ksh
954            #echo "export KMP_LIBRARY=turnaround"  >> script_${ExeNameOut}.ksh
955            #echo "export MKL_SERIAL=YES"  >> script_${ExeNameOut}.ksh
956            echo "export OMP_STACKSIZE=200M" >> script_${ExeNameOut}.ksh
957            echo "export OMP_NUM_THREADS=${comp_proc_omp_loc}" >> script_${ExeNameOut}.ksh
958          fi
959
960          #echo "./${ExeNameOut}" >> script_${ExeNameOut}.ksh
961          echo "(( MYMPIRANK = OMPI_COMM_WORLD_RANK )) " >> script_${ExeNameOut}.ksh
962          echo "MYMPIRANK=\$(printf '%3.3d\n' \${MYMPIRANK})" >> script_${ExeNameOut}.ksh
963          echo "./${ExeNameOut} > out_${ExeNameOut}.out.\${MYMPIRANK} 2>out_${ExeNameOut}.err.\${MYMPIRANK}" >> script_${ExeNameOut}.ksh
964          IGCM_sys_Chmod u+x script_${ExeNameOut}.ksh
965
966          if [ ${init_exec} = y ] ; then
967            EXECUTION="${EXECUTION} : -np ${comp_proc_mpi_loc} ./script_${ExeNameOut}.ksh"
968          else
969            EXECUTION="${EXECUTION} -np ${comp_proc_mpi_loc} ./script_${ExeNameOut}.ksh"
970            init_exec=y
971          fi
972
973          # Build rankfile : method used to assign cores and nodes for the MPI process
974          # Ex :
975          #rank 0=curie5296 slot=0,1,2,3
976          #rank 1=curie5296 slot=4,5,6,7
977          # Example of final command :
978          # mpirun -hostfile hosts -rankfile rankfile -np 27 ./script_lmdz.x.ksh : -np 5 ./script_opa.xx.ksh
979          # with script_lmdz.x.ksh :
980          # #!/bin/ksh
981          #export OMP_STACKSIZE=200M
982          #export OMP_NUM_THREADS=4
983          #./lmdz.x
984
985          for nb_proc_mpi in `seq 0 $(($comp_proc_mpi_loc-1))`; do
986            (( index_host = current_core / core_per_node ))
987            host_value=${host[${index_host}]}
988            (( slot =  current_core % core_per_node ))
989            virg=","
990            string_final=""
991            for index in `seq $slot $(($slot+$comp_proc_omp_loc-1))`; do
992              string=$index$virg
993              string_final=$string_final$string
994            done
995            string_final=$( echo $string_final | sed "s/.$//" )
996            echo "rank $rank=$host_value slot=$string_final" >> rankfile
997            (( rank = rank + 1 ))
998            (( current_core = current_core + comp_proc_omp_loc ))
999          done
1000        fi
1001      done
1002    fi
1003
1004  # Only one executable (SPMD mode).
1005  else
1006
1007    for comp in ${config_ListOfComponents[*]} ; do
1008
1009      # Only if we really have an executable for the component :
1010      eval ExeNameOut=\${config_Executable_${comp}[1]}
1011      if ( [ "X${ExeNameOut}" != X\"\" ] && [ "X${ExeNameOut}" != "Xinca.dat" ] ) ; then
1012
1013        echo "#!/bin/ksh" > script_${ExeNameOut}.ksh
1014        echo ""  >> script_${ExeNameOut}.ksh
1015        if ( ${OK_PARA_OMP} ) ; then
1016          eval comp_proc_omp_loc=\${${comp}_PROC_OMP}
1017          echo "export OMP_STACKSIZE=200M" >> script_${ExeNameOut}.ksh
1018          echo "export OMP_NUM_THREADS=${comp_proc_omp_loc}" >> script_${ExeNameOut}.ksh
1019        fi
1020        if  ( ${OK_PARA_MPI} ) ; then
1021          # Default : mpirun used if nb_proc gt 1
1022          # pour sortie out/err par process
1023          echo "./${ExeNameOut} > out_${ExeNameOut}.out.\${OMPI_COMM_WORLD_RANK} 2>out_${ExeNameOut}.err.\${OMPI_COMM_WORLD_RANK}"  >> script_${ExeNameOut}.ksh
1024          #echo "./${ExeNameOut}" >> script_${ExeNameOut}.ksh
1025          IGCM_sys_Chmod u+x script_${ExeNameOut}.ksh
1026          EXECUTION="${HOST_MPIRUN_COMMAND} ./script_${ExeNameOut}.ksh"
1027        else
1028          # Default : mpirun is NOT used if nb_proc eq 1
1029          # pour sortie out/err par process
1030          echo "./${ExeNameOut} > out_${ExeNameOut}.out 2>out_${ExeNameOut}.err" >> script_${ExeNameOut}.ksh
1031          #echo "./${ExeNameOut}" >> script_${ExeNameOut}.ksh
1032          IGCM_sys_Chmod u+x script_${ExeNameOut}.ksh
1033          EXECUTION="time ./script_${ExeNameOut}.ksh"
1034        fi
1035
1036        IGCM_debug_Print 1 "sys $( hostname ) : script_${ExeNameOut}.ksh contains"
1037        cat script_${ExeNameOut}.ksh
1038
1039      fi
1040
1041    done
1042
1043  fi
1044
1045  IGCM_debug_Print 1 "sys $( hostname ) : execution command is"
1046  IGCM_debug_Print 1 "$EXECUTION"
1047
1048  IGCM_debug_PopStack "IGCM_sys_build_execution_scripts"
1049}
1050
1051#D-#==================================================
1052#D-function IGCM_sys_check_path
1053#D-* Purpose: check that RUN_DIR_PATH that will be removed on some machine
1054#D-* do not point to an important use directory. Stop immediately in that case.
1055#D-* Examples:
1056#D-
1057function IGCM_sys_check_path {
1058  IGCM_debug_PushStack "IGCM_sys_check_path"
1059  if ( $DEBUG_sys ) ; then
1060    echo "IGCM_sys_check_path"
1061  fi
1062
1063  if ( [ X${RUN_DIR_PATH} = X${HOME} ] || [ X${RUN_DIR_PATH} = X${ARCHIVE} ] ) ; then
1064    IGCM_debug_Print 1 "Variable RUN_DIR_PATH is pointing to an important directory : ${RUN_DIR_PATH}"
1065    IGCM_debug_Print 1 "Please check the RUN_DIR_PATH definition in your Job : Job_${config_UserChoices_JobName}"
1066    IGCM_debug_Exit "This will stop the job"
1067  fi
1068  IGCM_debug_PopStack "IGCM_sys_check_path"
1069}
1070
1071#D-#==================================================
1072#D-function IGCM_sys_check_quota. Dummy call here
1073#D-* Purpose: check user quota. Stop the simulation if quota above 90%
1074#D-* Examples:
1075#D-
1076function IGCM_sys_check_quota {
1077  IGCM_debug_PushStack "IGCM_sys_check_quota"
1078  if ( $DEBUG_sys ) ; then
1079    echo "IGCM_sys_check_quota"
1080  fi
1081
1082  # TO BE IMPLEMENTED
1083
1084  IGCM_debug_PopStack "IGCM_sys_check_quota"
1085}
1086
1087#D-#==================================================
1088#D-function IGCM_sys_projectAccounting
1089#D-* Purpose: store project accounting information in a file
1090#D-* Examples:
1091#D-
1092function IGCM_sys_projectAccounting {
1093  IGCM_debug_PushStack "IGCM_sys_projectAccounting"
1094  if ( $DEBUG_sys ) ; then
1095    echo "IGCM_sys_check_quota"
1096  fi
1097
1098  touch $1
1099
1100  IGCM_debug_PopStack "IGCM_sys_projectAccounting"
1101}
1102
1103#D-#==================================================
1104#D-function IGCM_sys_getJobSchedulerID
1105#D-* Purpose: Get the job ID during execution
1106#D-* Examples: IGCM_sys_getJobSchedulerID jobSchedulerID
1107#D-
1108function IGCM_sys_getJobSchedulerID {
1109  IGCM_debug_PushStack "IGCM_sys_getJobSchedulerID"
1110  if ( $DEBUG_sys ) ; then
1111    echo "IGCM_sys_getJobSchedulerID"
1112  fi
1113
1114  # N/A content
1115  eval ${1}="N/A"
1116
1117  IGCM_debug_PopStack "IGCM_sys_getJobSchedulerID"
1118}
1119
1120#D-#==================================================
1121#D-function IGCM_sys_GetJobID
1122#D-* Purpose: Get the job ID from the JobName
1123#D-* Examples: IGCM_sys_GetJobID ${JobName} ${TargetUsr} JobID
1124#D-
1125function IGCM_sys_GetJobID {
1126  IGCM_debug_PushStack "IGCM_sys_GetJobID"
1127  if ( $DEBUG_sys ) ; then
1128    echo "IGCM_sys_GetJobID"
1129  fi
1130
1131  # N/A content
1132  eval ${3}="N/A"
1133  IGCM_debug_PopStack "IGCM_sys_GetJobID"
1134}
1135
1136#D-#==================================================
1137#D-function IGCM_sys_CountJobInQueue
1138#D-* Purpose: Count number of users job
1139#D-* Examples: IGCM_sys_CountJobInQueue ${JobName} NbRun
1140#D-
1141function IGCM_sys_CountJobInQueue {
1142  IGCM_debug_PushStack "IGCM_sys_CountJobInQueue"
1143  if ( $DEBUG_sys ) ; then
1144    echo "IGCM_sys_CountJobInQueue"
1145  fi
1146  IGCM_debug_PopStack "IGCM_sys_CountJobInQueue"
1147}
1148
1149#D-#==================================================
1150#D-function IGCM_sys_atlas
1151#D-* Purpose: encapsulate atlas call so as to manage error code and curie specificity
1152#D-* Examples:
1153#D-
1154function IGCM_sys_atlas {
1155  IGCM_debug_PushStack "IGCM_sys_atlas" $@
1156  if ( $DEBUG_sys ) ; then
1157    echo "IGCM_sys_atlas :" $@
1158  fi
1159
1160  typeset status
1161
1162  \atlas $@ > ${OUTCOMMAND_PATH}/out_command_${LOGIN}.$$ 2>&1
1163  status=$?
1164  if [ ${status} -gt 0 ] ; then
1165    echo "IGCM_sys_atlas : error code ${status}"
1166    cat ${OUTCOMMAND_PATH}/out_command_${LOGIN}.$$
1167    \rm ${OUTCOMMAND_PATH}/out_command_${LOGIN}.$$
1168    IGCM_debug_PopStack "IGCM_sys_atlas"
1169    return 1
1170  else
1171    IGCM_debug_PopStack "IGCM_sys_atlas"
1172    return 0
1173  fi
1174
1175  IGCM_debug_PopStack "IGCM_sys_atlas"
1176}
1177
1178#D-#==================================================
1179#D-function IGCM_sys_rebuild_nemo
1180#D-* Purpose: rebuild nemo parallel files with general rebuild
1181#D-* Examples:
1182#D-
1183
1184function IGCM_sys_rebuild_nemo {
1185  IGCM_debug_PushStack "IGCM_sys_rebuild_nemo" $@
1186  if ( $DEBUG_sys ) ; then
1187    echo "IGCM_sys_rebuild_nemo :" $@
1188  fi
1189
1190  nemo_generic_restart_file_name_out=${1}
1191  nemo_extension_out=${3}
1192  shift ; shift ; shift
1193
1194  IGCM_sys_rebuild -o ${nemo_generic_restart_file_name_out}.${nemo_extension_out} $@
1195
1196  IGCM_debug_PopStack "IGCM_sys_rebuild_nemo"
1197}
1198
Note: See TracBrowser for help on using the repository browser.