source: trunk/libIGCM/libIGCM_debug/libIGCM_debug.ksh @ 765

Last change on this file since 765 was 765, checked in by mafoipsl, 11 years ago
  • Consolidation of AA_pack_debug and AA_pack_restart : don't delete pre-packed files if Put_Out doesn't work.
  • On curie : add information about file before Put_Out.
  • Change comments into libIGCM_debug. Thanks to Masa :-)
  • 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: 10.0 KB
Line 
1#!/bin/ksh
2
3#**************************************************************
4# Author: Patrick Brockmann, Martial Mancip
5# Contact: Patrick.Brockmann__at__cea.fr 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#==================================================
21# Add high level verbosity
22typeset -i Verbosity=${Verbosity:=3}
23
24#==================================================
25# DEBUG_debug
26# Add low level verbosity
27typeset DEBUG_debug=${DEBUG_debug:=false}
28
29if ( $DEBUG_debug ) ; then
30  if [ -f stack ] ;
31  then
32    echo "Stack of an libIGCM job :" >> stack
33  else
34    echo "Stack of an libIGCM job :" >  stack
35  fi
36fi
37
38#==================================================
39# NULL_STR
40# Default null string
41typeset -r NULL_STR="_0_" 
42
43#==================================================
44# libIGCM_CurrentTag
45# Current libIGCM tag, check compatibilty with *.card
46typeset -r libIGCM_CurrentTag="1.0" 
47
48#==================================================
49# Exit Flag (internal debug)
50# When true, end the master loop AFTER SAVES FILES
51ExitFlag=false
52
53#==================================================
54# Declare a stack of functions calls
55
56# insert last argument of the Stack
57#set -A IGCM_debug_Stack ${NULL_STR}
58#set -A IGCM_debug_StackArgs ${NULL_STR}
59unset IGCM_debug_Stack
60unset IGCM_debug_StackArgs
61IGCM_debug_Stack[0]=${NULL_STR}
62IGCM_debug_StackArgs[0]=${NULL_STR}
63IGCM_debug_LenStack=0
64
65#D-#==================================================================
66#D-function IGCM_debug_CallStack
67#D-* Purpose: Echo the Stack
68#D-
69function IGCM_debug_CallStack {
70  echo
71  echo "!!!!!!!!!!!!!!!!!!!!!!!!!!"
72  echo "!! IGCM_debug_CallStack !!"
73  echo "!------------------------!"
74  echo
75  if ( $DEBUG_debug ) ; then
76    # La pile d'appels est affichée de la plus vieille à la plus récente
77    # (c'est donc l'inverse de la norme d'affichage).
78    typeset i decal
79    (( i=0 ))
80    until [ $i -eq ${IGCM_debug_LenStack} ]; do
81      decal=0
82      until [ $decal -eq ${i} ]; do
83        printf -- ' '
84        let $(( decal=decal+1 ))
85      done
86      echo "$i - ${IGCM_debug_Stack[$(( $IGCM_debug_LenStack-$i-1 ))]}"\
87                "(${IGCM_debug_StackArgs[$(( $IGCM_debug_LenStack-$i-1 ))]})"
88      let $((i=i+1))
89    done
90    echo "!------------------------!"
91  fi
92}
93
94#D-#==================================================================
95#D-function IGCM_debug_PushStack
96#D-* Purpose: Push a function name in the stack
97#D-
98function IGCM_debug_PushStack {
99  if ( $DEBUG_debug ) ; then
100    typeset decal
101    echo >> stack
102    decal=0
103    while [ $decal -lt ${IGCM_debug_LenStack} ]; do
104#          printf -- ' ' >> stack
105      printf ' ' >> stack
106      let $(( decal=decal+1 ))
107    done
108    echo "> ${IGCM_debug_LenStack} : ${@}" >> stack
109
110    # We add function call name on beginning of the stack
111    set +A IGCM_debug_Stack -- ${1} ${IGCM_debug_Stack[*]}
112
113    # We include the "null" Args in the beginning of the StackArgs
114    set +A IGCM_debug_StackArgs ${NULL_STR} ${IGCM_debug_StackArgs[*]} 
115    # Then, we shift StackArgs tabular
116    if [ $# -gt 1 ]; then
117      shift;
118      IGCM_debug_StackArgs[0]=$(echo ${@} | sed -e "s/\ /,/g") >&2
119    fi
120    (( IGCM_debug_LenStack = IGCM_debug_LenStack + 1 ))
121
122    # If you want to print CallStack each time :
123    # IGCM_debug_CallStack
124  fi
125}
126
127#D-#==================================================================
128#D-function IGCM_debug_PopStack
129#D-* Purpose: Pop a function name in the stack
130#D-
131function IGCM_debug_PopStack {
132  if ( $DEBUG_debug ) ; then
133    if ( ${ExitFlag} ) ; then
134      echo '!!! ExitFlag has been activated !!!' >> stack
135    fi
136    if [ "${IGCM_debug_Stack[0]}" = "${1}" ]; then
137      let $(( IGCM_debug_LenStack = IGCM_debug_LenStack - 1 ))
138
139      IGCM_debug_Stack[0]="" 
140      IGCM_debug_StackArgs[0]=""
141     
142      set +A tmpStack -- ${IGCM_debug_Stack[*]}
143      unset IGCM_debug_Stack
144      set +A IGCM_debug_Stack -- ${tmpStack[*]} 
145
146      set +A tmpStack -- ${IGCM_debug_StackArgs[*]}
147      unset IGCM_debug_StackArgs
148      set +A IGCM_debug_StackArgs -- ${tmpStack[*]}
149      unset tmpStack
150    else
151      echo 'IGCM_debug_Exit : stack is corrupted ! LenStack =' ${IGCM_debug_LenStack}
152      IGCM_debug_Exit $@
153    fi
154    typeset decal=0
155    while [ $decal -lt ${IGCM_debug_LenStack} ]; do
156      # printf -- ' ' >> stack
157      printf ' ' >> stack
158      (( decal=decal+1 ))
159    done
160    echo "< ${IGCM_debug_LenStack} : ${@}" >> stack
161
162    if [ ${IGCM_debug_LenStack} = 0 ]; then
163      # Reset array only when necessary
164      #echo
165      #IGCM_debug_Print 3 "Clean stack array"
166      #echo
167      #set -A IGCM_debug_Stack ${NULL_STR}
168      #set -A IGCM_debug_StackArgs ${NULL_STR}
169      unset IGCM_debug_Stack
170      unset IGCM_debug_StackArgs
171      IGCM_debug_Stack[0]=${NULL_STR}
172      IGCM_debug_StackArgs[0]=${NULL_STR}
173    fi
174
175  fi
176  #IGCM_debug_CallStack
177}
178
179#D-#==================================================================
180#D-function IGCM_debug_Exit
181#D-* Purpose: Print Call Stack and set ExitFlag to true
182#D-
183function IGCM_debug_Exit {
184  IGCM_debug_PushStack "IGCM_debug_Exit"
185  echo "IGCM_debug_Exit : " "${@}"
186  IGCM_debug_CallStack
187  ExitFlag=true
188  IGCM_debug_PopStack "IGCM_debug_Exit"
189}
190
191#D-#==================================================
192#D-function IGCM_debug_Verif_Exit
193#D-* Purpose: exit with number 1 if ExitFlag is true
194#D-
195function IGCM_debug_Verif_Exit {
196  if ( ${ExitFlag} ) ; then
197    # Plan to send an email here with IGCM_sys_SendMail
198    IGCM_card_WriteOption ${SUBMIT_DIR}/run.card Configuration PeriodState "Fatal"
199    echo "IGCM_debug_Verif_Exit : Something wrong happened."
200    echo "                        EXIT THE JOB."
201    echo
202    if ( $DEBUG_debug ) ; then
203      IGCM_sys_Cp stack ${SUBMIT_DIR}/stack_error
204      echo "Your files on ${R_OUT} :"
205      IGCM_sys_Tree ${R_SAVE}
206      echo
207    fi
208    # Mail notification
209    IGCM_sys_SendMail
210    # And Good Bye
211    date
212    exit 1
213  fi
214}
215
216#D-#==================================================
217#D-function IGCM_debug_Verif_Exit_Post
218#D-* Purpose: exit with number 1 if ExitFlag is true for Post-treatment
219#D-
220function IGCM_debug_Verif_Exit_Post {
221  if ( ${ExitFlag} ) ; then
222    echo "IGCM_debug_Verif_Exit_Post : Something wrong happened."
223    # If SpaceName is PROD then we stop if post_processing fails
224    # Plan to send an email here with IGCM_sys_SendMail
225    if [ X${config_UserChoices_SpaceName} = XPROD ] ; then
226      echo "                        EXIT THE JOB."
227      echo
228      if ( $DEBUG_debug ) ; then
229        IGCM_sys_Cp stack ${SUBMIT_DIR}/stack_error
230        echo
231      fi
232      # Mail notification
233      #IGCM_sys_SendMailPost
234      # And Good Bye
235      date
236      exit 1
237    else
238      echo "Either inside config.card the variable SpaceName is not in PROD"
239      echo "or inside the main Job the variable JobType is not in RUN mode"
240      echo "              SO WE DO NOT EXIT THE JOB."
241      echo
242      date
243    fi
244  fi
245}
246
247#D-#==================================================================
248#D-function IGCM_debug_Print
249#D-* Purpose: Print arguments according to a level of verbosity.
250#D-
251function IGCM_debug_Print
252{
253  typeset level=$1
254  shift
255
256  if [ X"${1}" = X"-e" ]; then
257    typeset cmd_echo="echo -e"
258    shift
259  else
260    typeset cmd_echo="echo"
261  fi
262
263  if [ ${level} -le ${Verbosity} ] ; then
264    typeset i
265    case "${level}" in
266    1) for i in "$@" ; do
267      ${cmd_echo} $(date +"%Y-%m-%d %T") "--Debug1-->" ${i}
268      done ;;
269    2) for i in "$@" ; do
270      ${cmd_echo} $(date +"%Y-%m-%d %T") "--------Debug2-->" ${i}
271      done ;;
272    3) for i in "$@" ; do
273      ${cmd_echo} $(date +"%Y-%m-%d %T") "--------------Debug3-->" ${i}
274      done ;;
275    esac
276  fi
277}
278
279#D-#==================================================================
280#D-function IGCM_debug_PrintVariables
281#D-* Purpose: Print arguments when match a pattern
282#D-           according to a level of verbosity.
283function IGCM_debug_PrintVariables
284{
285  typeset level=$1
286  shift
287
288  list=$( set | grep $1 | sed -e "s/'//g" )
289
290  if [ "X${list}" != X ]  ; then
291    IGCM_debug_Print ${level} ${list}
292  fi
293}
294
295#D-#==================================================================
296#D-function IGCM_debug_Check
297#D- * Purpose: Check the present file by comparison with a reference file
298function IGCM_debug_Check
299{
300  #---------------------
301  if [ ! -n "${libIGCM}" ] ; then
302    echo "Check libIGCM_debug ..........................................[ FAILED ]"
303    echo "--Error--> libIGCM variable is not defined"
304    exit 2
305  fi
306
307  #---------------------
308  if [ ! -n "${Verbosity}" ] ; then
309    echo "Check libIGCM_debug ..........................................[ FAILED ]"
310    echo "--Error--> Verbosity variable is not defined"
311    exit 3
312  fi
313
314  #---------------------
315  ${libIGCM}/libIGCM_debug/IGCM_debug_Test.ksh > IGCM_debug_Test.ref.failed 2>&1
316  sleep 2
317
318  if diff IGCM_debug_Test.ref.failed ${libIGCM}/libIGCM_debug/IGCM_debug_Test.ref > /dev/null 2>&1 ; then
319    echo "Check libIGCM_debug ..............................................[ OK ]"
320    rm -f IGCM_debug_Test.ref.failed
321  else
322    echo "Check libIGCM_debug ..........................................[ FAILED ]"
323    echo "--Error--> Execution of ${libIGCM}/libIGCM_debug/IGCM_debug_Test.ksh"
324    echo "           has produced the file IGCM_debug_Test.ref.failed"
325    echo "           Please analyse differences with the reference file by typing:"
326    echo "           diff IGCM_debug_Test.ref.failed ${libIGCM}/libIGCM_debug/IGCM_debug_Test.ref"
327    echo "           Report errors to the author: Patrick.Brockmann@cea.fr"
328    exit 4
329  fi
330  #---------------------
331}
Note: See TracBrowser for help on using the repository browser.