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 52130de9b25SBarry Smith /*MC 52230de9b25SBarry Smith PetscFunctionBegin - First executable line of each PETSc function 52330de9b25SBarry Smith used for error handling. 52430de9b25SBarry Smith 52530de9b25SBarry Smith Synopsis: 526f2ba6396SBarry Smith #include "petscsys.h" 52730de9b25SBarry Smith void PetscFunctionBegin; 52830de9b25SBarry Smith 529eca87e8dSBarry Smith Not Collective 530eca87e8dSBarry Smith 53130de9b25SBarry Smith Usage: 53230de9b25SBarry Smith .vb 53330de9b25SBarry Smith int something; 53430de9b25SBarry Smith 53530de9b25SBarry Smith PetscFunctionBegin; 53630de9b25SBarry Smith .ve 53730de9b25SBarry Smith 53830de9b25SBarry Smith Notes: 53930de9b25SBarry Smith Not available in Fortran 54030de9b25SBarry Smith 54130de9b25SBarry Smith Level: developer 54230de9b25SBarry Smith 54330de9b25SBarry Smith .seealso: PetscFunctionReturn() 54430de9b25SBarry Smith 54530de9b25SBarry Smith .keywords: traceback, error handling 54630de9b25SBarry Smith M*/ 5473a40ed3dSBarry Smith #define PetscFunctionBegin \ 5488246ba0dSJed Brown do { \ 5491f46d60fSShri Abhyankar PetscStack* petscstackp; \ 550*15681b3cSBarry Smith PetscStackAMSTakeAccess(); \ 5511f46d60fSShri Abhyankar petscstackp = (PetscStack*)PetscThreadLocalGetValue(petscstack); \ 5521f46d60fSShri Abhyankar if (petscstackp && (petscstackp->currentsize < PETSCSTACKSIZE)) { \ 5531f46d60fSShri Abhyankar petscstackp->function[petscstackp->currentsize] = PETSC_FUNCTION_NAME; \ 5541f46d60fSShri Abhyankar petscstackp->file[petscstackp->currentsize] = __FILE__; \ 5551f46d60fSShri Abhyankar petscstackp->directory[petscstackp->currentsize] = __SDIR__; \ 5561f46d60fSShri Abhyankar petscstackp->line[petscstackp->currentsize] = __LINE__; \ 557a8d2bbe5SBarry Smith petscstackp->petscroutine[petscstackp->currentsize] = PETSC_TRUE; \ 5581f46d60fSShri Abhyankar petscstackp->currentsize++; \ 55953c77d0aSJed Brown } \ 56053c77d0aSJed Brown PetscCheck__FUNCT__(); \ 5612d53ad75SBarry Smith PetscRegister__FUNCT__(); \ 562*15681b3cSBarry Smith PetscStackAMSGrantAccess(); \ 56353c77d0aSJed Brown } while (0) 56453c77d0aSJed Brown 565a8d2bbe5SBarry Smith /*MC 566a8d2bbe5SBarry Smith PetscFunctionBeginUser - First executable line of user provided PETSc routine 567a8d2bbe5SBarry Smith 568a8d2bbe5SBarry Smith Synopsis: 569f2ba6396SBarry Smith #include "petscsys.h" 570a8d2bbe5SBarry Smith void PetscFunctionBeginUser; 571a8d2bbe5SBarry Smith 572a8d2bbe5SBarry Smith Not Collective 573a8d2bbe5SBarry Smith 574a8d2bbe5SBarry Smith Usage: 575a8d2bbe5SBarry Smith .vb 576a8d2bbe5SBarry Smith int something; 577a8d2bbe5SBarry Smith 578a8d2bbe5SBarry Smith PetscFunctionBegin; 579a8d2bbe5SBarry Smith .ve 580a8d2bbe5SBarry Smith 581a8d2bbe5SBarry Smith Notes: 582a8d2bbe5SBarry Smith Not available in Fortran 583a8d2bbe5SBarry Smith 584a8d2bbe5SBarry Smith Level: developer 585a8d2bbe5SBarry Smith 586a8d2bbe5SBarry Smith .seealso: PetscFunctionReturn() 587a8d2bbe5SBarry Smith 588a8d2bbe5SBarry Smith .keywords: traceback, error handling 589a8d2bbe5SBarry Smith M*/ 590a8d2bbe5SBarry Smith #define PetscFunctionBeginUser \ 591a8d2bbe5SBarry Smith do { \ 592a8d2bbe5SBarry Smith PetscStack* petscstackp; \ 593*15681b3cSBarry Smith PetscStackAMSTakeAccess(); \ 594a8d2bbe5SBarry Smith petscstackp = (PetscStack*)PetscThreadLocalGetValue(petscstack); \ 595a8d2bbe5SBarry Smith if (petscstackp && (petscstackp->currentsize < PETSCSTACKSIZE)) { \ 596a8d2bbe5SBarry Smith petscstackp->function[petscstackp->currentsize] = PETSC_FUNCTION_NAME; \ 597a8d2bbe5SBarry Smith petscstackp->file[petscstackp->currentsize] = __FILE__; \ 598a8d2bbe5SBarry Smith petscstackp->directory[petscstackp->currentsize] = __SDIR__; \ 599a8d2bbe5SBarry Smith petscstackp->line[petscstackp->currentsize] = __LINE__; \ 600a8d2bbe5SBarry Smith petscstackp->petscroutine[petscstackp->currentsize] = PETSC_FALSE; \ 601a8d2bbe5SBarry Smith petscstackp->currentsize++; \ 602a8d2bbe5SBarry Smith } \ 603a8d2bbe5SBarry Smith PetscCheck__FUNCT__(); \ 604a8d2bbe5SBarry Smith PetscRegister__FUNCT__(); \ 605*15681b3cSBarry Smith PetscStackAMSGrantAccess(); \ 606a8d2bbe5SBarry Smith } while (0) 607a8d2bbe5SBarry Smith 608a8d2bbe5SBarry Smith 6092d53ad75SBarry Smith #if defined(PETSC_SERIALIZE_FUNCTIONS) 6102d53ad75SBarry Smith #include <petsc-private/petscfptimpl.h> 6112d53ad75SBarry Smith /* 6122d53ad75SBarry Smith Registers the current function into the global function pointer to function name table 6132d53ad75SBarry Smith 6142d53ad75SBarry Smith Have to fix this to handle errors but cannot return error since used in PETSC_VIEWER_DRAW_() etc 6152d53ad75SBarry Smith */ 6162d53ad75SBarry Smith #define PetscRegister__FUNCT__() do { \ 6172d53ad75SBarry Smith static PetscBool __chked = PETSC_FALSE; \ 6182d53ad75SBarry Smith if (!__chked) {\ 6190298fd71SBarry Smith void *ptr; PetscDLSym(NULL,__FUNCT__,&ptr);\ 6202d53ad75SBarry Smith __chked = PETSC_TRUE;\ 6212d53ad75SBarry Smith }} while (0) 6222d53ad75SBarry Smith #else 6232d53ad75SBarry Smith #define PetscRegister__FUNCT__() 6242d53ad75SBarry Smith #endif 6252d53ad75SBarry Smith 626573b0fb4SBarry Smith #define PetscCheck__FUNCT__() do { PetscBool _sc1,_sc2; \ 627573b0fb4SBarry Smith PetscStrcmpNoError(PETSC_FUNCTION_NAME,__FUNCT__,&_sc1);\ 628573b0fb4SBarry Smith PetscStrcmpNoError(__FUNCT__,"User provided function",&_sc2);\ 629573b0fb4SBarry Smith if (!_sc1 && !_sc2) { \ 630573b0fb4SBarry 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); \ 63153c77d0aSJed Brown } \ 63253c77d0aSJed Brown } while (0) 6333a40ed3dSBarry Smith 6345cd90555SBarry Smith #define PetscStackPush(n) \ 63561d886c9SShri Abhyankar do { \ 6361f46d60fSShri Abhyankar PetscStack * petscstackp; \ 637*15681b3cSBarry Smith PetscStackAMSTakeAccess(); \ 6381f46d60fSShri Abhyankar petscstackp = (PetscStack*)PetscThreadLocalGetValue(petscstack); \ 6391f46d60fSShri Abhyankar if (petscstackp && (petscstackp->currentsize < PETSCSTACKSIZE)) { \ 6401f46d60fSShri Abhyankar petscstackp->function[petscstackp->currentsize] = n; \ 6411f46d60fSShri Abhyankar petscstackp->file[petscstackp->currentsize] = "unknown"; \ 6421f46d60fSShri Abhyankar petscstackp->directory[petscstackp->currentsize] = "unknown"; \ 6431f46d60fSShri Abhyankar petscstackp->line[petscstackp->currentsize] = 0; \ 6441f46d60fSShri Abhyankar petscstackp->currentsize++; \ 645*15681b3cSBarry Smith } \ 646*15681b3cSBarry Smith PetscStackAMSGrantAccess(); \ 647*15681b3cSBarry Smith CHKMEMQ; \ 648*15681b3cSBarry Smith } while (0) 6493a40ed3dSBarry Smith 650d64ed03dSBarry Smith #define PetscStackPop \ 6512f0c533eSSatish Balay do {PetscStack* petscstackp;CHKMEMQ; \ 652*15681b3cSBarry Smith PetscStackAMSTakeAccess(); \ 6531f46d60fSShri Abhyankar petscstackp = (PetscStack*)PetscThreadLocalGetValue(petscstack); \ 6541f46d60fSShri Abhyankar if (petscstackp && petscstackp->currentsize > 0) { \ 6551f46d60fSShri Abhyankar petscstackp->currentsize--; \ 6561f46d60fSShri Abhyankar petscstackp->function[petscstackp->currentsize] = 0; \ 6571f46d60fSShri Abhyankar petscstackp->file[petscstackp->currentsize] = 0; \ 6581f46d60fSShri Abhyankar petscstackp->directory[petscstackp->currentsize] = 0; \ 6591f46d60fSShri Abhyankar petscstackp->line[petscstackp->currentsize] = 0; \ 660*15681b3cSBarry Smith } \ 661*15681b3cSBarry Smith PetscStackAMSGrantAccess(); \ 662*15681b3cSBarry Smith } while (0) 663d64ed03dSBarry Smith 66430de9b25SBarry Smith /*MC 66530de9b25SBarry Smith PetscFunctionReturn - Last executable line of each PETSc function 66630de9b25SBarry Smith used for error handling. Replaces return() 66730de9b25SBarry Smith 66830de9b25SBarry Smith Synopsis: 669f2ba6396SBarry Smith #include "petscsys.h" 67030de9b25SBarry Smith void PetscFunctionReturn(0); 67130de9b25SBarry Smith 672eca87e8dSBarry Smith Not Collective 673eca87e8dSBarry Smith 67430de9b25SBarry Smith Usage: 67530de9b25SBarry Smith .vb 67630de9b25SBarry Smith .... 67730de9b25SBarry Smith PetscFunctionReturn(0); 67830de9b25SBarry Smith } 67930de9b25SBarry Smith .ve 68030de9b25SBarry Smith 68130de9b25SBarry Smith Notes: 68230de9b25SBarry Smith Not available in Fortran 68330de9b25SBarry Smith 68430de9b25SBarry Smith Level: developer 68530de9b25SBarry Smith 68630de9b25SBarry Smith .seealso: PetscFunctionBegin() 68730de9b25SBarry Smith 68830de9b25SBarry Smith .keywords: traceback, error handling 68930de9b25SBarry Smith M*/ 6905cd90555SBarry Smith #define PetscFunctionReturn(a) \ 6918246ba0dSJed Brown do { \ 6921f46d60fSShri Abhyankar PetscStack* petscstackp; \ 693*15681b3cSBarry Smith PetscStackAMSTakeAccess(); \ 6941f46d60fSShri Abhyankar petscstackp = (PetscStack*)PetscThreadLocalGetValue(petscstack); \ 6951f46d60fSShri Abhyankar if (petscstackp && petscstackp->currentsize > 0) { \ 6961f46d60fSShri Abhyankar petscstackp->currentsize--; \ 6971f46d60fSShri Abhyankar petscstackp->function[petscstackp->currentsize] = 0; \ 6981f46d60fSShri Abhyankar petscstackp->file[petscstackp->currentsize] = 0; \ 6991f46d60fSShri Abhyankar petscstackp->directory[petscstackp->currentsize] = 0; \ 7001f46d60fSShri Abhyankar petscstackp->line[petscstackp->currentsize] = 0; \ 701812af9f3SBarry Smith } \ 702*15681b3cSBarry Smith PetscStackAMSGrantAccess(); \ 7038246ba0dSJed Brown return(a);} while (0) 704d64ed03dSBarry Smith 705ff94ddecSSatish Balay #define PetscFunctionReturnVoid() \ 7068246ba0dSJed Brown do { \ 7071f46d60fSShri Abhyankar PetscStack* petscstackp; \ 708*15681b3cSBarry Smith PetscStackAMSTakeAccess(); \ 7091f46d60fSShri Abhyankar petscstackp = (PetscStack*)PetscThreadLocalGetValue(petscstack); \ 7101f46d60fSShri Abhyankar if (petscstackp && petscstackp->currentsize > 0) { \ 7111f46d60fSShri Abhyankar petscstackp->currentsize--; \ 7121f46d60fSShri Abhyankar petscstackp->function[petscstackp->currentsize] = 0; \ 7131f46d60fSShri Abhyankar petscstackp->file[petscstackp->currentsize] = 0; \ 7141f46d60fSShri Abhyankar petscstackp->directory[petscstackp->currentsize] = 0; \ 7151f46d60fSShri Abhyankar petscstackp->line[petscstackp->currentsize] = 0; \ 716812af9f3SBarry Smith } \ 717*15681b3cSBarry Smith PetscStackAMSGrantAccess(); \ 7188246ba0dSJed Brown return;} while (0) 7196d385327SIbrahima Ba #else 7206d385327SIbrahima Ba 7213a40ed3dSBarry Smith #define PetscFunctionBegin 7220bdf7c52SPeter Brune #define PetscFunctionBeginUser 7233a40ed3dSBarry Smith #define PetscFunctionReturn(a) return(a) 7245665465eSBarry Smith #define PetscFunctionReturnVoid() return 725812af9f3SBarry Smith #define PetscStackPop CHKMEMQ 726812af9f3SBarry Smith #define PetscStackPush(f) CHKMEMQ 727dbf62e16SBarry Smith #define PetscStackActive PETSC_FALSE 7283a40ed3dSBarry Smith 7293a40ed3dSBarry Smith #endif 7303a40ed3dSBarry Smith 731eb6b5d47SBarry Smith /* 732eb6b5d47SBarry Smith PetscStackCall - Calls an external library routine or user function after pushing the name of the routine on the stack. 733eb6b5d47SBarry Smith 734eb6b5d47SBarry Smith Input Parameters: 735eb6b5d47SBarry Smith + name - string that gives the name of the function being called 736fd3f9acdSBarry Smith - routine - actual call to the routine, including ierr = and CHKERRQ(ierr); 737fd3f9acdSBarry Smith 738dbf62e16SBarry Smith Note: Often one should use PetscStackCallStandard() instead. This routine is intended for external library routines that DO NOT return error codes 739eb6b5d47SBarry Smith 740eb6b5d47SBarry 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. 741eb6b5d47SBarry Smith 742fd3f9acdSBarry Smith 743fd3f9acdSBarry Smith 744eb6b5d47SBarry Smith */ 74530ecc5abSKarl Rupp #define PetscStackCall(name,routine) do { PetscStackPush(name);routine;PetscStackPop; } while(0) 746eb6b5d47SBarry Smith 747fd3f9acdSBarry Smith /* 748fd3f9acdSBarry Smith PetscStackCallStandard - Calls an external library routine after pushing the name of the routine on the stack. 749fd3f9acdSBarry Smith 750fd3f9acdSBarry Smith Input Parameters: 751fd3f9acdSBarry Smith + func- name of the routine 752fd3f9acdSBarry Smith - args - arguments to the routine surrounded by () 753fd3f9acdSBarry Smith 754dbf62e16SBarry Smith Notes: This is intended for external package routines that return error codes. Use PetscStackCall() for those that do not. 755dbf62e16SBarry Smith 756dbf62e16SBarry 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. 757fd3f9acdSBarry Smith 758fd3f9acdSBarry Smith */ 759fd3f9acdSBarry Smith #define PetscStackCallStandard(func,args) do { \ 760fd3f9acdSBarry Smith PetscStackPush(#func);ierr = func args;PetscStackPop; if (ierr) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_LIB,"Error in %s()",#func); \ 761fd3f9acdSBarry Smith } while (0) 762fd3f9acdSBarry Smith 763014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscStackCreate(void); 764639ff905SBarry Smith PETSC_EXTERN PetscErrorCode PetscStackView(FILE*); 765014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscStackDestroy(void); 76606d1fe2cSBarry Smith 76706d1fe2cSBarry Smith #endif 768