xref: /petsc/src/sys/error/ftn-custom/zerrf.c (revision bfe649d8702e26634220fc443dbf436954309c70)
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
13*bfe649d8SSatish 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
24*bfe649d8SSatish Balay #define petscerrorf_                petscerrorf
2555fcb7f5SSatish Balay #define petscrealview_             petscrealview
2655fcb7f5SSatish Balay #define petscintview_              petscintview
2755fcb7f5SSatish Balay #endif
2855fcb7f5SSatish Balay 
29390e1bf2SBarry Smith static void (PETSC_STDCALL *f2)(MPI_Comm *comm,int*,const char* PETSC_MIXED_LEN(len1),const char* PETSC_MIXED_LEN(len2),PetscErrorCode*,PetscErrorType*,const char* PETSC_MIXED_LEN(len3),void*,PetscErrorCode* PETSC_END_LEN(len1) PETSC_END_LEN(len2) PETSC_END_LEN(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;
36efca3c55SSatish Balay   int            l1,l2,l3;
3755fcb7f5SSatish Balay 
3855fcb7f5SSatish Balay   PetscStrlen(fun,&len1); l1 = (int)len1;
3955fcb7f5SSatish Balay   PetscStrlen(file,&len2);l2 = (int)len2;
40efca3c55SSatish Balay   PetscStrlen(mess,&len3);l3 = (int)len3;
4155fcb7f5SSatish Balay 
42a9943481SBarry Smith #if defined(PETSC_HAVE_FORTRAN_MIXED_STR_ARG)
43efca3c55SSatish Balay   (*f2)(&comm,&line,fun,l1,file,l2,&n,&p,mess,l3,ctx,&ierr);
4455fcb7f5SSatish Balay #else
45efca3c55SSatish Balay   (*f2)(&comm,&line,fun,file,&n,&p,mess,ctx,&ierr,l1,l2,l3);
4655fcb7f5SSatish Balay #endif
4755fcb7f5SSatish Balay   return ierr;
4855fcb7f5SSatish Balay }
4955fcb7f5SSatish Balay 
5055fcb7f5SSatish Balay /*
5155fcb7f5SSatish Balay         These are not usually called from Fortran but allow Fortran users
5255fcb7f5SSatish Balay    to transparently set these monitors from .F code
5355fcb7f5SSatish Balay 
5455fcb7f5SSatish Balay    functions, hence no STDCALL
5555fcb7f5SSatish Balay */
56efca3c55SSatish 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)
5755fcb7f5SSatish Balay {
58efca3c55SSatish Balay   *ierr = PetscTraceBackErrorHandler(*comm,*line,fun,file,*n,*p,mess,ctx);
5955fcb7f5SSatish Balay }
6055fcb7f5SSatish Balay 
61efca3c55SSatish 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)
6255fcb7f5SSatish Balay {
63efca3c55SSatish Balay   *ierr = PetscAbortErrorHandler(*comm,*line,fun,file,*n,*p,mess,ctx);
6455fcb7f5SSatish Balay }
6555fcb7f5SSatish Balay 
66efca3c55SSatish 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)
6755fcb7f5SSatish Balay {
68efca3c55SSatish Balay   *ierr = PetscAttachDebuggerErrorHandler(*comm,*line,fun,file,*n,*p,mess,ctx);
6955fcb7f5SSatish Balay }
7055fcb7f5SSatish Balay 
71efca3c55SSatish 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)
7255fcb7f5SSatish Balay {
73efca3c55SSatish Balay   *ierr = PetscEmacsClientErrorHandler(*comm,*line,fun,file,*n,*p,mess,ctx);
7455fcb7f5SSatish Balay }
7555fcb7f5SSatish Balay 
76efca3c55SSatish 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)
7755fcb7f5SSatish Balay {
78efca3c55SSatish Balay   *ierr = PetscIgnoreErrorHandler(*comm,*line,fun,file,*n,*p,mess,ctx);
7955fcb7f5SSatish Balay }
8055fcb7f5SSatish Balay 
81390e1bf2SBarry Smith PETSC_EXTERN void PETSC_STDCALL petscpusherrorhandler_(void (PETSC_STDCALL *handler)(MPI_Comm *comm,int*,const char* PETSC_MIXED_LEN(len1),const char* PETSC_MIXED_LEN(len2),PetscErrorCode*,PetscErrorType*,const char* PETSC_MIXED_LEN(len3),void*,PetscErrorCode* PETSC_END_LEN(len1) PETSC_END_LEN(len2) PETSC_END_LEN(len3)),void *ctx,PetscErrorCode *ierr)
8255fcb7f5SSatish Balay {
83a297a907SKarl Rupp   if ((void(*)(void))handler == (void(*)(void))petsctracebackerrorhandler_) *ierr = PetscPushErrorHandler(PetscTraceBackErrorHandler,0);
84a297a907SKarl Rupp   else {
8555fcb7f5SSatish Balay     f2    = handler;
8655fcb7f5SSatish Balay     *ierr = PetscPushErrorHandler(ourerrorhandler,ctx);
8755fcb7f5SSatish Balay   }
8855fcb7f5SSatish Balay }
8955fcb7f5SSatish Balay 
90e3081792SBarry Smith PETSC_EXTERN void PETSC_STDCALL petscerror_(MPI_Fint *comm,PetscErrorCode *number,PetscErrorType *p,char* message PETSC_MIXED_LEN(len) PETSC_END_LEN(len))
9155fcb7f5SSatish Balay {
92e3081792SBarry Smith   PetscErrorCode nierr,*ierr = &nierr;
9355fcb7f5SSatish Balay   char *t1;
9455fcb7f5SSatish Balay   FIXCHAR(message,len,t1);
95e3081792SBarry Smith   nierr = PetscError(MPI_Comm_f2c(*(comm)),0,NULL,NULL,*number,*p,t1);
9655fcb7f5SSatish Balay   FREECHAR(message,t1);
9755fcb7f5SSatish Balay }
9855fcb7f5SSatish Balay 
99*bfe649d8SSatish Balay /* helper routine for CHKERRQ and CHKERRABORT macros on the fortran side */
100*bfe649d8SSatish Balay PETSC_EXTERN void PETSC_STDCALL petscerrorf_(PetscErrorCode *number)
101*bfe649d8SSatish Balay {
102*bfe649d8SSatish Balay   PetscError(PETSC_COMM_SELF,0,NULL,NULL,*number,PETSC_ERROR_REPEAT,NULL);
103*bfe649d8SSatish Balay }
104*bfe649d8SSatish Balay 
1058cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL petscrealview_(PetscInt *n,PetscReal *d,PetscViewer *viwer,PetscErrorCode *ierr)
10655fcb7f5SSatish Balay {
10716bf3c38SBarry Smith   PetscViewer v;
10816bf3c38SBarry Smith   PetscPatchDefaultViewers_Fortran(viwer,v);
10916bf3c38SBarry Smith   *ierr = PetscRealView(*n,d,v);
11055fcb7f5SSatish Balay }
11155fcb7f5SSatish Balay 
1128cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL petscintview_(PetscInt *n,PetscInt *d,PetscViewer *viwer,PetscErrorCode *ierr)
11355fcb7f5SSatish Balay {
11416bf3c38SBarry Smith   PetscViewer v;
11516bf3c38SBarry Smith   PetscPatchDefaultViewers_Fortran(viwer,v);
11616bf3c38SBarry Smith   *ierr = PetscIntView(*n,d,v);
11716bf3c38SBarry Smith }
11816bf3c38SBarry Smith 
11916bf3c38SBarry Smith #if defined(PETSC_HAVE_FORTRAN_CAPS)
12016bf3c38SBarry Smith #define petscscalarview_             PETSCSCALARVIEW
12116bf3c38SBarry Smith #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE)
12216bf3c38SBarry Smith #define petscscalarview_             petscscalarview
12316bf3c38SBarry Smith #endif
12416bf3c38SBarry Smith 
1258cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL petscscalarview_(PetscInt *n,PetscScalar *d,PetscViewer *viwer,PetscErrorCode *ierr)
12616bf3c38SBarry Smith {
12716bf3c38SBarry Smith   PetscViewer v;
12816bf3c38SBarry Smith   PetscPatchDefaultViewers_Fortran(viwer,v);
12916bf3c38SBarry Smith   *ierr = PetscScalarView(*n,d,v);
13055fcb7f5SSatish Balay }
131