xref: /petsc/src/sys/error/ftn-custom/zerrf.c (revision dfef5ea798a36ccc664ca1bbe435d183ec21e5c1)
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