xref: /petsc/src/sys/error/ftn-custom/zerrf.c (revision 3ca90d2d9fe4d5ec7086bd4aee14f89370d16392)
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
1455fcb7f5SSatish Balay #define petscrealview_             PETSCREALVIEW
1555fcb7f5SSatish Balay #define petscintview_              PETSCINTVIEW
1655fcb7f5SSatish Balay #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE)
1755fcb7f5SSatish Balay #define petscpusherrorhandler_   petscpusherrorhandler
1855fcb7f5SSatish Balay #define petsctracebackerrorhandler_   petsctracebackerrorhandler
1955fcb7f5SSatish Balay #define petscaborterrorhandler_       petscaborterrorhandler
2055fcb7f5SSatish Balay #define petscignoreerrorhandler_      petscignoreerrorhandler
2155fcb7f5SSatish Balay #define petscemacsclienterrorhandler_ petscemacsclienterrorhandler
2255fcb7f5SSatish Balay #define petscattachdebuggererrorhandler_   petscattachdebuggererrorhandler
2355fcb7f5SSatish Balay #define petscerror_                petscerror
24bfe649d8SSatish Balay #define petscerrorf_                petscerrorf
2555fcb7f5SSatish Balay #define petscrealview_             petscrealview
2655fcb7f5SSatish Balay #define petscintview_              petscintview
2755fcb7f5SSatish Balay #endif
2855fcb7f5SSatish Balay 
2919caf8f3SSatish 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);
3055fcb7f5SSatish Balay 
3155fcb7f5SSatish Balay /* These are not extern C because they are passed into non-extern C user level functions */
32efca3c55SSatish Balay static PetscErrorCode ourerrorhandler(MPI_Comm comm,int line,const char *fun,const char *file,PetscErrorCode n,PetscErrorType p,const char *mess,void *ctx)
3355fcb7f5SSatish Balay {
3455fcb7f5SSatish Balay   PetscErrorCode ierr = 0;
35efca3c55SSatish Balay   size_t         len1,len2,len3;
3655fcb7f5SSatish Balay 
377bdf51c9SJed Brown   PetscStrlen(fun,&len1);
387bdf51c9SJed Brown   PetscStrlen(file,&len2);
397bdf51c9SJed Brown   PetscStrlen(mess,&len3);
4055fcb7f5SSatish Balay 
4119caf8f3SSatish 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)));
4255fcb7f5SSatish Balay   return ierr;
4355fcb7f5SSatish Balay }
4455fcb7f5SSatish Balay 
4555fcb7f5SSatish Balay /*
4655fcb7f5SSatish Balay         These are not usually called from Fortran but allow Fortran users
4755fcb7f5SSatish Balay    to transparently set these monitors from .F code
4855fcb7f5SSatish Balay */
49efca3c55SSatish 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)
5055fcb7f5SSatish Balay {
51efca3c55SSatish Balay   *ierr = PetscTraceBackErrorHandler(*comm,*line,fun,file,*n,*p,mess,ctx);
5255fcb7f5SSatish Balay }
5355fcb7f5SSatish Balay 
54efca3c55SSatish 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)
5555fcb7f5SSatish Balay {
56efca3c55SSatish Balay   *ierr = PetscAbortErrorHandler(*comm,*line,fun,file,*n,*p,mess,ctx);
5755fcb7f5SSatish Balay }
5855fcb7f5SSatish Balay 
59efca3c55SSatish 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)
6055fcb7f5SSatish Balay {
61efca3c55SSatish Balay   *ierr = PetscAttachDebuggerErrorHandler(*comm,*line,fun,file,*n,*p,mess,ctx);
6255fcb7f5SSatish Balay }
6355fcb7f5SSatish Balay 
64efca3c55SSatish 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)
6555fcb7f5SSatish Balay {
66efca3c55SSatish Balay   *ierr = PetscEmacsClientErrorHandler(*comm,*line,fun,file,*n,*p,mess,ctx);
6755fcb7f5SSatish Balay }
6855fcb7f5SSatish Balay 
69efca3c55SSatish 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)
7055fcb7f5SSatish Balay {
71efca3c55SSatish Balay   *ierr = PetscIgnoreErrorHandler(*comm,*line,fun,file,*n,*p,mess,ctx);
7255fcb7f5SSatish Balay }
7355fcb7f5SSatish Balay 
7419caf8f3SSatish 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)
7555fcb7f5SSatish Balay {
76a297a907SKarl Rupp   if ((void(*)(void))handler == (void(*)(void))petsctracebackerrorhandler_) *ierr = PetscPushErrorHandler(PetscTraceBackErrorHandler,0);
77a297a907SKarl Rupp   else {
7855fcb7f5SSatish Balay     f2    = handler;
7955fcb7f5SSatish Balay     *ierr = PetscPushErrorHandler(ourerrorhandler,ctx);
8055fcb7f5SSatish Balay   }
8155fcb7f5SSatish Balay }
8255fcb7f5SSatish Balay 
8319caf8f3SSatish Balay PETSC_EXTERN void petscerror_(MPI_Fint *comm,PetscErrorCode *number,PetscErrorType *p,char* message,PETSC_FORTRAN_CHARLEN_T len)
8455fcb7f5SSatish Balay {
85e3081792SBarry Smith   PetscErrorCode nierr,*ierr = &nierr;
8655fcb7f5SSatish Balay   char *t1;
8755fcb7f5SSatish Balay   FIXCHAR(message,len,t1);
88*3ca90d2dSJacob Faibussowitsch   nierr = PetscError(MPI_Comm_f2c(*(comm)),0,NULL,NULL,*number,*p,"%s",t1);
8955fcb7f5SSatish Balay   FREECHAR(message,t1);
9055fcb7f5SSatish Balay }
9155fcb7f5SSatish Balay 
92bfe649d8SSatish Balay /* helper routine for CHKERRQ and CHKERRABORT macros on the fortran side */
9319caf8f3SSatish Balay PETSC_EXTERN void petscerrorf_(PetscErrorCode *number)
94bfe649d8SSatish Balay {
95bfe649d8SSatish Balay   PetscError(PETSC_COMM_SELF,0,NULL,NULL,*number,PETSC_ERROR_REPEAT,NULL);
96bfe649d8SSatish Balay }
97bfe649d8SSatish Balay 
9819caf8f3SSatish Balay PETSC_EXTERN void petscrealview_(PetscInt *n,PetscReal *d,PetscViewer *viwer,PetscErrorCode *ierr)
9955fcb7f5SSatish Balay {
10016bf3c38SBarry Smith   PetscViewer v;
10116bf3c38SBarry Smith   PetscPatchDefaultViewers_Fortran(viwer,v);
10216bf3c38SBarry Smith   *ierr = PetscRealView(*n,d,v);
10355fcb7f5SSatish Balay }
10455fcb7f5SSatish Balay 
10519caf8f3SSatish Balay PETSC_EXTERN void petscintview_(PetscInt *n,PetscInt *d,PetscViewer *viwer,PetscErrorCode *ierr)
10655fcb7f5SSatish Balay {
10716bf3c38SBarry Smith   PetscViewer v;
10816bf3c38SBarry Smith   PetscPatchDefaultViewers_Fortran(viwer,v);
10916bf3c38SBarry Smith   *ierr = PetscIntView(*n,d,v);
11016bf3c38SBarry Smith }
11116bf3c38SBarry Smith 
11216bf3c38SBarry Smith #if defined(PETSC_HAVE_FORTRAN_CAPS)
11316bf3c38SBarry Smith #define petscscalarview_             PETSCSCALARVIEW
11416bf3c38SBarry Smith #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE)
11516bf3c38SBarry Smith #define petscscalarview_             petscscalarview
11616bf3c38SBarry Smith #endif
11716bf3c38SBarry Smith 
11819caf8f3SSatish Balay PETSC_EXTERN void petscscalarview_(PetscInt *n,PetscScalar *d,PetscViewer *viwer,PetscErrorCode *ierr)
11916bf3c38SBarry Smith {
12016bf3c38SBarry Smith   PetscViewer v;
12116bf3c38SBarry Smith   PetscPatchDefaultViewers_Fortran(viwer,v);
12216bf3c38SBarry Smith   *ierr = PetscScalarView(*n,d,v);
12355fcb7f5SSatish Balay }
124