1af0996ceSBarry Smith #include <petsc/private/fortranimpl.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 #define petscrealview_ PETSCREALVIEW 1655fcb7f5SSatish Balay #define petscintview_ PETSCINTVIEW 1755fcb7f5SSatish Balay #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE) 1855fcb7f5SSatish Balay #define petscpusherrorhandler_ petscpusherrorhandler 1955fcb7f5SSatish Balay #define petsctracebackerrorhandler_ petsctracebackerrorhandler 2055fcb7f5SSatish Balay #define petscaborterrorhandler_ petscaborterrorhandler 2155fcb7f5SSatish Balay #define petscignoreerrorhandler_ petscignoreerrorhandler 2255fcb7f5SSatish Balay #define petscemacsclienterrorhandler_ petscemacsclienterrorhandler 2355fcb7f5SSatish Balay #define petscattachdebuggererrorhandler_ petscattachdebuggererrorhandler 2455fcb7f5SSatish Balay #define petscerror_ petscerror 25bfe649d8SSatish Balay #define petscerrorf_ petscerrorf 2649c86fc7SBarry Smith #define petscerrormpi_ petscerrormpi 2755fcb7f5SSatish Balay #define petscrealview_ petscrealview 2855fcb7f5SSatish Balay #define petscintview_ petscintview 2955fcb7f5SSatish Balay #endif 3055fcb7f5SSatish Balay 3119caf8f3SSatish 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); 3255fcb7f5SSatish Balay 3355fcb7f5SSatish Balay /* These are not extern C because they are passed into non-extern C user level functions */ 34efca3c55SSatish Balay static PetscErrorCode ourerrorhandler(MPI_Comm comm, int line, const char *fun, const char *file, PetscErrorCode n, PetscErrorType p, const char *mess, void *ctx) 3555fcb7f5SSatish Balay { 363ba16761SJacob Faibussowitsch PetscErrorCode ierr = PETSC_SUCCESS; 37efca3c55SSatish Balay size_t len1, len2, len3; 3855fcb7f5SSatish Balay 393ba16761SJacob Faibussowitsch ierr = PetscStrlen(fun, &len1); 403ba16761SJacob Faibussowitsch ierr = PetscStrlen(file, &len2); 413ba16761SJacob Faibussowitsch ierr = PetscStrlen(mess, &len3); 4255fcb7f5SSatish Balay 433ba16761SJacob Faibussowitsch ierr = PETSC_SUCCESS; 4419caf8f3SSatish Balay (*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))); 4555fcb7f5SSatish Balay return ierr; 4655fcb7f5SSatish Balay } 4755fcb7f5SSatish Balay 4855fcb7f5SSatish Balay /* 4955fcb7f5SSatish Balay These are not usually called from Fortran but allow Fortran users 5055fcb7f5SSatish Balay to transparently set these monitors from .F code 5155fcb7f5SSatish Balay */ 52efca3c55SSatish 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) 5355fcb7f5SSatish Balay { 54efca3c55SSatish Balay *ierr = PetscTraceBackErrorHandler(*comm, *line, fun, file, *n, *p, mess, ctx); 5555fcb7f5SSatish Balay } 5655fcb7f5SSatish Balay 57efca3c55SSatish 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) 5855fcb7f5SSatish Balay { 59efca3c55SSatish Balay *ierr = PetscAbortErrorHandler(*comm, *line, fun, file, *n, *p, mess, ctx); 6055fcb7f5SSatish Balay } 6155fcb7f5SSatish Balay 62efca3c55SSatish 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) 6355fcb7f5SSatish Balay { 64efca3c55SSatish Balay *ierr = PetscAttachDebuggerErrorHandler(*comm, *line, fun, file, *n, *p, mess, ctx); 6555fcb7f5SSatish Balay } 6655fcb7f5SSatish Balay 67efca3c55SSatish 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) 6855fcb7f5SSatish Balay { 69efca3c55SSatish Balay *ierr = PetscEmacsClientErrorHandler(*comm, *line, fun, file, *n, *p, mess, ctx); 7055fcb7f5SSatish Balay } 7155fcb7f5SSatish Balay 72efca3c55SSatish 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) 7355fcb7f5SSatish Balay { 74efca3c55SSatish Balay *ierr = PetscIgnoreErrorHandler(*comm, *line, fun, file, *n, *p, mess, ctx); 7555fcb7f5SSatish Balay } 7655fcb7f5SSatish Balay 7719caf8f3SSatish Balay PETSC_EXTERN void petscpusherrorhandler_(void (*handler)(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), void *ctx, PetscErrorCode *ierr) 7855fcb7f5SSatish Balay { 79*dfef5ea7SSatish Balay if ((void (*)(void))handler == (void (*)(void))petsctracebackerrorhandler_) *ierr = PetscPushErrorHandler(PetscTraceBackErrorHandler, NULL); 80a297a907SKarl Rupp else { 8155fcb7f5SSatish Balay f2 = handler; 8255fcb7f5SSatish Balay *ierr = PetscPushErrorHandler(ourerrorhandler, ctx); 8355fcb7f5SSatish Balay } 8455fcb7f5SSatish Balay } 8555fcb7f5SSatish Balay 8619caf8f3SSatish Balay PETSC_EXTERN void petscerror_(MPI_Fint *comm, PetscErrorCode *number, PetscErrorType *p, char *message, PETSC_FORTRAN_CHARLEN_T len) 8755fcb7f5SSatish Balay { 88e3081792SBarry Smith PetscErrorCode nierr, *ierr = &nierr; 8955fcb7f5SSatish Balay char *t1; 9055fcb7f5SSatish Balay FIXCHAR(message, len, t1); 913ca90d2dSJacob Faibussowitsch nierr = PetscError(MPI_Comm_f2c(*(comm)), 0, NULL, NULL, *number, *p, "%s", t1); 9255fcb7f5SSatish Balay FREECHAR(message, t1); 9355fcb7f5SSatish Balay } 9455fcb7f5SSatish Balay 9549c86fc7SBarry Smith #if defined(PETSC_HAVE_FORTRAN_FREE_LINE_LENGTH_NONE) 9649c86fc7SBarry Smith PETSC_EXTERN void petscerrorf_(PetscErrorCode *err, int *line, char *file, PETSC_FORTRAN_CHARLEN_T len) 97bfe649d8SSatish Balay { 9849c86fc7SBarry Smith char *tfile; 993ba16761SJacob Faibussowitsch PetscErrorCode ierr[] = {PETSC_SUCCESS}; /* needed by FIXCHAR */ 10049c86fc7SBarry Smith 10149c86fc7SBarry Smith FIXCHAR(file, len, tfile); 1023ba16761SJacob Faibussowitsch *err = PetscError(PETSC_COMM_SELF, *line, NULL, tfile, *err, PETSC_ERROR_REPEAT, NULL); 10349c86fc7SBarry Smith FREECHAR(file, tfile); 104bfe649d8SSatish Balay } 105bfe649d8SSatish Balay 10649c86fc7SBarry Smith PETSC_EXTERN void petscerrormpi_(PetscErrorCode *err, int *line, char *file, PETSC_FORTRAN_CHARLEN_T len) 10749c86fc7SBarry Smith { 10849c86fc7SBarry Smith char errorstring[2 * MPI_MAX_ERROR_STRING]; 10949c86fc7SBarry Smith char *tfile; 1103ba16761SJacob Faibussowitsch PetscErrorCode ierr[] = {PETSC_SUCCESS}; /* needed by FIXCHAR */ 11149c86fc7SBarry Smith 11249c86fc7SBarry Smith FIXCHAR(file, len, tfile); 11349c86fc7SBarry Smith PetscMPIErrorString(*err, errorstring); 1143ba16761SJacob Faibussowitsch *err = PetscError(PETSC_COMM_SELF, *line, NULL, file, PETSC_ERR_MPI, PETSC_ERROR_INITIAL, "MPI error %d %s", *err, errorstring); 11549c86fc7SBarry Smith FREECHAR(file, tfile); 11649c86fc7SBarry Smith *err = PETSC_ERR_MPI; 11749c86fc7SBarry Smith } 11849c86fc7SBarry Smith #else 11949c86fc7SBarry Smith PETSC_EXTERN void petscerrorf_(PetscErrorCode *err) 12049c86fc7SBarry Smith { 1213ba16761SJacob Faibussowitsch *err = PetscError(PETSC_COMM_SELF, 0, NULL, NULL, *err, PETSC_ERROR_REPEAT, NULL); 12249c86fc7SBarry Smith } 12349c86fc7SBarry Smith 12449c86fc7SBarry Smith PETSC_EXTERN void petscerrormpi_(PetscErrorCode *err) 12549c86fc7SBarry Smith { 12649c86fc7SBarry Smith char errorstring[2 * MPI_MAX_ERROR_STRING]; 12749c86fc7SBarry Smith 12849c86fc7SBarry Smith PetscMPIErrorString(*err, errorstring); 1293ba16761SJacob Faibussowitsch *err = PetscError(PETSC_COMM_SELF, 0, NULL, NULL, PETSC_ERR_MPI, PETSC_ERROR_INITIAL, "MPI error %d %s", *err, errorstring); 13049c86fc7SBarry Smith *err = PETSC_ERR_MPI; 13149c86fc7SBarry Smith } 13249c86fc7SBarry Smith #endif 13349c86fc7SBarry Smith 134be87f6c0SPierre Jolivet PETSC_EXTERN void petscrealview_(PetscInt *n, PetscReal *d, PetscViewer *viewer, PetscErrorCode *ierr) 13555fcb7f5SSatish Balay { 13616bf3c38SBarry Smith PetscViewer v; 137be87f6c0SPierre Jolivet PetscPatchDefaultViewers_Fortran(viewer, v); 13816bf3c38SBarry Smith *ierr = PetscRealView(*n, d, v); 13955fcb7f5SSatish Balay } 14055fcb7f5SSatish Balay 141be87f6c0SPierre Jolivet PETSC_EXTERN void petscintview_(PetscInt *n, PetscInt *d, PetscViewer *viewer, PetscErrorCode *ierr) 14255fcb7f5SSatish Balay { 14316bf3c38SBarry Smith PetscViewer v; 144be87f6c0SPierre Jolivet PetscPatchDefaultViewers_Fortran(viewer, v); 14516bf3c38SBarry Smith *ierr = PetscIntView(*n, d, v); 14616bf3c38SBarry Smith } 14716bf3c38SBarry Smith 14816bf3c38SBarry Smith #if defined(PETSC_HAVE_FORTRAN_CAPS) 14916bf3c38SBarry Smith #define petscscalarview_ PETSCSCALARVIEW 15016bf3c38SBarry Smith #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE) 15116bf3c38SBarry Smith #define petscscalarview_ petscscalarview 15216bf3c38SBarry Smith #endif 15316bf3c38SBarry Smith 154be87f6c0SPierre Jolivet PETSC_EXTERN void petscscalarview_(PetscInt *n, PetscScalar *d, PetscViewer *viewer, PetscErrorCode *ierr) 15516bf3c38SBarry Smith { 15616bf3c38SBarry Smith PetscViewer v; 157be87f6c0SPierre Jolivet PetscPatchDefaultViewers_Fortran(viewer, v); 15816bf3c38SBarry Smith *ierr = PetscScalarView(*n, d, v); 15955fcb7f5SSatish Balay } 160