xref: /petsc/include/petscerror.h (revision 2a6744eb01855f5aa328eb8fdf4b0d01e72ad151)
1 /*
2     Contains all error handling interfaces for PETSc.
3 */
4 #if !defined(__PETSCERROR_H)
5 #define __PETSCERROR_H
6 #include "petsc.h"
7 PETSC_EXTERN_CXX_BEGIN
8 
9 /*
10    Defines the directory where the compiled source is located; used
11    in printing error messages. Each makefile has an entry
12    LOCDIR	  =  thedirectory
13    and bmake/common_variables includes in CCPPFLAGS -D__SDIR__='"${LOCDIR}"'
14    which is a flag passed to the C/C++ compilers. This declaration below
15    is only needed if some code is compiled without the -D__SDIR__
16 */
17 #if !defined(__SDIR__)
18 #define __SDIR__ "unknowndirectory/"
19 #endif
20 
21 /*
22    Defines the function where the compiled source is located; used
23    in printing error messages. This is defined here in case the user
24    does not declare it.
25 */
26 #if !defined(__FUNCT__)
27 #define __FUNCT__ "User provided function"
28 #endif
29 
30 /*
31      These are the generic error codes. These error codes are used
32      many different places in the PETSc source code. The string versions are
33      at src/sys/error/err.c any changes here must also be made there
34      These are also define in include/finclude/petscerror.h any CHANGES here
35      must be also made there.
36 
37 */
38 #define PETSC_ERR_MIN_VALUE        54   /* should always be one less then the smallest value */
39 
40 #define PETSC_ERR_MEM              55   /* unable to allocate requested memory */
41 #define PETSC_ERR_SUP              56   /* no support for requested operation */
42 #define PETSC_ERR_SUP_SYS          57   /* no support for requested operation on this computer system */
43 #define PETSC_ERR_ORDER            58   /* operation done in wrong order */
44 #define PETSC_ERR_SIG              59   /* signal received */
45 #define PETSC_ERR_FP               72   /* floating point exception */
46 #define PETSC_ERR_COR              74   /* corrupted PETSc object */
47 #define PETSC_ERR_LIB              76   /* error in library called by PETSc */
48 #define PETSC_ERR_PLIB             77   /* PETSc library generated inconsistent data */
49 #define PETSC_ERR_MEMC             78   /* memory corruption */
50 #define PETSC_ERR_CONV_FAILED      82   /* iterative method (KSP or SNES) failed */
51 #define PETSC_ERR_USER             83   /* user has not provided needed function */
52 
53 #define PETSC_ERR_ARG_SIZ          60   /* nonconforming object sizes used in operation */
54 #define PETSC_ERR_ARG_IDN          61   /* two arguments not allowed to be the same */
55 #define PETSC_ERR_ARG_WRONG        62   /* wrong argument (but object probably ok) */
56 #define PETSC_ERR_ARG_CORRUPT      64   /* null or corrupted PETSc object as argument */
57 #define PETSC_ERR_ARG_OUTOFRANGE   63   /* input argument, out of range */
58 #define PETSC_ERR_ARG_BADPTR       68   /* invalid pointer argument */
59 #define PETSC_ERR_ARG_NOTSAMETYPE  69   /* two args must be same object type */
60 #define PETSC_ERR_ARG_NOTSAMECOMM  80   /* two args must be same communicators */
61 #define PETSC_ERR_ARG_WRONGSTATE   73   /* object in argument is in wrong state, e.g. unassembled mat */
62 #define PETSC_ERR_ARG_INCOMP       75   /* two arguments are incompatible */
63 #define PETSC_ERR_ARG_NULL         85   /* argument is null that should not be */
64 #define PETSC_ERR_ARG_UNKNOWN_TYPE 86   /* type name doesn't match any registered type */
65 #define PETSC_ERR_ARG_DOMAIN       87   /* argument is not in domain of function */
66 
67 #define PETSC_ERR_FILE_OPEN        65   /* unable to open file */
68 #define PETSC_ERR_FILE_READ        66   /* unable to read from file */
69 #define PETSC_ERR_FILE_WRITE       67   /* unable to write to file */
70 #define PETSC_ERR_FILE_UNEXPECTED  79   /* unexpected data in file */
71 
72 #define PETSC_ERR_MAT_LU_ZRPVT     71   /* detected a zero pivot during LU factorization */
73 #define PETSC_ERR_MAT_CH_ZRPVT     81   /* detected a zero pivot during Cholesky factorization */
74 
75 #define PETSC_ERR_MAX_VALUE        88   /* this is always the one more than the largest error code */
76 
77 #if defined(PETSC_USE_ERRORCHECKING)
78 
79 /*MC
80    SETERRQ - Macro that is called when an error has been detected,
81 
82    Not Collective
83 
84    Synopsis:
85    void SETERRQ(PetscErrorCode errorcode,char *message)
86 
87 
88    Input Parameters:
89 +  errorcode - nonzero error code, see the list of standard error codes in include/petscerror.h
90 -  message - error message
91 
92   Level: beginner
93 
94    Notes:
95     Once the error handler is called the calling function is then returned from with the given error code.
96 
97     See SETERRQ1(), SETERRQ2(), SETERRQ3() for versions that take arguments
98 
99 
100    Experienced users can set the error handler with PetscPushErrorHandler().
101 
102    Concepts: error^setting condition
103 
104 .seealso: PetscTraceBackErrorHandler(), PetscPushErrorHandler(), PetscError(), CHKERRQ(), CHKMEMQ, SETERRQ1(), SETERRQ2(), SETERRQ3()
105 M*/
106 #define SETERRQ(n,s)              {return PetscError(__LINE__,__FUNCT__,__FILE__,__SDIR__,n,1,s);}
107 
108 /*MC
109    SETERRQ1 - Macro that is called when an error has been detected,
110 
111    Not Collective
112 
113    Synopsis:
114    void SETERRQ1(PetscErrorCode errorcode,char *formatmessage,arg)
115 
116 
117    Input Parameters:
118 +  errorcode - nonzero error code, see the list of standard error codes in include/petscerror.h
119 .  message - error message in the printf format
120 -  arg - argument (for example an integer, string or double)
121 
122   Level: beginner
123 
124    Notes:
125     Once the error handler is called the calling function is then returned from with the given error code.
126 
127    Experienced users can set the error handler with PetscPushErrorHandler().
128 
129    Concepts: error^setting condition
130 
131 .seealso: PetscTraceBackErrorHandler(), PetscPushErrorHandler(), PetscError(), CHKERRQ(), CHKMEMQ, SETERRQ(), SETERRQ2(), SETERRQ3()
132 M*/
133 #define SETERRQ1(n,s,a1)          {return PetscError(__LINE__,__FUNCT__,__FILE__,__SDIR__,n,1,s,a1);}
134 
135 /*MC
136    SETERRQ2 - Macro that is called when an error has been detected,
137 
138    Not Collective
139 
140    Synopsis:
141    void SETERRQ2(PetscErrorCode errorcode,char *formatmessage,arg1,arg2)
142 
143 
144    Input Parameters:
145 +  errorcode - nonzero error code, see the list of standard error codes in include/petscerror.h
146 .  message - error message in the printf format
147 .  arg1 - argument (for example an integer, string or double)
148 -  arg2 - argument (for example an integer, string or double)
149 
150   Level: beginner
151 
152    Notes:
153     Once the error handler is called the calling function is then returned from with the given error code.
154 
155    Experienced users can set the error handler with PetscPushErrorHandler().
156 
157    Concepts: error^setting condition
158 
159 .seealso: PetscTraceBackErrorHandler(), PetscPushErrorHandler(), PetscError(), CHKERRQ(), CHKMEMQ, SETERRQ1(), SETERRQ3()
160 M*/
161 #define SETERRQ2(n,s,a1,a2)       {return PetscError(__LINE__,__FUNCT__,__FILE__,__SDIR__,n,1,s,a1,a2);}
162 
163 /*MC
164    SETERRQ3 - Macro that is called when an error has been detected,
165 
166    Not Collective
167 
168    Synopsis:
169    void SETERRQ3(PetscErrorCode errorcode,char *formatmessage,arg1,arg2,arg3)
170 
171 
172    Input Parameters:
173 +  errorcode - nonzero error code, see the list of standard error codes in include/petscerror.h
174 .  message - error message in the printf format
175 .  arg1 - argument (for example an integer, string or double)
176 .  arg2 - argument (for example an integer, string or double)
177 -  arg3 - argument (for example an integer, string or double)
178 
179   Level: beginner
180 
181    Notes:
182     Once the error handler is called the calling function is then returned from with the given error code.
183 
184     There are also versions for 4, 5, 6 and 7 arguments.
185 
186    Experienced users can set the error handler with PetscPushErrorHandler().
187 
188    Concepts: error^setting condition
189 
190 .seealso: PetscTraceBackErrorHandler(), PetscPushErrorHandler(), PetscError(), CHKERRQ(), CHKMEMQ, SETERRQ1(), SETERRQ2()
191 M*/
192 #define SETERRQ3(n,s,a1,a2,a3)    {return PetscError(__LINE__,__FUNCT__,__FILE__,__SDIR__,n,1,s,a1,a2,a3);}
193 
194 #define SETERRQ4(n,s,a1,a2,a3,a4) {return PetscError(__LINE__,__FUNCT__,__FILE__,__SDIR__,n,1,s,a1,a2,a3,a4);}
195 #define SETERRQ5(n,s,a1,a2,a3,a4,a5)       {return PetscError(__LINE__,__FUNCT__,__FILE__,__SDIR__,n,1,s,a1,a2,a3,a4,a5);}
196 #define SETERRQ6(n,s,a1,a2,a3,a4,a5,a6)    {return PetscError(__LINE__,__FUNCT__,__FILE__,__SDIR__,n,1,s,a1,a2,a3,a4,a5,a6);}
197 #define SETERRQ7(n,s,a1,a2,a3,a4,a5,a6,a7) {return PetscError(__LINE__,__FUNCT__,__FILE__,__SDIR__,n,1,s,a1,a2,a3,a4,a5,a6,a7);}
198 #define SETERRABORT(comm,n,s)     {PetscError(__LINE__,__FUNCT__,__FILE__,__SDIR__,n,1,s);MPI_Abort(comm,n);}
199 
200 /*MC
201    CHKERRQ - Checks error code, if non-zero it calls the error handler and then returns
202 
203    Not Collective
204 
205    Synopsis:
206    void CHKERRQ(PetscErrorCode errorcode)
207 
208 
209    Input Parameters:
210 .  errorcode - nonzero error code, see the list of standard error codes in include/petscerror.h
211 
212   Level: beginner
213 
214    Notes:
215     Once the error handler is called the calling function is then returned from with the given error code.
216 
217     Experienced users can set the error handler with PetscPushErrorHandler().
218 
219     CHKERRQ(n) is fundamentally a macro replacement for
220          if (n) return(PetscError(...,n,...));
221 
222     Although typical usage resembles "void CHKERRQ(PetscErrorCode)" as described above, for certain uses it is
223     highly inappropriate to use it in this manner as it invokes return(PetscErrorCode). In particular,
224     it cannot be used in functions which return(void) or any other datatype.  In these types of functions,
225     a more appropriate construct for using PETSc Error Handling would be
226          if (n) {PetscError(....); return(YourReturnType);}
227 
228    Concepts: error^setting condition
229 
230 .seealso: PetscTraceBackErrorHandler(), PetscPushErrorHandler(), PetscError(), SETERRQ(), CHKMEMQ, SETERRQ1(), SETERRQ2(), SETERRQ2()
231 M*/
232 #define CHKERRQ(n)             if (n) {return PetscError(__LINE__,__FUNCT__,__FILE__,__SDIR__,n,0," ");}
233 
234 #define CHKERRABORT(comm,n)    if (n) {PetscError(__LINE__,__FUNCT__,__FILE__,__SDIR__,n,0," ");MPI_Abort(comm,n);}
235 #define CHKERRCONTINUE(n)      if (n) {PetscError(__LINE__,__FUNCT__,__FILE__,__SDIR__,n,0," ");}
236 
237 /*MC
238    CHKMEMQ - Checks the memory for corruption, calls error handler if any is detected
239 
240    Not Collective
241 
242    Synopsis:
243    CHKMEMQ;
244 
245   Level: beginner
246 
247    Notes:
248     Must run with the option -malloc_debug to enable this option
249 
250     Once the error handler is called the calling function is then returned from with the given error code.
251 
252     By defaults prints location where memory that is corrupted was allocated.
253 
254     Use CHKMEMA for functions that return void
255 
256    Concepts: memory corruption
257 
258 .seealso: PetscTraceBackErrorHandler(), PetscPushErrorHandler(), PetscError(), SETERRQ(), CHKMEMQ, SETERRQ1(), SETERRQ2(), SETERRQ3(),
259           PetscMallocValidate()
260 M*/
261 #define CHKMEMQ {PetscErrorCode _7_ierr = PetscMallocValidate(__LINE__,__FUNCT__,__FILE__,__SDIR__);CHKERRQ(_7_ierr);}
262 
263 #define CHKMEMA {PetscMallocValidate(__LINE__,__FUNCT__,__FILE__,__SDIR__);}
264 
265 #if defined(PETSC_UNDERSCORE_CHKERR)
266 extern  PetscErrorCode __gierr;
267 #define _   __gierr =
268 #define ___  CHKERRQ(__gierr);
269 #endif
270 
271 #define               PETSC_EXCEPTIONS_MAX  256
272 extern PetscErrorCode PetscErrorUncatchable[PETSC_EXCEPTIONS_MAX];
273 extern PetscInt       PetscErrorUncatchableCount;
274 extern PetscErrorCode PetscExceptions[PETSC_EXCEPTIONS_MAX];
275 extern PetscInt       PetscExceptionsCount;
276 
277 EXTERN PetscErrorCode PETSC_DLLEXPORT PetscExceptionPush(PetscErrorCode);
278 EXTERN void PETSC_DLLEXPORT PetscExceptionPop(PetscErrorCode);
279 
280 EXTERN PetscErrorCode PETSC_DLLEXPORT PetscErrorSetCatchable(PetscErrorCode,PetscTruth);
281 EXTERN PetscTruth PETSC_DLLEXPORT PetscErrorIsCatchable(PetscErrorCode);
282 /*MC
283    PetscExceptionCaught - Indicates if a specific exception zierr was caught.
284 
285    Not Collective
286 
287    Synopsis:
288      PetscTruth PetscExceptionCaught(PetscErrorCode xierr,PetscErrorCode zierr);
289 
290   Input Parameters:
291   + xierr - error code returned from PetscExceptionTry1()
292   - zierr - error code you want it to be
293 
294   Level: advanced
295 
296    Notes:
297     PETSc must not be configured using the option --with-errorchecking=0 for this to work
298 
299     Use PetscExceptionValue() to see if the current error code is one that has been "tried"
300 
301   Concepts: exceptions, exception hanlding
302 
303 .seealso: PetscTraceBackErrorHandler(), PetscPushErrorHandler(), PetscError(), SETERRQ(), CHKMEMQ, SETERRQ1(), SETERRQ2(), SETERRQ3(),
304           CHKERRQ(), PetscExceptionTry1(), PetscExceptionValue()
305 M*/
306 PETSC_STATIC_INLINE PetscTruth PetscExceptionCaught(PetscErrorCode xierr,PetscErrorCode zierr) {
307   PetscInt i;
308   if (xierr != zierr) return PETSC_FALSE;
309   for (i=0; i<PetscErrorUncatchableCount; i++) {
310     if (PetscErrorUncatchable[i] == zierr) {
311       return PETSC_FALSE;
312     }
313   }
314   return PETSC_TRUE;
315 }
316 
317 /*MC
318    PetscExceptionValue - Indicates if the error code is one that is currently being tried
319 
320    Not Collective
321 
322    Synopsis:
323      PetscTruth PetscExceptionValue(PetscErrorCode xierr);
324 
325   Input Parameters:
326   . xierr - error code
327 
328   Level: developer
329 
330    Notes:
331     PETSc must not be configured using the option --with-errorchecking=0 for this to work
332 
333     Use PetscExceptionCaught() to see if the current error code is EXACTLY the one you want
334 
335   Concepts: exceptions, exception hanlding
336 
337 .seealso: PetscTraceBackErrorHandler(), PetscPushErrorHandler(), PetscError(), SETERRQ(), CHKMEMQ, SETERRQ1(), SETERRQ2(), SETERRQ3(),
338           CHKERRQ(), PetscExceptionTry1(), PetscExceptionCaught()
339 M*/
340 PETSC_STATIC_INLINE PetscTruth PetscExceptionValue(PetscErrorCode zierr) {
341   PetscInt i;
342   for (i=0; i<PetscExceptionsCount; i++) {
343     if (PetscExceptions[i] == zierr) {
344       return PETSC_TRUE;
345     }
346   }
347   return PETSC_FALSE;
348 }
349 
350 /*MC
351    PetscExceptionTry1 - Runs the routine, causing a particular error code to be treated as an exception,
352          rather than an error. That is if that error code is treated the program returns to this level,
353          but does not call the error handlers
354 
355    Not Collective
356 
357    Synopsis:
358      PetscExceptionTry1(PetscErrorCode routine(....),PetscErrorCode);
359 
360   Level: advanced
361 
362    Notes:
363     PETSc must not be configured using the option --with-errorchecking=0 for this to work
364 
365   Note: In general, the outer most try on an exception is the one that will be caught (that is trys down in
366         PETSc code will not usually handle an exception that was issued above). See SNESSolve() for an example
367         of how the local try is ignored if a higher (in the stack) one is also in effect.
368 
369   Concepts: exceptions, exception hanlding
370 
371 .seealso: PetscTraceBackErrorHandler(), PetscPushErrorHandler(), PetscError(), SETERRQ(), CHKMEMQ, SETERRQ1(), SETERRQ2(), SETERRQ3(),
372           CHKERRQ(), PetscExceptionCaught(), PetscExceptionPush(), PetscExceptionPop()
373 M*/
374 extern PetscErrorCode PetscExceptionTmp;
375 #define PetscExceptionTry1(a,b) (PetscExceptionTmp = PetscExceptionPush(b)) ? PetscExceptionTmp : (PetscExceptionTmp = a , PetscExceptionPop(b),PetscExceptionTmp)
376 
377 #else
378 
379 /*
380     These are defined to be empty for when error checking is turned off, with config/configure.py --with-errorchecking=0
381 */
382 
383 #define SETERRQ(n,s) ;
384 #define SETERRQ1(n,s,a1) ;
385 #define SETERRQ2(n,s,a1,a2) ;
386 #define SETERRQ3(n,s,a1,a2,a3) ;
387 #define SETERRQ4(n,s,a1,a2,a3,a4) ;
388 #define SETERRQ5(n,s,a1,a2,a3,a4,a5) ;
389 #define SETERRQ6(n,s,a1,a2,a3,a4,a5,a6) ;
390 #define SETERRABORT(comm,n,s) ;
391 
392 #define CHKERRQ(n)     ;
393 #define CHKERRABORT(comm,n) ;
394 #define CHKERRCONTINUE(n) ;
395 
396 #define CHKMEMQ        ;
397 
398 #if !defined(PETSC_SKIP_UNDERSCORE_CHKERR)
399 #define _
400 #define ___
401 #endif
402 
403 #define PetscErrorSetCatchable(a,b) 0
404 #define PetscExceptionCaught(a,b)   PETSC_FALSE
405 #define PetscExceptionValue(a)      PETSC_FALSE
406 #define PetscExceptionTry1(a,b)     a
407 #endif
408 
409 EXTERN PetscErrorCode PETSC_DLLEXPORT PetscErrorPrintfInitialize(void);
410 EXTERN PetscErrorCode PETSC_DLLEXPORT PetscErrorMessage(int,const char*[],char **);
411 EXTERN PetscErrorCode PETSC_DLLEXPORT PetscTraceBackErrorHandler(int,const char*,const char*,const char*,PetscErrorCode,int,const char*,void*);
412 EXTERN PetscErrorCode PETSC_DLLEXPORT PetscIgnoreErrorHandler(int,const char*,const char*,const char*,PetscErrorCode,int,const char*,void*);
413 EXTERN PetscErrorCode PETSC_DLLEXPORT PetscEmacsClientErrorHandler(int,const char*,const char*,const char*,PetscErrorCode,int,const char*,void*);
414 EXTERN PetscErrorCode PETSC_DLLEXPORT PetscStopErrorHandler(int,const char*,const char*,const char*,PetscErrorCode,int,const char*,void*);
415 EXTERN PetscErrorCode PETSC_DLLEXPORT PetscAbortErrorHandler(int,const char*,const char*,const char*,PetscErrorCode,int,const char*,void*);
416 EXTERN PetscErrorCode PETSC_DLLEXPORT PetscAttachDebuggerErrorHandler(int,const char*,const char*,const char*,PetscErrorCode,int,const char*,void*);
417 EXTERN PetscErrorCode PETSC_DLLEXPORT PetscReturnErrorHandler(int,const char*,const char*,const char*,PetscErrorCode,int,const char*,void*);
418 EXTERN PetscErrorCode PETSC_DLLEXPORT PetscError(int,const char*,const char*,const char*,PetscErrorCode,int,const char*,...) PETSC_PRINTF_FORMAT_CHECK(7,8);
419 EXTERN PetscErrorCode PETSC_DLLEXPORT PetscPushErrorHandler(PetscErrorCode (*handler)(int,const char*,const char*,const char*,PetscErrorCode,int,const char*,void*),void*);
420 EXTERN PetscErrorCode PETSC_DLLEXPORT PetscPopErrorHandler(void);
421 EXTERN PetscErrorCode PETSC_DLLEXPORT PetscDefaultSignalHandler(int,void*);
422 EXTERN PetscErrorCode PETSC_DLLEXPORT PetscPushSignalHandler(PetscErrorCode (*)(int,void *),void*);
423 EXTERN PetscErrorCode PETSC_DLLEXPORT PetscPopSignalHandler(void);
424 
425 typedef enum {PETSC_FP_TRAP_OFF=0,PETSC_FP_TRAP_ON=1} PetscFPTrap;
426 EXTERN PetscErrorCode PETSC_DLLEXPORT  PetscSetFPTrap(PetscFPTrap);
427 
428 /*
429       Allows the code to build a stack frame as it runs
430 */
431 #if defined(PETSC_USE_DEBUG)
432 
433 #define PETSCSTACKSIZE 15
434 
435 typedef struct  {
436   const char *function[PETSCSTACKSIZE];
437   const char *file[PETSCSTACKSIZE];
438   const char *directory[PETSCSTACKSIZE];
439         int  line[PETSCSTACKSIZE];
440         int currentsize;
441 } PetscStack;
442 
443 extern PETSC_DLLEXPORT PetscStack *petscstack;
444 EXTERN PetscErrorCode PETSC_DLLEXPORT  PetscStackCopy(PetscStack*,PetscStack*);
445 EXTERN PetscErrorCode PETSC_DLLEXPORT  PetscStackPrint(PetscStack*,FILE* fp);
446 
447 #define PetscStackActive (petscstack != 0)
448 
449 
450 /*MC
451    PetscFunctionBegin - First executable line of each PETSc function
452         used for error handling.
453 
454    Synopsis:
455    void PetscFunctionBegin;
456 
457    Usage:
458 .vb
459      int something;
460 
461      PetscFunctionBegin;
462 .ve
463 
464    Notes:
465      Not available in Fortran
466 
467    Level: developer
468 
469 .seealso: PetscFunctionReturn()
470 
471 .keywords: traceback, error handling
472 M*/
473 #define PetscFunctionBegin \
474   {\
475    if (petscstack && (petscstack->currentsize < PETSCSTACKSIZE)) {    \
476     petscstack->function[petscstack->currentsize]  = __FUNCT__; \
477     petscstack->file[petscstack->currentsize]      = __FILE__; \
478     petscstack->directory[petscstack->currentsize] = __SDIR__; \
479     petscstack->line[petscstack->currentsize]      = __LINE__; \
480     petscstack->currentsize++; \
481   }}
482 
483 #define PetscStackPush(n) \
484   {if (petscstack && (petscstack->currentsize < PETSCSTACKSIZE)) {    \
485     petscstack->function[petscstack->currentsize]  = n; \
486     petscstack->file[petscstack->currentsize]      = "unknown"; \
487     petscstack->directory[petscstack->currentsize] = "unknown"; \
488     petscstack->line[petscstack->currentsize]      = 0; \
489     petscstack->currentsize++; \
490   }}
491 
492 #define PetscStackPop \
493   {if (petscstack && petscstack->currentsize > 0) {     \
494     petscstack->currentsize--; \
495     petscstack->function[petscstack->currentsize]  = 0; \
496     petscstack->file[petscstack->currentsize]      = 0; \
497     petscstack->directory[petscstack->currentsize] = 0; \
498     petscstack->line[petscstack->currentsize]      = 0; \
499   }};
500 
501 /*MC
502    PetscFunctionReturn - Last executable line of each PETSc function
503         used for error handling. Replaces return()
504 
505    Synopsis:
506    void PetscFunctionReturn(0);
507 
508    Usage:
509 .vb
510     ....
511      PetscFunctionReturn(0);
512    }
513 .ve
514 
515    Notes:
516      Not available in Fortran
517 
518    Level: developer
519 
520 .seealso: PetscFunctionBegin()
521 
522 .keywords: traceback, error handling
523 M*/
524 #define PetscFunctionReturn(a) \
525   {\
526   PetscStackPop; \
527   return(a);}
528 
529 #define PetscFunctionReturnVoid() \
530   {\
531   PetscStackPop; \
532   return;}
533 
534 
535 #else
536 
537 #define PetscFunctionBegin
538 #define PetscFunctionReturn(a)  return(a)
539 #define PetscFunctionReturnVoid() return
540 #define PetscStackPop
541 #define PetscStackPush(f)
542 #define PetscStackActive        0
543 
544 #endif
545 
546 EXTERN PetscErrorCode PETSC_DLLEXPORT  PetscStackCreate(void);
547 EXTERN PetscErrorCode PETSC_DLLEXPORT  PetscStackView(PetscViewer);
548 EXTERN PetscErrorCode PETSC_DLLEXPORT  PetscStackDestroy(void);
549 EXTERN PetscErrorCode PETSC_DLLEXPORT  PetscStackPublish(void);
550 EXTERN PetscErrorCode PETSC_DLLEXPORT  PetscStackDepublish(void);
551 
552 
553 PETSC_EXTERN_CXX_END
554 #endif
555