154a8ef01SBarry Smith /* 2f621e05eSBarry Smith Contains all error handling interfaces for PETSc. 354a8ef01SBarry Smith */ 445d48df9SBarry Smith #if !defined(__PETSCERROR_H) 545d48df9SBarry Smith #define __PETSCERROR_H 66c7e564aSBarry Smith 754a8ef01SBarry Smith /* 854a8ef01SBarry Smith Defines the directory where the compiled source is located; used 95e97870eSBarry Smith in printing error messages. Each makefile has an entry 105e97870eSBarry Smith LOCDIR = thedirectory 11330cf3c9SBarry Smith and bmake/common_variables includes in CCPPFLAGS -D__SDIR__=${LOCDIR} 12f621e05eSBarry Smith which is a flag passed to the C/C++ compilers. This declaration below 13f621e05eSBarry Smith is only needed if some code is compiled without the -D__SDIR__ 1454a8ef01SBarry Smith */ 15330cf3c9SBarry Smith #if !defined(__INSDIR__) 16330cf3c9SBarry Smith #define __INSDIR__ "unknowndirectory/" 1754a8ef01SBarry Smith #endif 1854a8ef01SBarry Smith 1954a8ef01SBarry Smith /* 204f227f7cSBarry Smith Defines the function where the compiled source is located; used 21f621e05eSBarry Smith in printing error messages. This is defined here in case the user 22f621e05eSBarry Smith does not declare it. 234f227f7cSBarry Smith */ 244a2ae208SSatish Balay #if !defined(__FUNCT__) 25da9b6338SBarry Smith #define __FUNCT__ "User provided function" 264f227f7cSBarry Smith #endif 274f227f7cSBarry Smith 284f227f7cSBarry Smith /* 29329ffe3dSLois Curfman McInnes These are the generic error codes. These error codes are used 30e2d1d2b7SBarry Smith many different places in the PETSc source code. The string versions are 310e5e90baSSatish Balay at src/sys/error/err.c any changes here must also be made there 320f9cf654SBarry Smith These are also define in include/finclude/petscerror.h any CHANGES here 330f9cf654SBarry Smith must be also made there. 3445d48df9SBarry Smith 3554a8ef01SBarry Smith */ 362a6744ebSBarry Smith #define PETSC_ERR_MIN_VALUE 54 /* should always be one less then the smallest value */ 372a6744ebSBarry Smith 3845d48df9SBarry Smith #define PETSC_ERR_MEM 55 /* unable to allocate requested memory */ 3947794344SBarry Smith #define PETSC_ERR_SUP 56 /* no support for requested operation */ 40e2d1d2b7SBarry Smith #define PETSC_ERR_SUP_SYS 57 /* no support for requested operation on this computer system */ 41e2d1d2b7SBarry Smith #define PETSC_ERR_ORDER 58 /* operation done in wrong order */ 4245d48df9SBarry Smith #define PETSC_ERR_SIG 59 /* signal received */ 43f1caa5a4SBarry Smith #define PETSC_ERR_FP 72 /* floating point exception */ 44a8c6a408SBarry Smith #define PETSC_ERR_COR 74 /* corrupted PETSc object */ 45a8c6a408SBarry Smith #define PETSC_ERR_LIB 76 /* error in library called by PETSc */ 46329ffe3dSLois Curfman McInnes #define PETSC_ERR_PLIB 77 /* PETSc library generated inconsistent data */ 47329ffe3dSLois Curfman McInnes #define PETSC_ERR_MEMC 78 /* memory corruption */ 48b3cc6726SBarry Smith #define PETSC_ERR_CONV_FAILED 82 /* iterative method (KSP or SNES) failed */ 491302d50aSBarry Smith #define PETSC_ERR_USER 83 /* user has not provided needed function */ 504e2ffeddSBarry Smith #define PETSC_ERR_SYS 88 /* error in system call */ 51a8b45ee7SBarry Smith #define PETSC_ERR_POINTER 70 /* pointer does not point to valid address */ 5245d48df9SBarry Smith 5345d48df9SBarry Smith #define PETSC_ERR_ARG_SIZ 60 /* nonconforming object sizes used in operation */ 5445d48df9SBarry Smith #define PETSC_ERR_ARG_IDN 61 /* two arguments not allowed to be the same */ 55a8c6a408SBarry Smith #define PETSC_ERR_ARG_WRONG 62 /* wrong argument (but object probably ok) */ 5645d48df9SBarry Smith #define PETSC_ERR_ARG_CORRUPT 64 /* null or corrupted PETSc object as argument */ 5745d48df9SBarry Smith #define PETSC_ERR_ARG_OUTOFRANGE 63 /* input argument, out of range */ 584f227f7cSBarry Smith #define PETSC_ERR_ARG_BADPTR 68 /* invalid pointer argument */ 594f227f7cSBarry Smith #define PETSC_ERR_ARG_NOTSAMETYPE 69 /* two args must be same object type */ 606831982aSBarry Smith #define PETSC_ERR_ARG_NOTSAMECOMM 80 /* two args must be same communicators */ 61d252947aSBarry Smith #define PETSC_ERR_ARG_WRONGSTATE 73 /* object in argument is in wrong state, e.g. unassembled mat */ 628cda6cd7SBarry Smith #define PETSC_ERR_ARG_TYPENOTSET 89 /* the type of the object has not yet been set */ 63a8c6a408SBarry Smith #define PETSC_ERR_ARG_INCOMP 75 /* two arguments are incompatible */ 644482741eSBarry Smith #define PETSC_ERR_ARG_NULL 85 /* argument is null that should not be */ 65958c9bccSBarry Smith #define PETSC_ERR_ARG_UNKNOWN_TYPE 86 /* type name doesn't match any registered type */ 664f227f7cSBarry Smith 674f227f7cSBarry Smith #define PETSC_ERR_FILE_OPEN 65 /* unable to open file */ 684f227f7cSBarry Smith #define PETSC_ERR_FILE_READ 66 /* unable to read from file */ 694f227f7cSBarry Smith #define PETSC_ERR_FILE_WRITE 67 /* unable to write to file */ 70a8c6a408SBarry Smith #define PETSC_ERR_FILE_UNEXPECTED 79 /* unexpected data in file */ 7145d48df9SBarry Smith 72329ffe3dSLois Curfman McInnes #define PETSC_ERR_MAT_LU_ZRPVT 71 /* detected a zero pivot during LU factorization */ 739e3b2f23SBarry Smith #define PETSC_ERR_MAT_CH_ZRPVT 81 /* detected a zero pivot during Cholesky factorization */ 7454a8ef01SBarry Smith 753855c12bSBarry Smith #define PETSC_ERR_INT_OVERFLOW 84 /* should always be one less then the smallest value */ 763855c12bSBarry Smith 77bf3909cdSBarry Smith #define PETSC_ERR_FLOP_COUNT 90 78e113a28aSBarry Smith #define PETSC_ERR_NOT_CONVERGED 91 /* solver did not converge */ 79e113a28aSBarry Smith #define PETSC_ERR_MAX_VALUE 92 /* this is always the one more than the largest error code */ 802a6744ebSBarry Smith 8159aaf355SLisandro Dalcin #define PetscStringizeArg(a) #a 8259aaf355SLisandro Dalcin #define PetscStringize(a) PetscStringizeArg(a) 83330cf3c9SBarry Smith #define __SDIR__ PetscStringize(__INSDIR__) 84330cf3c9SBarry Smith 85e8b7e333SSatish Balay #if defined(PETSC_USE_ERRORCHECKING) 86e8b7e333SSatish Balay 8730de9b25SBarry Smith /*MC 8830de9b25SBarry Smith SETERRQ - Macro that is called when an error has been detected, 8930de9b25SBarry Smith 9030de9b25SBarry Smith Synopsis: 91f2ba6396SBarry Smith #include "petscsys.h" 92e7e72b3dSBarry Smith PetscErrorCode SETERRQ(MPI_Comm comm,PetscErrorCode errorcode,char *message) 9330de9b25SBarry Smith 94eca87e8dSBarry Smith Not Collective 9530de9b25SBarry Smith 9630de9b25SBarry Smith Input Parameters: 9730de9b25SBarry Smith + errorcode - nonzero error code, see the list of standard error codes in include/petscerror.h 9830de9b25SBarry Smith - message - error message 9930de9b25SBarry Smith 10030de9b25SBarry Smith Level: beginner 10130de9b25SBarry Smith 10230de9b25SBarry Smith Notes: 10330de9b25SBarry Smith Once the error handler is called the calling function is then returned from with the given error code. 10430de9b25SBarry Smith 10530de9b25SBarry Smith See SETERRQ1(), SETERRQ2(), SETERRQ3() for versions that take arguments 10630de9b25SBarry Smith 10758ebbce7SBarry Smith In Fortran MPI_Abort() is always called 10830de9b25SBarry Smith 10930de9b25SBarry Smith Experienced users can set the error handler with PetscPushErrorHandler(). 11030de9b25SBarry Smith 11130de9b25SBarry Smith Concepts: error^setting condition 11230de9b25SBarry Smith 11391d3bdf4SKris Buschelman .seealso: PetscTraceBackErrorHandler(), PetscPushErrorHandler(), PetscError(), CHKERRQ(), CHKMEMQ, SETERRQ1(), SETERRQ2(), SETERRQ3() 11430de9b25SBarry Smith M*/ 11553c77d0aSJed Brown #define SETERRQ(comm,n,s) return PetscError(comm,__LINE__,PETSC_FUNCTION_NAME,__FILE__,__SDIR__,n,PETSC_ERROR_INITIAL,s) 11630de9b25SBarry Smith 11730de9b25SBarry Smith /*MC 11830de9b25SBarry Smith SETERRQ1 - Macro that is called when an error has been detected, 11930de9b25SBarry Smith 12030de9b25SBarry Smith Synopsis: 121f2ba6396SBarry Smith #include "petscsys.h" 122e32f2f54SBarry Smith PetscErrorCode SETERRQ1(MPI_Comm comm,PetscErrorCode errorcode,char *formatmessage,arg) 12330de9b25SBarry Smith 124eca87e8dSBarry Smith Not Collective 12530de9b25SBarry Smith 12630de9b25SBarry Smith Input Parameters: 12730de9b25SBarry Smith + errorcode - nonzero error code, see the list of standard error codes in include/petscerror.h 12830de9b25SBarry Smith . message - error message in the printf format 12930de9b25SBarry Smith - arg - argument (for example an integer, string or double) 13030de9b25SBarry Smith 13130de9b25SBarry Smith Level: beginner 13230de9b25SBarry Smith 13330de9b25SBarry Smith Notes: 13430de9b25SBarry Smith Once the error handler is called the calling function is then returned from with the given error code. 13530de9b25SBarry Smith 13630de9b25SBarry Smith Experienced users can set the error handler with PetscPushErrorHandler(). 13730de9b25SBarry Smith 13830de9b25SBarry Smith Concepts: error^setting condition 13930de9b25SBarry Smith 14091d3bdf4SKris Buschelman .seealso: PetscTraceBackErrorHandler(), PetscPushErrorHandler(), PetscError(), CHKERRQ(), CHKMEMQ, SETERRQ(), SETERRQ2(), SETERRQ3() 14130de9b25SBarry Smith M*/ 14253c77d0aSJed Brown #define SETERRQ1(comm,n,s,a1) return PetscError(comm,__LINE__,PETSC_FUNCTION_NAME,__FILE__,__SDIR__,n,PETSC_ERROR_INITIAL,s,a1) 14330de9b25SBarry Smith 14430de9b25SBarry Smith /*MC 14530de9b25SBarry Smith SETERRQ2 - Macro that is called when an error has been detected, 14630de9b25SBarry Smith 14730de9b25SBarry Smith Synopsis: 148f2ba6396SBarry Smith #include "petscsys.h" 149f4442326SMatthew Knepley PetscErrorCode SETERRQ2(PetscErrorCode errorcode,char *formatmessage,arg1,arg2) 15030de9b25SBarry Smith 151eca87e8dSBarry Smith Not Collective 15230de9b25SBarry Smith 15330de9b25SBarry Smith Input Parameters: 15430de9b25SBarry Smith + errorcode - nonzero error code, see the list of standard error codes in include/petscerror.h 15530de9b25SBarry Smith . message - error message in the printf format 15630de9b25SBarry Smith . arg1 - argument (for example an integer, string or double) 15730de9b25SBarry Smith - arg2 - argument (for example an integer, string or double) 15830de9b25SBarry Smith 15930de9b25SBarry Smith Level: beginner 16030de9b25SBarry Smith 16130de9b25SBarry Smith Notes: 16230de9b25SBarry Smith Once the error handler is called the calling function is then returned from with the given error code. 16330de9b25SBarry Smith 16430de9b25SBarry Smith Experienced users can set the error handler with PetscPushErrorHandler(). 16530de9b25SBarry Smith 16630de9b25SBarry Smith Concepts: error^setting condition 16730de9b25SBarry Smith 1686024bd2cSBarry Smith .seealso: PetscTraceBackErrorHandler(), PetscPushErrorHandler(), PetscError(), CHKERRQ(), CHKMEMQ, SETERRQ1(), SETERRQ3() 16930de9b25SBarry Smith M*/ 17053c77d0aSJed Brown #define SETERRQ2(comm,n,s,a1,a2) return PetscError(comm,__LINE__,PETSC_FUNCTION_NAME,__FILE__,__SDIR__,n,PETSC_ERROR_INITIAL,s,a1,a2) 17130de9b25SBarry Smith 17230de9b25SBarry Smith /*MC 17330de9b25SBarry Smith SETERRQ3 - Macro that is called when an error has been detected, 17430de9b25SBarry Smith 17530de9b25SBarry Smith Synopsis: 176f2ba6396SBarry Smith #include "petscsys.h" 177f4442326SMatthew Knepley PetscErrorCode SETERRQ3(PetscErrorCode errorcode,char *formatmessage,arg1,arg2,arg3) 17830de9b25SBarry Smith 179eca87e8dSBarry Smith Not Collective 18030de9b25SBarry Smith 18130de9b25SBarry Smith Input Parameters: 18230de9b25SBarry Smith + errorcode - nonzero error code, see the list of standard error codes in include/petscerror.h 18330de9b25SBarry Smith . message - error message in the printf format 18430de9b25SBarry Smith . arg1 - argument (for example an integer, string or double) 18530de9b25SBarry Smith . arg2 - argument (for example an integer, string or double) 18630de9b25SBarry Smith - arg3 - argument (for example an integer, string or double) 18730de9b25SBarry Smith 18830de9b25SBarry Smith Level: beginner 18930de9b25SBarry Smith 19030de9b25SBarry Smith Notes: 19130de9b25SBarry Smith Once the error handler is called the calling function is then returned from with the given error code. 19230de9b25SBarry Smith 193f621e05eSBarry Smith There are also versions for 4, 5, 6 and 7 arguments. 194f621e05eSBarry Smith 19530de9b25SBarry Smith Experienced users can set the error handler with PetscPushErrorHandler(). 19630de9b25SBarry Smith 19730de9b25SBarry Smith Concepts: error^setting condition 19830de9b25SBarry Smith 1996024bd2cSBarry Smith .seealso: PetscTraceBackErrorHandler(), PetscPushErrorHandler(), PetscError(), CHKERRQ(), CHKMEMQ, SETERRQ1(), SETERRQ2() 20030de9b25SBarry Smith M*/ 20153c77d0aSJed Brown #define SETERRQ3(comm,n,s,a1,a2,a3) return PetscError(comm,__LINE__,PETSC_FUNCTION_NAME,__FILE__,__SDIR__,n,PETSC_ERROR_INITIAL,s,a1,a2,a3) 20230de9b25SBarry Smith 20353c77d0aSJed Brown #define SETERRQ4(comm,n,s,a1,a2,a3,a4) return PetscError(comm,__LINE__,PETSC_FUNCTION_NAME,__FILE__,__SDIR__,n,PETSC_ERROR_INITIAL,s,a1,a2,a3,a4) 20453c77d0aSJed Brown #define SETERRQ5(comm,n,s,a1,a2,a3,a4,a5) return PetscError(comm,__LINE__,PETSC_FUNCTION_NAME,__FILE__,__SDIR__,n,PETSC_ERROR_INITIAL,s,a1,a2,a3,a4,a5) 20553c77d0aSJed Brown #define SETERRQ6(comm,n,s,a1,a2,a3,a4,a5,a6) return PetscError(comm,__LINE__,PETSC_FUNCTION_NAME,__FILE__,__SDIR__,n,PETSC_ERROR_INITIAL,s,a1,a2,a3,a4,a5,a6) 20653c77d0aSJed Brown #define SETERRQ7(comm,n,s,a1,a2,a3,a4,a5,a6,a7) return PetscError(comm,__LINE__,PETSC_FUNCTION_NAME,__FILE__,__SDIR__,n,PETSC_ERROR_INITIAL,s,a1,a2,a3,a4,a5,a6,a7) 2072f3d0e1cSMatthew G Knepley #define SETERRQ8(comm,n,s,a1,a2,a3,a4,a5,a6,a7,a8) return PetscError(comm,__LINE__,PETSC_FUNCTION_NAME,__FILE__,__SDIR__,n,PETSC_ERROR_INITIAL,s,a1,a2,a3,a4,a5,a6,a7,a8) 20853c77d0aSJed Brown #define SETERRABORT(comm,n,s) do {PetscError(comm,__LINE__,PETSC_FUNCTION_NAME,__FILE__,__SDIR__,n,PETSC_ERROR_INITIAL,s);MPI_Abort(comm,n);} while (0) 2099a00fa46SSatish Balay 21030de9b25SBarry Smith /*MC 21130de9b25SBarry Smith CHKERRQ - Checks error code, if non-zero it calls the error handler and then returns 21230de9b25SBarry Smith 21330de9b25SBarry Smith Synopsis: 214f2ba6396SBarry Smith #include "petscsys.h" 215f4442326SMatthew Knepley PetscErrorCode CHKERRQ(PetscErrorCode errorcode) 21630de9b25SBarry Smith 217eca87e8dSBarry Smith Not Collective 21830de9b25SBarry Smith 21930de9b25SBarry Smith Input Parameters: 22030de9b25SBarry Smith . errorcode - nonzero error code, see the list of standard error codes in include/petscerror.h 22130de9b25SBarry Smith 22230de9b25SBarry Smith Level: beginner 22330de9b25SBarry Smith 22430de9b25SBarry Smith Notes: 22530de9b25SBarry Smith Once the error handler is called the calling function is then returned from with the given error code. 22630de9b25SBarry Smith 22730de9b25SBarry Smith Experienced users can set the error handler with PetscPushErrorHandler(). 2285324ea47SKris Buschelman 229fcecf507SKris Buschelman CHKERRQ(n) is fundamentally a macro replacement for 2305324ea47SKris Buschelman if (n) return(PetscError(...,n,...)); 2315324ea47SKris Buschelman 2325324ea47SKris Buschelman Although typical usage resembles "void CHKERRQ(PetscErrorCode)" as described above, for certain uses it is 2335324ea47SKris Buschelman highly inappropriate to use it in this manner as it invokes return(PetscErrorCode). In particular, 2345324ea47SKris Buschelman it cannot be used in functions which return(void) or any other datatype. In these types of functions, 23558ebbce7SBarry Smith you can use CHKERRV() which returns without an error code (bad idea since the error is ignored or 2365324ea47SKris Buschelman if (n) {PetscError(....); return(YourReturnType);} 2370298fd71SBarry Smith where you may pass back a NULL to indicate an error. You can also call CHKERRABORT(comm,n) to have 23858ebbce7SBarry Smith MPI_Abort() returned immediately. 23958ebbce7SBarry Smith 24058ebbce7SBarry Smith In Fortran MPI_Abort() is always called 24130de9b25SBarry Smith 24230de9b25SBarry Smith Concepts: error^setting condition 24330de9b25SBarry Smith 24491d3bdf4SKris Buschelman .seealso: PetscTraceBackErrorHandler(), PetscPushErrorHandler(), PetscError(), SETERRQ(), CHKMEMQ, SETERRQ1(), SETERRQ2(), SETERRQ2() 24530de9b25SBarry Smith M*/ 24653c77d0aSJed Brown #define CHKERRQ(n) do {if (PetscUnlikely(n)) return PetscError(PETSC_COMM_SELF,__LINE__,PETSC_FUNCTION_NAME,__FILE__,__SDIR__,n,PETSC_ERROR_REPEAT," ");} while (0) 24730de9b25SBarry Smith 24853c77d0aSJed Brown #define CHKERRV(n) do {if (PetscUnlikely(n)) {n = PetscError(PETSC_COMM_SELF,__LINE__,PETSC_FUNCTION_NAME,__FILE__,__SDIR__,n,PETSC_ERROR_REPEAT," ");return;}} while(0) 24953c77d0aSJed Brown #define CHKERRABORT(comm,n) do {if (PetscUnlikely(n)) {PetscError(PETSC_COMM_SELF,__LINE__,PETSC_FUNCTION_NAME,__FILE__,__SDIR__,n,PETSC_ERROR_REPEAT," ");MPI_Abort(comm,n);}} while (0) 25053c77d0aSJed Brown #define CHKERRCONTINUE(n) do {if (PetscUnlikely(n)) {PetscError(PETSC_COMM_SELF,__LINE__,PETSC_FUNCTION_NAME,__FILE__,__SDIR__,n,PETSC_ERROR_REPEAT," ");}} while (0) 25185614651SBarry Smith 252fd705b32SMatthew Knepley #ifdef PETSC_CLANGUAGE_CXX 253fd705b32SMatthew Knepley 254cc26af49SMatthew Knepley /*MC 255cc26af49SMatthew Knepley CHKERRXX - Checks error code, if non-zero it calls the C++ error handler which throws an exception 256cc26af49SMatthew Knepley 257cc26af49SMatthew Knepley Synopsis: 258f2ba6396SBarry Smith #include "petscsys.h" 259cc26af49SMatthew Knepley void CHKERRXX(PetscErrorCode errorcode) 260cc26af49SMatthew Knepley 261eca87e8dSBarry Smith Not Collective 262cc26af49SMatthew Knepley 263cc26af49SMatthew Knepley Input Parameters: 264cc26af49SMatthew Knepley . errorcode - nonzero error code, see the list of standard error codes in include/petscerror.h 265cc26af49SMatthew Knepley 266cc26af49SMatthew Knepley Level: beginner 267cc26af49SMatthew Knepley 268cc26af49SMatthew Knepley Notes: 269cc26af49SMatthew Knepley Once the error handler throws a ??? exception. 270cc26af49SMatthew Knepley 271cc26af49SMatthew Knepley You can use CHKERRV() which returns without an error code (bad idea since the error is ignored) 272cc26af49SMatthew Knepley or CHKERRABORT(comm,n) to have MPI_Abort() returned immediately. 273cc26af49SMatthew Knepley 274cc26af49SMatthew Knepley Concepts: error^setting condition 275cc26af49SMatthew Knepley 276cc26af49SMatthew Knepley .seealso: PetscTraceBackErrorHandler(), PetscPushErrorHandler(), PetscError(), SETERRQ(), CHKERRQ(), CHKMEMQ 277cc26af49SMatthew Knepley M*/ 27853c77d0aSJed Brown #define CHKERRXX(n) do {if (PetscUnlikely(n)) {PetscError(PETSC_COMM_SELF,__LINE__,PETSC_FUNCTION_NAME,__FILE__,__SDIR__,n,PETSC_ERROR_IN_CXX,0);}} while(0) 279fd705b32SMatthew Knepley 280fd705b32SMatthew Knepley #endif 281fd705b32SMatthew Knepley 28230de9b25SBarry Smith /*MC 28330de9b25SBarry Smith CHKMEMQ - Checks the memory for corruption, calls error handler if any is detected 28430de9b25SBarry Smith 28530de9b25SBarry Smith Synopsis: 286f2ba6396SBarry Smith #include "petscsys.h" 28791d3bdf4SKris Buschelman CHKMEMQ; 28830de9b25SBarry Smith 289eca87e8dSBarry Smith Not Collective 290eca87e8dSBarry Smith 29130de9b25SBarry Smith Level: beginner 29230de9b25SBarry Smith 29330de9b25SBarry Smith Notes: 294ff002950SBarry Smith Must run with the option -malloc_debug to enable this option 29530de9b25SBarry Smith 29630de9b25SBarry Smith Once the error handler is called the calling function is then returned from with the given error code. 29730de9b25SBarry Smith 29830de9b25SBarry Smith By defaults prints location where memory that is corrupted was allocated. 29930de9b25SBarry Smith 300f621e05eSBarry Smith Use CHKMEMA for functions that return void 301f621e05eSBarry Smith 30230de9b25SBarry Smith Concepts: memory corruption 30330de9b25SBarry Smith 3046024bd2cSBarry Smith .seealso: PetscTraceBackErrorHandler(), PetscPushErrorHandler(), PetscError(), SETERRQ(), CHKMEMQ, SETERRQ1(), SETERRQ2(), SETERRQ3(), 305ff002950SBarry Smith PetscMallocValidate() 30630de9b25SBarry Smith M*/ 30753c77d0aSJed Brown #define CHKMEMQ do {PetscErrorCode _7_ierr = PetscMallocValidate(__LINE__,PETSC_FUNCTION_NAME,__FILE__,__SDIR__);CHKERRQ(_7_ierr);} while(0) 30885614651SBarry Smith 30953c77d0aSJed Brown #define CHKMEMA PetscMallocValidate(__LINE__,PETSC_FUNCTION_NAME,__FILE__,__SDIR__) 310e68848bdSBarry Smith 311f8e50935SSatish Balay #else /* PETSC_USE_ERRORCHECKING */ 312f621e05eSBarry Smith 313f621e05eSBarry Smith /* 314e2e64c6bSBarry Smith These are defined to be empty for when error checking is turned off, with ./configure --with-errorchecking=0 315f621e05eSBarry Smith */ 316f621e05eSBarry Smith 3174b209cf6SBarry Smith #define SETERRQ(c,n,s) 3184b209cf6SBarry Smith #define SETERRQ1(c,n,s,a1) 3194b209cf6SBarry Smith #define SETERRQ2(c,n,s,a1,a2) 3204b209cf6SBarry Smith #define SETERRQ3(c,n,s,a1,a2,a3) 3214b209cf6SBarry Smith #define SETERRQ4(c,n,s,a1,a2,a3,a4) 3224b209cf6SBarry Smith #define SETERRQ5(c,n,s,a1,a2,a3,a4,a5) 3234b209cf6SBarry Smith #define SETERRQ6(c,n,s,a1,a2,a3,a4,a5,a6) 3244ef524e9SStefano Zampini #define SETERRQ7(c,n,s,a1,a2,a3,a4,a5,a6,a7) 3254ef524e9SStefano Zampini #define SETERRQ8(c,n,s,a1,a2,a3,a4,a5,a6,a7,a8) 3264b209cf6SBarry Smith #define SETERRABORT(comm,n,s) 32785614651SBarry Smith 3284f227f7cSBarry Smith #define CHKERRQ(n) ; 3291ee4faa0SMatthew Knepley #define CHKERRABORT(comm,n) ; 3301ee4faa0SMatthew Knepley #define CHKERRCONTINUE(n) ; 33185614651SBarry Smith #define CHKMEMQ ; 33285614651SBarry Smith 3338cabf42eSMatthew G Knepley #ifdef PETSC_CLANGUAGE_CXX 3348cabf42eSMatthew G Knepley #define CHKERRXX(n) ; 3358cabf42eSMatthew G Knepley #endif 3368cabf42eSMatthew G Knepley 337f8e50935SSatish Balay #endif /* PETSC_USE_ERRORCHECKING */ 33854a8ef01SBarry Smith 339668f157eSBarry Smith /*E 340668f157eSBarry Smith PetscErrorType - passed to the PETSc error handling routines indicating if this is the first or a later call to the error handlers 341668f157eSBarry Smith 342668f157eSBarry Smith Level: advanced 343668f157eSBarry Smith 344d736bfebSBarry Smith PETSC_ERROR_IN_CXX indicates the error was detected in C++ and an exception should be generated 345d736bfebSBarry Smith 346668f157eSBarry Smith Developer Notes: This is currently used to decide when to print the detailed information about the run in PetscTraceBackErrorHandling() 347668f157eSBarry Smith 348d736bfebSBarry Smith .seealso: PetscError(), SETERRXX() 349668f157eSBarry Smith E*/ 350d736bfebSBarry Smith typedef enum {PETSC_ERROR_INITIAL=0,PETSC_ERROR_REPEAT=1,PETSC_ERROR_IN_CXX = 2} PetscErrorType; 3514b209cf6SBarry Smith 352014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscErrorPrintfInitialize(void); 353014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscErrorMessage(int,const char*[],char **); 354014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscTraceBackErrorHandler(MPI_Comm,int,const char*,const char*,const char*,PetscErrorCode,PetscErrorType,const char*,void*); 355014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscIgnoreErrorHandler(MPI_Comm,int,const char*,const char*,const char*,PetscErrorCode,PetscErrorType,const char*,void*); 356014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscEmacsClientErrorHandler(MPI_Comm,int,const char*,const char*,const char*,PetscErrorCode,PetscErrorType,const char*,void*); 357014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscMPIAbortErrorHandler(MPI_Comm,int,const char*,const char*,const char*,PetscErrorCode,PetscErrorType,const char*,void*); 358014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscAbortErrorHandler(MPI_Comm,int,const char*,const char*,const char*,PetscErrorCode,PetscErrorType,const char*,void*); 359014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscAttachDebuggerErrorHandler(MPI_Comm,int,const char*,const char*,const char*,PetscErrorCode,PetscErrorType,const char*,void*); 360014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscReturnErrorHandler(MPI_Comm,int,const char*,const char*,const char*,PetscErrorCode,PetscErrorType,const char*,void*); 361014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscError(MPI_Comm,int,const char*,const char*,const char*,PetscErrorCode,PetscErrorType,const char*,...); 362014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscPushErrorHandler(PetscErrorCode (*handler)(MPI_Comm,int,const char*,const char*,const char*,PetscErrorCode,PetscErrorType,const char*,void*),void*); 363014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscPopErrorHandler(void); 3648d359177SBarry Smith PETSC_EXTERN PetscErrorCode PetscSignalHandlerDefault(int,void*); 365014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscPushSignalHandler(PetscErrorCode (*)(int,void *),void*); 366014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscPopSignalHandler(void); 367329f5518SBarry Smith 368639ff905SBarry Smith /*MC 369639ff905SBarry Smith PetscErrorPrintf - Prints error messages. 370639ff905SBarry Smith 371639ff905SBarry Smith Synopsis: 372639ff905SBarry Smith #include "petscsys.h" 373639ff905SBarry Smith PetscErrorCode (*PetscErrorPrintf)(const char format[],...); 374639ff905SBarry Smith 375639ff905SBarry Smith Not Collective 376639ff905SBarry Smith 377639ff905SBarry Smith Input Parameters: 378639ff905SBarry Smith . format - the usual printf() format string 379639ff905SBarry Smith 380639ff905SBarry Smith Options Database Keys: 381639ff905SBarry Smith + -error_output_stdout - cause error messages to be printed to stdout instead of the 382639ff905SBarry Smith (default) stderr 383639ff905SBarry Smith - -error_output_none to turn off all printing of error messages (does not change the way the 384639ff905SBarry Smith error is handled.) 385639ff905SBarry Smith 386639ff905SBarry Smith Notes: Use 387639ff905SBarry Smith $ PetscErrorPrintf = PetscErrorPrintfNone; to turn off all printing of error messages (does not change the way the 388639ff905SBarry Smith $ error is handled.) and 389639ff905SBarry Smith $ PetscErrorPrintf = PetscErrorPrintfDefault; to turn it back on 390639ff905SBarry Smith $ of you can use your own function 391639ff905SBarry Smith 392639ff905SBarry Smith Use 393639ff905SBarry Smith PETSC_STDERR = FILE* obtained from a file open etc. to have stderr printed to the file. 394639ff905SBarry Smith PETSC_STDOUT = FILE* obtained from a file open etc. to have stdout printed to the file. 395639ff905SBarry Smith 396639ff905SBarry Smith Use 397639ff905SBarry Smith PetscPushErrorHandler() to provide your own error handler that determines what kind of messages to print 398639ff905SBarry Smith 399639ff905SBarry Smith Level: developer 400639ff905SBarry Smith 401639ff905SBarry Smith Fortran Note: 402639ff905SBarry Smith This routine is not supported in Fortran. 403639ff905SBarry Smith 404639ff905SBarry Smith Concepts: error messages^printing 405639ff905SBarry Smith Concepts: printing^error messages 406639ff905SBarry Smith 407639ff905SBarry Smith .seealso: PetscFPrintf(), PetscSynchronizedPrintf(), PetscHelpPrintf(), PetscPrintf(), PetscErrorHandlerPush(), PetscVFPrintf(), PetscHelpPrintf() 408639ff905SBarry Smith M*/ 409639ff905SBarry Smith PETSC_EXTERN PetscErrorCode (*PetscErrorPrintf)(const char[],...); 410639ff905SBarry Smith 411329f5518SBarry Smith typedef enum {PETSC_FP_TRAP_OFF=0,PETSC_FP_TRAP_ON=1} PetscFPTrap; 412014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscSetFPTrap(PetscFPTrap); 413014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscFPTrapPush(PetscFPTrap); 414014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscFPTrapPop(void); 41554a8ef01SBarry Smith 4164396dcddSShri Abhyankar /* Linux functions CPU_SET and others don't work if sched.h is not included before 4174396dcddSShri Abhyankar including pthread.h. Also, these functions are active only if either _GNU_SOURCE 4184396dcddSShri Abhyankar or __USE_GNU is not set (see /usr/include/sched.h and /usr/include/features.h), hence 4194396dcddSShri Abhyankar set these first. 4204396dcddSShri Abhyankar */ 42161d886c9SShri Abhyankar #if defined(PETSC_HAVE_PTHREADCLASSES) 4224396dcddSShri Abhyankar #if defined(PETSC_HAVE_SCHED_H) 4234396dcddSShri Abhyankar #ifndef _GNU_SOURCE 4244396dcddSShri Abhyankar #define _GNU_SOURCE 4254396dcddSShri Abhyankar #endif 4264396dcddSShri Abhyankar #include <sched.h> 4274396dcddSShri Abhyankar #endif 42861d886c9SShri Abhyankar #include <pthread.h> 42961d886c9SShri Abhyankar #endif 43061d886c9SShri Abhyankar 431bb9aae2fSBarry Smith /* 432bb9aae2fSBarry Smith This code is for managing thread local global variables. Each of Linux, Microsoft WINDOWS, OpenMP, and Apple OS X have 433bb9aae2fSBarry Smith different ways to indicate this. On OS X each thread local global is accessed by using a pthread_key_t for that variable. 434bb9aae2fSBarry Smith Thus we have functions for creating destroying and using the keys. Except for OS X these access functions merely directly 435bb9aae2fSBarry Smith acess the thread local variable. 436bb9aae2fSBarry Smith */ 437bb9aae2fSBarry Smith 4382e43c059SShri Abhyankar #if defined(PETSC_HAVE_PTHREADCLASSES) && !defined(PETSC_PTHREAD_LOCAL) 439047240e1SBarry Smith typedef pthread_key_t PetscThreadKey; 440fd62bef4SShri Abhyankar /* Get the value associated with key */ 441047240e1SBarry Smith PETSC_STATIC_INLINE void* PetscThreadLocalGetValue(PetscThreadKey key) 442fd62bef4SShri Abhyankar { 443fd62bef4SShri Abhyankar return pthread_getspecific(key); 444fd62bef4SShri Abhyankar } 445fd62bef4SShri Abhyankar 446fd62bef4SShri Abhyankar /* Set the value for key */ 447047240e1SBarry Smith PETSC_STATIC_INLINE void PetscThreadLocalSetValue(PetscThreadKey *key,void* value) 448fd62bef4SShri Abhyankar { 449bb9aae2fSBarry Smith pthread_setspecific(*key,(void*)value); 450fd62bef4SShri Abhyankar } 451fd62bef4SShri Abhyankar 452fd62bef4SShri Abhyankar /* Create pthread thread local key */ 453047240e1SBarry Smith PETSC_STATIC_INLINE void PetscThreadLocalRegister(PetscThreadKey *key) 454fd62bef4SShri Abhyankar { 4550298fd71SBarry Smith pthread_key_create(key,NULL); 456fd62bef4SShri Abhyankar } 457fd62bef4SShri Abhyankar 458fd62bef4SShri Abhyankar /* Delete pthread thread local key */ 459047240e1SBarry Smith PETSC_STATIC_INLINE void PetscThreadLocalDestroy(PetscThreadKey key) 460fd62bef4SShri Abhyankar { 461fd62bef4SShri Abhyankar pthread_key_delete(key); 462fd62bef4SShri Abhyankar } 4632e43c059SShri Abhyankar #else 464047240e1SBarry Smith typedef void* PetscThreadKey; 465047240e1SBarry Smith PETSC_STATIC_INLINE void* PetscThreadLocalGetValue(PetscThreadKey key) 466fd62bef4SShri Abhyankar { 467fd3f9acdSBarry Smith return key; 468fd62bef4SShri Abhyankar } 469fd62bef4SShri Abhyankar 470047240e1SBarry Smith PETSC_STATIC_INLINE void PetscThreadLocalSetValue(PetscThreadKey *key,void* value) 471bb9aae2fSBarry Smith { 472bb9aae2fSBarry Smith *key = value; 473bb9aae2fSBarry Smith } 474fd62bef4SShri Abhyankar 475047240e1SBarry Smith PETSC_STATIC_INLINE void PetscThreadLocalRegister(PETSC_UNUSED PetscThreadKey *key) 476fd62bef4SShri Abhyankar { 477fd62bef4SShri Abhyankar } 478fd62bef4SShri Abhyankar 479047240e1SBarry Smith PETSC_STATIC_INLINE void PetscThreadLocalDestroy(PETSC_UNUSED PetscThreadKey key) 480fd62bef4SShri Abhyankar { 481fd62bef4SShri Abhyankar } 4822e43c059SShri Abhyankar #endif 4832e43c059SShri Abhyankar 4843a40ed3dSBarry Smith /* 4853a40ed3dSBarry Smith Allows the code to build a stack frame as it runs 4863a40ed3dSBarry Smith */ 4878bf1f09cSShri Abhyankar #if defined(PETSC_USE_DEBUG) 4883a40ed3dSBarry Smith 48999cd645aSJed Brown #define PETSCSTACKSIZE 64 490184914b5SBarry Smith 4913a40ed3dSBarry Smith typedef struct { 4920e33f6ddSBarry Smith const char *function[PETSCSTACKSIZE]; 4930e33f6ddSBarry Smith const char *file[PETSCSTACKSIZE]; 4940e33f6ddSBarry Smith const char *directory[PETSCSTACKSIZE]; 495184914b5SBarry Smith int line[PETSCSTACKSIZE]; 496a8d2bbe5SBarry Smith PetscBool petscroutine[PETSCSTACKSIZE]; 497184914b5SBarry Smith int currentsize; 4983a40ed3dSBarry Smith } PetscStack; 4993a40ed3dSBarry Smith 50061d886c9SShri Abhyankar #if defined(PETSC_HAVE_PTHREADCLASSES) 501997ce2baSShri Abhyankar #if defined(PETSC_PTHREAD_LOCAL) 502014dd563SJed Brown PETSC_EXTERN PETSC_PTHREAD_LOCAL PetscStack *petscstack; 503fe89fe5aSShri Abhyankar #else 504047240e1SBarry Smith PETSC_EXTERN PetscThreadKey petscstack; 505fe89fe5aSShri Abhyankar #endif 5061f46d60fSShri Abhyankar #elif defined(PETSC_HAVE_OPENMP) 5071f46d60fSShri Abhyankar PETSC_EXTERN PetscStack *petscstack; 5081f46d60fSShri Abhyankar #pragma omp threadprivate(petscstack) 50961d886c9SShri Abhyankar #else 510014dd563SJed Brown PETSC_EXTERN PetscStack *petscstack; 51161d886c9SShri Abhyankar #endif 51261d886c9SShri Abhyankar 513014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscStackCopy(PetscStack*,PetscStack*); 514014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscStackPrint(PetscStack*,FILE* fp); 515184914b5SBarry Smith 516dbf62e16SBarry Smith PETSC_STATIC_INLINE PetscBool PetscStackActive(void) 517dbf62e16SBarry Smith { 518dbf62e16SBarry Smith return(PetscThreadLocalGetValue(petscstack) ? PETSC_TRUE : PETSC_FALSE); 519dbf62e16SBarry Smith } 5203a40ed3dSBarry Smith 521*441dd030SJed Brown /* Stack handling is based on the following two "NoCheck" macros. These should only be called directly by other error 522*441dd030SJed Brown * handling macros. We record the line of the call, which may or may not be the location of the definition. But is at 523*441dd030SJed Brown * least more useful than "unknown" because it can distinguish multiple calls from the same function. 524*441dd030SJed Brown */ 525*441dd030SJed Brown 526*441dd030SJed Brown #define PetscStackPushNoCheck(funct,petsc_routine) \ 527*441dd030SJed Brown do { \ 528*441dd030SJed Brown PetscStack* petscstackp; \ 529*441dd030SJed Brown PetscStackAMSTakeAccess(); \ 530*441dd030SJed Brown petscstackp = (PetscStack*)PetscThreadLocalGetValue(petscstack); \ 531*441dd030SJed Brown if (petscstackp && (petscstackp->currentsize < PETSCSTACKSIZE)) { \ 532*441dd030SJed Brown petscstackp->function[petscstackp->currentsize] = funct; \ 533*441dd030SJed Brown petscstackp->file[petscstackp->currentsize] = __FILE__; \ 534*441dd030SJed Brown petscstackp->directory[petscstackp->currentsize] = __SDIR__; \ 535*441dd030SJed Brown petscstackp->line[petscstackp->currentsize] = __LINE__; \ 536*441dd030SJed Brown petscstackp->petscroutine[petscstackp->currentsize] = petsc_routine; \ 537*441dd030SJed Brown petscstackp->currentsize++; \ 538*441dd030SJed Brown } \ 539*441dd030SJed Brown PetscStackAMSGrantAccess(); \ 540*441dd030SJed Brown } while (0) 541*441dd030SJed Brown 542*441dd030SJed Brown #define PetscStackPopNoCheck \ 543*441dd030SJed Brown do {PetscStack* petscstackp; \ 544*441dd030SJed Brown PetscStackAMSTakeAccess(); \ 545*441dd030SJed Brown petscstackp = (PetscStack*)PetscThreadLocalGetValue(petscstack); \ 546*441dd030SJed Brown if (petscstackp && petscstackp->currentsize > 0) { \ 547*441dd030SJed Brown petscstackp->currentsize--; \ 548*441dd030SJed Brown petscstackp->function[petscstackp->currentsize] = 0; \ 549*441dd030SJed Brown petscstackp->file[petscstackp->currentsize] = 0; \ 550*441dd030SJed Brown petscstackp->directory[petscstackp->currentsize] = 0; \ 551*441dd030SJed Brown petscstackp->line[petscstackp->currentsize] = 0; \ 552*441dd030SJed Brown petscstackp->petscroutine[petscstackp->currentsize] = PETSC_FALSE;\ 553*441dd030SJed Brown } \ 554*441dd030SJed Brown PetscStackAMSGrantAccess(); \ 555*441dd030SJed Brown } while (0) 556*441dd030SJed Brown 55730de9b25SBarry Smith /*MC 55830de9b25SBarry Smith PetscFunctionBegin - First executable line of each PETSc function 55930de9b25SBarry Smith used for error handling. 56030de9b25SBarry Smith 56130de9b25SBarry Smith Synopsis: 562f2ba6396SBarry Smith #include "petscsys.h" 56330de9b25SBarry Smith void PetscFunctionBegin; 56430de9b25SBarry Smith 565eca87e8dSBarry Smith Not Collective 566eca87e8dSBarry Smith 56730de9b25SBarry Smith Usage: 56830de9b25SBarry Smith .vb 56930de9b25SBarry Smith int something; 57030de9b25SBarry Smith 57130de9b25SBarry Smith PetscFunctionBegin; 57230de9b25SBarry Smith .ve 57330de9b25SBarry Smith 57430de9b25SBarry Smith Notes: 57530de9b25SBarry Smith Not available in Fortran 57630de9b25SBarry Smith 57730de9b25SBarry Smith Level: developer 57830de9b25SBarry Smith 57930de9b25SBarry Smith .seealso: PetscFunctionReturn() 58030de9b25SBarry Smith 58130de9b25SBarry Smith .keywords: traceback, error handling 58230de9b25SBarry Smith M*/ 583*441dd030SJed Brown #define PetscFunctionBegin do { \ 584*441dd030SJed Brown PetscStackPushNoCheck(PETSC_FUNCTION_NAME,PETSC_TRUE); \ 58553c77d0aSJed Brown PetscCheck__FUNCT__(); \ 5862d53ad75SBarry Smith PetscRegister__FUNCT__(); \ 58753c77d0aSJed Brown } while (0) 58853c77d0aSJed Brown 589a8d2bbe5SBarry Smith /*MC 590a8d2bbe5SBarry Smith PetscFunctionBeginUser - First executable line of user provided PETSc routine 591a8d2bbe5SBarry Smith 592a8d2bbe5SBarry Smith Synopsis: 593f2ba6396SBarry Smith #include "petscsys.h" 594a8d2bbe5SBarry Smith void PetscFunctionBeginUser; 595a8d2bbe5SBarry Smith 596a8d2bbe5SBarry Smith Not Collective 597a8d2bbe5SBarry Smith 598a8d2bbe5SBarry Smith Usage: 599a8d2bbe5SBarry Smith .vb 600a8d2bbe5SBarry Smith int something; 601a8d2bbe5SBarry Smith 602a8d2bbe5SBarry Smith PetscFunctionBegin; 603a8d2bbe5SBarry Smith .ve 604a8d2bbe5SBarry Smith 605a8d2bbe5SBarry Smith Notes: 606a8d2bbe5SBarry Smith Not available in Fortran 607a8d2bbe5SBarry Smith 608a8d2bbe5SBarry Smith Level: developer 609a8d2bbe5SBarry Smith 610a8d2bbe5SBarry Smith .seealso: PetscFunctionReturn() 611a8d2bbe5SBarry Smith 612a8d2bbe5SBarry Smith .keywords: traceback, error handling 613a8d2bbe5SBarry Smith M*/ 614a8d2bbe5SBarry Smith #define PetscFunctionBeginUser \ 615a8d2bbe5SBarry Smith do { \ 616*441dd030SJed Brown PetscStackPushNoCheck(PETSC_FUNCTION_NAME,PETSC_FALSE); \ 617a8d2bbe5SBarry Smith PetscCheck__FUNCT__(); \ 618a8d2bbe5SBarry Smith PetscRegister__FUNCT__(); \ 619a8d2bbe5SBarry Smith } while (0) 620a8d2bbe5SBarry Smith 621a8d2bbe5SBarry Smith 6222d53ad75SBarry Smith #if defined(PETSC_SERIALIZE_FUNCTIONS) 6232d53ad75SBarry Smith #include <petsc-private/petscfptimpl.h> 6242d53ad75SBarry Smith /* 6252d53ad75SBarry Smith Registers the current function into the global function pointer to function name table 6262d53ad75SBarry Smith 6272d53ad75SBarry Smith Have to fix this to handle errors but cannot return error since used in PETSC_VIEWER_DRAW_() etc 6282d53ad75SBarry Smith */ 6292d53ad75SBarry Smith #define PetscRegister__FUNCT__() do { \ 6302d53ad75SBarry Smith static PetscBool __chked = PETSC_FALSE; \ 6312d53ad75SBarry Smith if (!__chked) {\ 6320298fd71SBarry Smith void *ptr; PetscDLSym(NULL,__FUNCT__,&ptr);\ 6332d53ad75SBarry Smith __chked = PETSC_TRUE;\ 6342d53ad75SBarry Smith }} while (0) 6352d53ad75SBarry Smith #else 6362d53ad75SBarry Smith #define PetscRegister__FUNCT__() 6372d53ad75SBarry Smith #endif 6382d53ad75SBarry Smith 639573b0fb4SBarry Smith #define PetscCheck__FUNCT__() do { PetscBool _sc1,_sc2; \ 640573b0fb4SBarry Smith PetscStrcmpNoError(PETSC_FUNCTION_NAME,__FUNCT__,&_sc1);\ 641573b0fb4SBarry Smith PetscStrcmpNoError(__FUNCT__,"User provided function",&_sc2);\ 642573b0fb4SBarry Smith if (!_sc1 && !_sc2) { \ 643573b0fb4SBarry Smith printf("%s%s:%d: __FUNCT__=\"%s\" does not agree with %s=\"%s\"\n",__SDIR__,__FILE__,__LINE__,__FUNCT__,PetscStringize(PETSC_FUNCTION_NAME),PETSC_FUNCTION_NAME); \ 64453c77d0aSJed Brown } \ 64553c77d0aSJed Brown } while (0) 6463a40ed3dSBarry Smith 6475cd90555SBarry Smith #define PetscStackPush(n) \ 64861d886c9SShri Abhyankar do { \ 649*441dd030SJed Brown PetscStackPushNoCheck(n,PETSC_FALSE); \ 65015681b3cSBarry Smith CHKMEMQ; \ 65115681b3cSBarry Smith } while (0) 6523a40ed3dSBarry Smith 653d64ed03dSBarry Smith #define PetscStackPop \ 654*441dd030SJed Brown do { \ 655*441dd030SJed Brown CHKMEMQ; \ 656*441dd030SJed Brown PetscStackPopNoCheck; \ 65715681b3cSBarry Smith } while (0) 658d64ed03dSBarry Smith 65930de9b25SBarry Smith /*MC 66030de9b25SBarry Smith PetscFunctionReturn - Last executable line of each PETSc function 66130de9b25SBarry Smith used for error handling. Replaces return() 66230de9b25SBarry Smith 66330de9b25SBarry Smith Synopsis: 664f2ba6396SBarry Smith #include "petscsys.h" 66530de9b25SBarry Smith void PetscFunctionReturn(0); 66630de9b25SBarry Smith 667eca87e8dSBarry Smith Not Collective 668eca87e8dSBarry Smith 66930de9b25SBarry Smith Usage: 67030de9b25SBarry Smith .vb 67130de9b25SBarry Smith .... 67230de9b25SBarry Smith PetscFunctionReturn(0); 67330de9b25SBarry Smith } 67430de9b25SBarry Smith .ve 67530de9b25SBarry Smith 67630de9b25SBarry Smith Notes: 67730de9b25SBarry Smith Not available in Fortran 67830de9b25SBarry Smith 67930de9b25SBarry Smith Level: developer 68030de9b25SBarry Smith 68130de9b25SBarry Smith .seealso: PetscFunctionBegin() 68230de9b25SBarry Smith 68330de9b25SBarry Smith .keywords: traceback, error handling 68430de9b25SBarry Smith M*/ 6855cd90555SBarry Smith #define PetscFunctionReturn(a) \ 6868246ba0dSJed Brown do { \ 687*441dd030SJed Brown PetscStackPopNoCheck; \ 6888246ba0dSJed Brown return(a);} while (0) 689d64ed03dSBarry Smith 690ff94ddecSSatish Balay #define PetscFunctionReturnVoid() \ 6918246ba0dSJed Brown do { \ 692*441dd030SJed Brown PetscStackPopNoCheck; \ 6938246ba0dSJed Brown return;} while (0) 6946d385327SIbrahima Ba #else 6956d385327SIbrahima Ba 696*441dd030SJed Brown #define PetscStackPushNoCheck(funct,petsc_routine) do {} while (0) 697*441dd030SJed Brown #define PetscStackPopNoCheck do {} while (0) 6983a40ed3dSBarry Smith #define PetscFunctionBegin 6990bdf7c52SPeter Brune #define PetscFunctionBeginUser 7003a40ed3dSBarry Smith #define PetscFunctionReturn(a) return(a) 7015665465eSBarry Smith #define PetscFunctionReturnVoid() return 702812af9f3SBarry Smith #define PetscStackPop CHKMEMQ 703812af9f3SBarry Smith #define PetscStackPush(f) CHKMEMQ 704dbf62e16SBarry Smith #define PetscStackActive PETSC_FALSE 7053a40ed3dSBarry Smith 7063a40ed3dSBarry Smith #endif 7073a40ed3dSBarry Smith 708eb6b5d47SBarry Smith /* 709eb6b5d47SBarry Smith PetscStackCall - Calls an external library routine or user function after pushing the name of the routine on the stack. 710eb6b5d47SBarry Smith 711eb6b5d47SBarry Smith Input Parameters: 712eb6b5d47SBarry Smith + name - string that gives the name of the function being called 713fd3f9acdSBarry Smith - routine - actual call to the routine, including ierr = and CHKERRQ(ierr); 714fd3f9acdSBarry Smith 715dbf62e16SBarry Smith Note: Often one should use PetscStackCallStandard() instead. This routine is intended for external library routines that DO NOT return error codes 716eb6b5d47SBarry Smith 717eb6b5d47SBarry Smith Developer Note: this is so that when a user or external library routine results in a crash or corrupts memory, they get blamed instead of PETSc. 718eb6b5d47SBarry Smith 719fd3f9acdSBarry Smith 720fd3f9acdSBarry Smith 721eb6b5d47SBarry Smith */ 72230ecc5abSKarl Rupp #define PetscStackCall(name,routine) do { PetscStackPush(name);routine;PetscStackPop; } while(0) 723eb6b5d47SBarry Smith 724fd3f9acdSBarry Smith /* 725fd3f9acdSBarry Smith PetscStackCallStandard - Calls an external library routine after pushing the name of the routine on the stack. 726fd3f9acdSBarry Smith 727fd3f9acdSBarry Smith Input Parameters: 728fd3f9acdSBarry Smith + func- name of the routine 729fd3f9acdSBarry Smith - args - arguments to the routine surrounded by () 730fd3f9acdSBarry Smith 731dbf62e16SBarry Smith Notes: This is intended for external package routines that return error codes. Use PetscStackCall() for those that do not. 732dbf62e16SBarry Smith 733dbf62e16SBarry Smith Developer Note: this is so that when an external packge routine results in a crash or corrupts memory, they get blamed instead of PETSc. 734fd3f9acdSBarry Smith 735fd3f9acdSBarry Smith */ 736fd3f9acdSBarry Smith #define PetscStackCallStandard(func,args) do { \ 737fd3f9acdSBarry Smith PetscStackPush(#func);ierr = func args;PetscStackPop; if (ierr) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_LIB,"Error in %s()",#func); \ 738fd3f9acdSBarry Smith } while (0) 739fd3f9acdSBarry Smith 740014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscStackCreate(void); 741639ff905SBarry Smith PETSC_EXTERN PetscErrorCode PetscStackView(FILE*); 742014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscStackDestroy(void); 74306d1fe2cSBarry Smith 74406d1fe2cSBarry Smith #endif 745