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

Last change on this file since 54 was 54, checked in by sdipsl, 15 years ago

A few bug fixes and adaptation for ulam so that libIGCM auto-check
succeed on this machine.

  • 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.7 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
59#set -A IGCM_debug_Stack ${NULL_STR}
60#set -A IGCM_debug_StackArgs ${NULL_STR}
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    fi
91    echo "!------------------------!"
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=$(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 IGCM_debug_Stack ${IGCM_debug_Stack[*]}
143            set +A IGCM_debug_StackArgs ${IGCM_debug_StackArgs[*]}
144        else
145            echo 'IGCM_debug_Exit : stack is corrupted ! LenStack =' ${IGCM_debug_LenStack}
146            IGCM_debug_Exit $@
147        fi
148        typeset decal=0
149        while [ $decal -lt ${IGCM_debug_LenStack} ]; do
150          # printf -- ' ' >> stack
151          printf ' ' >> stack
152          (( decal=decal+1 ))
153        done
154      echo "< ${IGCM_debug_LenStack} : ${@}" >> stack
155
156      if [ ${IGCM_debug_LenStack} = 0 ]; then
157          # Reset array only when necessary
158          #echo
159          #IGCM_debug_Print 3 "Clean stack array"
160          #echo
161          #set -A IGCM_debug_Stack ${NULL_STR}
162          #set -A IGCM_debug_StackArgs ${NULL_STR}
163          IGCM_debug_Stack[0]=${NULL_STR}
164          IGCM_debug_StackArgs[0]=${NULL_STR}
165      fi
166
167    fi
168
169    #IGCM_debug_CallStack
170}
171
172#D-#==================================================================
173#D-function IGCM_debug_Exit
174#D-* Purpose: Print Call Stack and set ExitFlag to true
175#D-
176function IGCM_debug_Exit {
177    IGCM_debug_PushStack "IGCM_debug_Exit"
178    echo "IGCM_debug_Exit : " "${@}"
179    IGCM_debug_CallStack
180    eval ExitFlag=true
181    IGCM_debug_PopStack "IGCM_debug_Exit"
182}
183
184#D-#==================================================
185#D-function IGCM_debug_Verif_Exit
186#D-* Purpose: exit with number 1 if ExitFlag is true
187#D-
188function IGCM_debug_Verif_Exit {
189    if ( ${ExitFlag} ) ; then
190        IGCM_card_WriteOption ${SUBMIT_DIR}/run.card Configuration PeriodState "Fatal"
191        echo "IGCM_debug_Verif_Exit : Something wrong append."
192        echo "                        EXIT THE JOB."
193        IGCM_sys_Cp stack ${SUBMIT_DIR}/stack_error
194        echo
195        if ( $DEBUG_debug ) ; then
196            echo "Your files on ${R_OUT} :"
197            IGCM_sys_Tree ${R_SAVE}
198            echo
199        fi
200        date
201        exit 1
202    fi
203}
204
205#D-#==================================================
206#D-function IGCM_debug_Verif_Exit_Post
207#D-* Purpose: exit with number 1 if ExitFlag is true for Post-treatment
208#D-
209function IGCM_debug_Verif_Exit_Post {
210    if ( ${ExitFlag} ) ; then
211        echo "IGCM_debug_Verif_Exit_Post : Something wrong append."
212        #echo "                        EXIT THE JOB."
213        echo "         BUT WE DO NOT EXIT THE JOB."
214        echo
215        date
216        #exit 1
217    fi
218}
219
220#D-#==================================================================
221#D-function IGCM_debug_Print
222#D-* Purpose: Print arguments according to a level of verbosity.
223#D-
224function IGCM_debug_Print
225{
226    typeset level=$1
227    shift
228
229    if [ ${level} -le ${Verbosity} ] ; then
230        typeset i
231        case "${level}" in
232            1) for i in "$@" ; do
233                    echo "--Debug1-->" ${i}
234              done ;;
235            2) for i in "$@" ; do
236                    echo "--------Debug2-->" ${i}
237              done ;;
238            3) for i in "$@" ; do
239                    echo "--------------Debug3-->" ${i}
240              done ;;
241        esac
242    fi
243}
244
245#D-#==================================================================
246#D-function IGCM_debug_PrintVariables
247#D-* Purpose: Print arguments when match a pattern
248#D-           according to a level of verbosity.
249function IGCM_debug_PrintVariables
250{
251    typeset level=$1
252    shift
253
254    list=$( set | grep $1 | sed -e "s/'//g" )
255
256    if [ "X${list}" != X ]  ; then
257        IGCM_debug_Print ${level} ${list}
258    fi
259}
260
261#D-#==================================================================
262#D-function IGCM_debug_Check
263#D- * Purpose: Check the present file by comparison with a reference file
264function IGCM_debug_Check
265{
266    #---------------------
267    if [ ! -n "${libIGCM}" ] ; then
268        echo "Check libIGCM_debug ..........................................[ FAILED ]"
269        echo "--Error--> libIGCM variable is not defined"
270        exit 2
271    fi
272
273    #---------------------
274    if [ ! -n "${Verbosity}" ] ; then
275        echo "Check libIGCM_debug ..........................................[ FAILED ]"
276        echo "--Error--> Verbosity variable is not defined"
277        exit 3
278    fi
279
280    #---------------------
281    ${libIGCM}/libIGCM_debug/IGCM_debug_Test.ksh > IGCM_debug_Test.ref.failed 2>&1
282    sleep 2
283
284    if diff IGCM_debug_Test.ref.failed ${libIGCM}/libIGCM_debug/IGCM_debug_Test.ref > /dev/null 2>&1 ; then
285        echo "Check libIGCM_debug ..............................................[ OK ]"
286        rm -f IGCM_debug_Test.ref.failed
287    else
288        echo "Check libIGCM_debug ..........................................[ FAILED ]"
289        echo "--Error--> Execution of ${libIGCM}/libIGCM_debug/IGCM_debug_Test.ksh"
290        echo "           has produced the file IGCM_debug_Test.ref.failed"
291        echo "           Please analyse differences with the reference file by typing:"
292        echo "           diff IGCM_debug_Test.ref.failed ${libIGCM}/libIGCM_debug/IGCM_debug_Test.ref"
293        echo "           Report errors to the author: Patrick.Brockmann@cea.fr"
294        exit 4
295    fi
296    #---------------------
297}
Note: See TracBrowser for help on using the repository browser.