16dd63270SBarry Smith #include <petsc/private/ftnimpl.h> 2c6db04a5SJed Brown #include <petscsys.h> 3665c2dedSJed Brown #include <petscviewer.h> 455fcb7f5SSatish Balay 555fcb7f5SSatish Balay #if defined(PETSC_HAVE_FORTRAN_CAPS) 655fcb7f5SSatish Balay #define petscpusherrorhandler_ PETSCPUSHERRORHANDLER 755fcb7f5SSatish Balay #define petsctracebackerrorhandler_ PETSCTRACEBACKERRORHANDLER 855fcb7f5SSatish Balay #define petscaborterrorhandler_ PETSCABORTERRORHANDLER 955fcb7f5SSatish Balay #define petscignoreerrorhandler_ PETSCIGNOREERRORHANDLER 1055fcb7f5SSatish Balay #define petscemacsclienterrorhandler_ PETSCEMACSCLIENTERRORHANDLER 1155fcb7f5SSatish Balay #define petscattachdebuggererrorhandler_ PETSCATTACHDEBUGGERERRORHANDLER 1255fcb7f5SSatish Balay #define petscerror_ PETSCERROR 13bfe649d8SSatish Balay #define petscerrorf_ PETSCERRORF 1449c86fc7SBarry Smith #define petscerrormpi_ PETSCERRORMPI 1555fcb7f5SSatish Balay #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE) 1655fcb7f5SSatish Balay #define petscpusherrorhandler_ petscpusherrorhandler 1755fcb7f5SSatish Balay #define petsctracebackerrorhandler_ petsctracebackerrorhandler 1855fcb7f5SSatish Balay #define petscaborterrorhandler_ petscaborterrorhandler 1955fcb7f5SSatish Balay #define petscignoreerrorhandler_ petscignoreerrorhandler 2055fcb7f5SSatish Balay #define petscemacsclienterrorhandler_ petscemacsclienterrorhandler 2155fcb7f5SSatish Balay #define petscattachdebuggererrorhandler_ petscattachdebuggererrorhandler 2255fcb7f5SSatish Balay #define petscerror_ petscerror 23bfe649d8SSatish Balay #define petscerrorf_ petscerrorf 2449c86fc7SBarry Smith #define petscerrormpi_ petscerrormpi 2555fcb7f5SSatish Balay #endif 2655fcb7f5SSatish Balay 2719caf8f3SSatish Balay static void (*f2)(MPI_Comm *comm, int *, const char *, const char *, PetscErrorCode *, PetscErrorType *, const char *, void *, PetscErrorCode *, PETSC_FORTRAN_CHARLEN_T len1, PETSC_FORTRAN_CHARLEN_T len2, PETSC_FORTRAN_CHARLEN_T len3); 2855fcb7f5SSatish Balay 2955fcb7f5SSatish Balay /* These are not extern C because they are passed into non-extern C user level functions */ 30efca3c55SSatish Balay static PetscErrorCode ourerrorhandler(MPI_Comm comm, int line, const char *fun, const char *file, PetscErrorCode n, PetscErrorType p, const char *mess, void *ctx) 3155fcb7f5SSatish Balay { 323ba16761SJacob Faibussowitsch PetscErrorCode ierr = PETSC_SUCCESS; 33efca3c55SSatish Balay size_t len1, len2, len3; 3455fcb7f5SSatish Balay 353ba16761SJacob Faibussowitsch ierr = PetscStrlen(fun, &len1); 363ba16761SJacob Faibussowitsch ierr = PetscStrlen(file, &len2); 373ba16761SJacob Faibussowitsch ierr = PetscStrlen(mess, &len3); 3855fcb7f5SSatish Balay 393ba16761SJacob Faibussowitsch ierr = PETSC_SUCCESS; 4057508eceSPierre Jolivet (*f2)(&comm, &line, fun, file, &n, &p, mess, ctx, &ierr, (PETSC_FORTRAN_CHARLEN_T)len1, (PETSC_FORTRAN_CHARLEN_T)len2, (PETSC_FORTRAN_CHARLEN_T)len3); 4155fcb7f5SSatish Balay return ierr; 4255fcb7f5SSatish Balay } 4355fcb7f5SSatish Balay 4455fcb7f5SSatish Balay /* 4555fcb7f5SSatish Balay These are not usually called from Fortran but allow Fortran users 4655fcb7f5SSatish Balay to transparently set these monitors from .F code 4755fcb7f5SSatish Balay */ 48efca3c55SSatish Balay PETSC_EXTERN void petsctracebackerrorhandler_(MPI_Comm *comm, int *line, const char *fun, const char *file, PetscErrorCode *n, PetscErrorType *p, const char *mess, void *ctx, PetscErrorCode *ierr) 4955fcb7f5SSatish Balay { 50efca3c55SSatish Balay *ierr = PetscTraceBackErrorHandler(*comm, *line, fun, file, *n, *p, mess, ctx); 5155fcb7f5SSatish Balay } 5255fcb7f5SSatish Balay 53efca3c55SSatish Balay PETSC_EXTERN void petscaborterrorhandler_(MPI_Comm *comm, int *line, const char *fun, const char *file, PetscErrorCode *n, PetscErrorType *p, const char *mess, void *ctx, PetscErrorCode *ierr) 5455fcb7f5SSatish Balay { 55efca3c55SSatish Balay *ierr = PetscAbortErrorHandler(*comm, *line, fun, file, *n, *p, mess, ctx); 5655fcb7f5SSatish Balay } 5755fcb7f5SSatish Balay 58efca3c55SSatish Balay PETSC_EXTERN void petscattachdebuggererrorhandler_(MPI_Comm *comm, int *line, const char *fun, const char *file, PetscErrorCode *n, PetscErrorType *p, const char *mess, void *ctx, PetscErrorCode *ierr) 5955fcb7f5SSatish Balay { 60efca3c55SSatish Balay *ierr = PetscAttachDebuggerErrorHandler(*comm, *line, fun, file, *n, *p, mess, ctx); 6155fcb7f5SSatish Balay } 6255fcb7f5SSatish Balay 63efca3c55SSatish Balay PETSC_EXTERN void petscemacsclienterrorhandler_(MPI_Comm *comm, int *line, const char *fun, const char *file, PetscErrorCode *n, PetscErrorType *p, const char *mess, void *ctx, PetscErrorCode *ierr) 6455fcb7f5SSatish Balay { 65efca3c55SSatish Balay *ierr = PetscEmacsClientErrorHandler(*comm, *line, fun, file, *n, *p, mess, ctx); 6655fcb7f5SSatish Balay } 6755fcb7f5SSatish Balay 68efca3c55SSatish Balay PETSC_EXTERN void petscignoreerrorhandler_(MPI_Comm *comm, int *line, const char *fun, const char *file, PetscErrorCode *n, PetscErrorType *p, const char *mess, void *ctx, PetscErrorCode *ierr) 6955fcb7f5SSatish Balay { 70efca3c55SSatish Balay *ierr = PetscIgnoreErrorHandler(*comm, *line, fun, file, *n, *p, mess, ctx); 7155fcb7f5SSatish Balay } 7255fcb7f5SSatish Balay 73*5ebfa9e9SBarry Smith PETSC_EXTERN void petscpusherrorhandler_(void (*handler)(MPI_Comm *, int *, const char *, const char *, PetscErrorCode *, PetscErrorType *, const char *, void *, PetscErrorCode *, PETSC_FORTRAN_CHARLEN_T len1, PETSC_FORTRAN_CHARLEN_T len2, PETSC_FORTRAN_CHARLEN_T len3), void *ctx, PetscErrorCode *ierr) 7455fcb7f5SSatish Balay { 75*5ebfa9e9SBarry Smith if ((PetscFortranCallbackFn *)handler == (PetscFortranCallbackFn *)petsctracebackerrorhandler_) *ierr = PetscPushErrorHandler(PetscTraceBackErrorHandler, NULL); 76a297a907SKarl Rupp else { 7755fcb7f5SSatish Balay f2 = handler; 7855fcb7f5SSatish Balay *ierr = PetscPushErrorHandler(ourerrorhandler, ctx); 7955fcb7f5SSatish Balay } 8055fcb7f5SSatish Balay } 8155fcb7f5SSatish Balay 8219caf8f3SSatish Balay PETSC_EXTERN void petscerror_(MPI_Fint *comm, PetscErrorCode *number, PetscErrorType *p, char *message, PETSC_FORTRAN_CHARLEN_T len) 8355fcb7f5SSatish Balay { 84e3081792SBarry Smith PetscErrorCode nierr, *ierr = &nierr; 8555fcb7f5SSatish Balay char *t1; 8655fcb7f5SSatish Balay FIXCHAR(message, len, t1); 873ca90d2dSJacob Faibussowitsch nierr = PetscError(MPI_Comm_f2c(*(comm)), 0, NULL, NULL, *number, *p, "%s", t1); 8855fcb7f5SSatish Balay FREECHAR(message, t1); 8955fcb7f5SSatish Balay } 9055fcb7f5SSatish Balay 9149c86fc7SBarry Smith #if defined(PETSC_HAVE_FORTRAN_FREE_LINE_LENGTH_NONE) 9249c86fc7SBarry Smith PETSC_EXTERN void petscerrorf_(PetscErrorCode *err, int *line, char *file, PETSC_FORTRAN_CHARLEN_T len) 93bfe649d8SSatish Balay { 9449c86fc7SBarry Smith char *tfile; 953ba16761SJacob Faibussowitsch PetscErrorCode ierr[] = {PETSC_SUCCESS}; /* needed by FIXCHAR */ 9649c86fc7SBarry Smith 9749c86fc7SBarry Smith FIXCHAR(file, len, tfile); 983ba16761SJacob Faibussowitsch *err = PetscError(PETSC_COMM_SELF, *line, NULL, tfile, *err, PETSC_ERROR_REPEAT, NULL); 9949c86fc7SBarry Smith FREECHAR(file, tfile); 100bfe649d8SSatish Balay } 101bfe649d8SSatish Balay 10249c86fc7SBarry Smith PETSC_EXTERN void petscerrormpi_(PetscErrorCode *err, int *line, char *file, PETSC_FORTRAN_CHARLEN_T len) 10349c86fc7SBarry Smith { 10449c86fc7SBarry Smith char errorstring[2 * MPI_MAX_ERROR_STRING]; 10549c86fc7SBarry Smith char *tfile; 1063ba16761SJacob Faibussowitsch PetscErrorCode ierr[] = {PETSC_SUCCESS}; /* needed by FIXCHAR */ 10749c86fc7SBarry Smith 10849c86fc7SBarry Smith FIXCHAR(file, len, tfile); 109a1fd7ae3SBarry Smith PetscMPIErrorString(*err, 2 * MPI_MAX_ERROR_STRING, errorstring); 1103ba16761SJacob Faibussowitsch *err = PetscError(PETSC_COMM_SELF, *line, NULL, file, PETSC_ERR_MPI, PETSC_ERROR_INITIAL, "MPI error %d %s", *err, errorstring); 11149c86fc7SBarry Smith FREECHAR(file, tfile); 11249c86fc7SBarry Smith *err = PETSC_ERR_MPI; 11349c86fc7SBarry Smith } 11449c86fc7SBarry Smith #else 11549c86fc7SBarry Smith PETSC_EXTERN void petscerrorf_(PetscErrorCode *err) 11649c86fc7SBarry Smith { 1173ba16761SJacob Faibussowitsch *err = PetscError(PETSC_COMM_SELF, 0, NULL, NULL, *err, PETSC_ERROR_REPEAT, NULL); 11849c86fc7SBarry Smith } 11949c86fc7SBarry Smith 12049c86fc7SBarry Smith PETSC_EXTERN void petscerrormpi_(PetscErrorCode *err) 12149c86fc7SBarry Smith { 12249c86fc7SBarry Smith char errorstring[2 * MPI_MAX_ERROR_STRING]; 12349c86fc7SBarry Smith 124a1fd7ae3SBarry Smith PetscMPIErrorString(*err, 2 * MPI_MAX_ERROR_STRING, errorstring); 1253ba16761SJacob Faibussowitsch *err = PetscError(PETSC_COMM_SELF, 0, NULL, NULL, PETSC_ERR_MPI, PETSC_ERROR_INITIAL, "MPI error %d %s", *err, errorstring); 12649c86fc7SBarry Smith *err = PETSC_ERR_MPI; 12749c86fc7SBarry Smith } 12849c86fc7SBarry Smith #endif 129