source: tags/libIGCM_v1_2/libIGCM_debug/libIGCM_debug.ksh @ 487

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

SD : With post processing job they are only signalling issue, we do not stop the job

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