xref: /petsc/src/sys/error/ftn-custom/zerrf.c (revision 4e8208cbcbc709572b8abe32f33c78b69c819375)
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 */
ourerrorhandler(MPI_Comm comm,int line,const char * fun,const char * file,PetscErrorCode n,PetscErrorType p,const char * mess,PetscCtx ctx)30*2a8381b2SBarry Smith static PetscErrorCode ourerrorhandler(MPI_Comm comm, int line, const char *fun, const char *file, PetscErrorCode n, PetscErrorType p, const char *mess, PetscCtx 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 */
petsctracebackerrorhandler_(MPI_Comm * comm,int * line,const char * fun,const char * file,PetscErrorCode * n,PetscErrorType * p,const char * mess,PetscCtx ctx,PetscErrorCode * ierr)48*2a8381b2SBarry Smith PETSC_EXTERN void petsctracebackerrorhandler_(MPI_Comm *comm, int *line, const char *fun, const char *file, PetscErrorCode *n, PetscErrorType *p, const char *mess, PetscCtx ctx, PetscErrorCode *ierr)
4955fcb7f5SSatish Balay {
50efca3c55SSatish Balay   *ierr = PetscTraceBackErrorHandler(*comm, *line, fun, file, *n, *p, mess, ctx);
5155fcb7f5SSatish Balay }
5255fcb7f5SSatish Balay 
petscaborterrorhandler_(MPI_Comm * comm,int * line,const char * fun,const char * file,PetscErrorCode * n,PetscErrorType * p,const char * mess,PetscCtx ctx,PetscErrorCode * ierr)53*2a8381b2SBarry Smith PETSC_EXTERN void petscaborterrorhandler_(MPI_Comm *comm, int *line, const char *fun, const char *file, PetscErrorCode *n, PetscErrorType *p, const char *mess, PetscCtx ctx, PetscErrorCode *ierr)
5455fcb7f5SSatish Balay {
55efca3c55SSatish Balay   *ierr = PetscAbortErrorHandler(*comm, *line, fun, file, *n, *p, mess, ctx);
5655fcb7f5SSatish Balay }
5755fcb7f5SSatish Balay 
petscattachdebuggererrorhandler_(MPI_Comm * comm,int * line,const char * fun,const char * file,PetscErrorCode * n,PetscErrorType * p,const char * mess,PetscCtx ctx,PetscErrorCode * ierr)58*2a8381b2SBarry Smith PETSC_EXTERN void petscattachdebuggererrorhandler_(MPI_Comm *comm, int *line, const char *fun, const char *file, PetscErrorCode *n, PetscErrorType *p, const char *mess, PetscCtx ctx, PetscErrorCode *ierr)
5955fcb7f5SSatish Balay {
60efca3c55SSatish Balay   *ierr = PetscAttachDebuggerErrorHandler(*comm, *line, fun, file, *n, *p, mess, ctx);
6155fcb7f5SSatish Balay }
6255fcb7f5SSatish Balay 
petscemacsclienterrorhandler_(MPI_Comm * comm,int * line,const char * fun,const char * file,PetscErrorCode * n,PetscErrorType * p,const char * mess,PetscCtx ctx,PetscErrorCode * ierr)63*2a8381b2SBarry Smith PETSC_EXTERN void petscemacsclienterrorhandler_(MPI_Comm *comm, int *line, const char *fun, const char *file, PetscErrorCode *n, PetscErrorType *p, const char *mess, PetscCtx ctx, PetscErrorCode *ierr)
6455fcb7f5SSatish Balay {
65efca3c55SSatish Balay   *ierr = PetscEmacsClientErrorHandler(*comm, *line, fun, file, *n, *p, mess, ctx);
6655fcb7f5SSatish Balay }
6755fcb7f5SSatish Balay 
petscignoreerrorhandler_(MPI_Comm * comm,int * line,const char * fun,const char * file,PetscErrorCode * n,PetscErrorType * p,const char * mess,PetscCtx ctx,PetscErrorCode * ierr)68*2a8381b2SBarry Smith PETSC_EXTERN void petscignoreerrorhandler_(MPI_Comm *comm, int *line, const char *fun, const char *file, PetscErrorCode *n, PetscErrorType *p, const char *mess, PetscCtx ctx, PetscErrorCode *ierr)
6955fcb7f5SSatish Balay {
70efca3c55SSatish Balay   *ierr = PetscIgnoreErrorHandler(*comm, *line, fun, file, *n, *p, mess, ctx);
7155fcb7f5SSatish Balay }
7255fcb7f5SSatish Balay 
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),PetscCtx ctx,PetscErrorCode * ierr)73*2a8381b2SBarry 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), PetscCtx ctx, PetscErrorCode *ierr)
7455fcb7f5SSatish Balay {
755ebfa9e9SBarry 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 
petscerror_(MPI_Fint * comm,PetscErrorCode * number,PetscErrorType * p,char * message,PETSC_FORTRAN_CHARLEN_T len)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)
petscerrorf_(PetscErrorCode * err,int * line,char * file,PETSC_FORTRAN_CHARLEN_T len)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 
petscerrormpi_(PetscErrorCode * err,int * line,char * file,PETSC_FORTRAN_CHARLEN_T len)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
petscerrorf_(PetscErrorCode * err)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 
petscerrormpi_(PetscErrorCode * err)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