xref: /petsc/src/sys/error/ftn-custom/zerrf.c (revision 49c86fc7db8873518b7539cf8a78d57cfd90852a)
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
14*49c86fc7SBarry 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
26*49c86fc7SBarry 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 {
3655fcb7f5SSatish Balay   PetscErrorCode ierr = 0;
37efca3c55SSatish Balay   size_t         len1,len2,len3;
3855fcb7f5SSatish Balay 
397bdf51c9SJed Brown   PetscStrlen(fun,&len1);
407bdf51c9SJed Brown   PetscStrlen(file,&len2);
417bdf51c9SJed Brown   PetscStrlen(mess,&len3);
4255fcb7f5SSatish Balay 
4319caf8f3SSatish 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)));
4455fcb7f5SSatish Balay   return ierr;
4555fcb7f5SSatish Balay }
4655fcb7f5SSatish Balay 
4755fcb7f5SSatish Balay /*
4855fcb7f5SSatish Balay         These are not usually called from Fortran but allow Fortran users
4955fcb7f5SSatish Balay    to transparently set these monitors from .F code
5055fcb7f5SSatish Balay */
51efca3c55SSatish 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)
5255fcb7f5SSatish Balay {
53efca3c55SSatish Balay   *ierr = PetscTraceBackErrorHandler(*comm,*line,fun,file,*n,*p,mess,ctx);
5455fcb7f5SSatish Balay }
5555fcb7f5SSatish Balay 
56efca3c55SSatish 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)
5755fcb7f5SSatish Balay {
58efca3c55SSatish Balay   *ierr = PetscAbortErrorHandler(*comm,*line,fun,file,*n,*p,mess,ctx);
5955fcb7f5SSatish Balay }
6055fcb7f5SSatish Balay 
61efca3c55SSatish 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)
6255fcb7f5SSatish Balay {
63efca3c55SSatish Balay   *ierr = PetscAttachDebuggerErrorHandler(*comm,*line,fun,file,*n,*p,mess,ctx);
6455fcb7f5SSatish Balay }
6555fcb7f5SSatish Balay 
66efca3c55SSatish 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)
6755fcb7f5SSatish Balay {
68efca3c55SSatish Balay   *ierr = PetscEmacsClientErrorHandler(*comm,*line,fun,file,*n,*p,mess,ctx);
6955fcb7f5SSatish Balay }
7055fcb7f5SSatish Balay 
71efca3c55SSatish 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)
7255fcb7f5SSatish Balay {
73efca3c55SSatish Balay   *ierr = PetscIgnoreErrorHandler(*comm,*line,fun,file,*n,*p,mess,ctx);
7455fcb7f5SSatish Balay }
7555fcb7f5SSatish Balay 
7619caf8f3SSatish 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)
7755fcb7f5SSatish Balay {
78a297a907SKarl Rupp   if ((void(*)(void))handler == (void(*)(void))petsctracebackerrorhandler_) *ierr = PetscPushErrorHandler(PetscTraceBackErrorHandler,0);
79a297a907SKarl Rupp   else {
8055fcb7f5SSatish Balay     f2    = handler;
8155fcb7f5SSatish Balay     *ierr = PetscPushErrorHandler(ourerrorhandler,ctx);
8255fcb7f5SSatish Balay   }
8355fcb7f5SSatish Balay }
8455fcb7f5SSatish Balay 
8519caf8f3SSatish Balay PETSC_EXTERN void petscerror_(MPI_Fint *comm,PetscErrorCode *number,PetscErrorType *p,char* message,PETSC_FORTRAN_CHARLEN_T len)
8655fcb7f5SSatish Balay {
87e3081792SBarry Smith   PetscErrorCode nierr,*ierr = &nierr;
8855fcb7f5SSatish Balay   char *t1;
8955fcb7f5SSatish Balay   FIXCHAR(message,len,t1);
903ca90d2dSJacob Faibussowitsch   nierr = PetscError(MPI_Comm_f2c(*(comm)),0,NULL,NULL,*number,*p,"%s",t1);
9155fcb7f5SSatish Balay   FREECHAR(message,t1);
9255fcb7f5SSatish Balay }
9355fcb7f5SSatish Balay 
94*49c86fc7SBarry Smith #if defined(PETSC_HAVE_FORTRAN_FREE_LINE_LENGTH_NONE)
95*49c86fc7SBarry Smith PETSC_EXTERN void petscerrorf_(PetscErrorCode *err,int *line,char *file,PETSC_FORTRAN_CHARLEN_T len)
96bfe649d8SSatish Balay {
97*49c86fc7SBarry Smith   char           *tfile;
98*49c86fc7SBarry Smith   PetscErrorCode derr,*ierr = &derr; /* needed by FIXCHAR */
99*49c86fc7SBarry Smith 
100*49c86fc7SBarry Smith   FIXCHAR(file,len,tfile);
101*49c86fc7SBarry Smith   PetscError(PETSC_COMM_SELF,*line,NULL,tfile,*err,PETSC_ERROR_REPEAT,NULL);
102*49c86fc7SBarry Smith   FREECHAR(file,tfile);
103bfe649d8SSatish Balay }
104bfe649d8SSatish Balay 
105*49c86fc7SBarry Smith PETSC_EXTERN void petscerrormpi_(PetscErrorCode *err,int *line,char *file,PETSC_FORTRAN_CHARLEN_T len)
106*49c86fc7SBarry Smith {
107*49c86fc7SBarry Smith   char           errorstring[2*MPI_MAX_ERROR_STRING];
108*49c86fc7SBarry Smith   char           *tfile;
109*49c86fc7SBarry Smith   PetscErrorCode derr,*ierr = &derr; /* needed by FIXCHAR */
110*49c86fc7SBarry Smith 
111*49c86fc7SBarry Smith   FIXCHAR(file,len,tfile);
112*49c86fc7SBarry Smith   PetscMPIErrorString(*err,errorstring);
113*49c86fc7SBarry Smith   PetscError(PETSC_COMM_SELF,*line,NULL,file,PETSC_ERR_MPI,PETSC_ERROR_INITIAL,"MPI error %d %s",*err,errorstring);
114*49c86fc7SBarry Smith   FREECHAR(file,tfile);
115*49c86fc7SBarry Smith   *err = PETSC_ERR_MPI;
116*49c86fc7SBarry Smith }
117*49c86fc7SBarry Smith #else
118*49c86fc7SBarry Smith PETSC_EXTERN void petscerrorf_(PetscErrorCode *err)
119*49c86fc7SBarry Smith {
120*49c86fc7SBarry Smith   PetscError(PETSC_COMM_SELF,0,NULL,NULL,*err,PETSC_ERROR_REPEAT,NULL);
121*49c86fc7SBarry Smith }
122*49c86fc7SBarry Smith 
123*49c86fc7SBarry Smith PETSC_EXTERN void petscerrormpi_(PetscErrorCode *err)
124*49c86fc7SBarry Smith {
125*49c86fc7SBarry Smith   char           errorstring[2*MPI_MAX_ERROR_STRING];
126*49c86fc7SBarry Smith 
127*49c86fc7SBarry Smith   PetscMPIErrorString(*err,errorstring);
128*49c86fc7SBarry Smith   PetscError(PETSC_COMM_SELF,0,NULL,NULL,PETSC_ERR_MPI,PETSC_ERROR_INITIAL,"MPI error %d %s",*err,errorstring);
129*49c86fc7SBarry Smith   *err = PETSC_ERR_MPI;
130*49c86fc7SBarry Smith }
131*49c86fc7SBarry Smith #endif
132*49c86fc7SBarry Smith 
13319caf8f3SSatish Balay PETSC_EXTERN void petscrealview_(PetscInt *n,PetscReal *d,PetscViewer *viwer,PetscErrorCode *ierr)
13455fcb7f5SSatish Balay {
13516bf3c38SBarry Smith   PetscViewer v;
13616bf3c38SBarry Smith   PetscPatchDefaultViewers_Fortran(viwer,v);
13716bf3c38SBarry Smith   *ierr = PetscRealView(*n,d,v);
13855fcb7f5SSatish Balay }
13955fcb7f5SSatish Balay 
14019caf8f3SSatish Balay PETSC_EXTERN void petscintview_(PetscInt *n,PetscInt *d,PetscViewer *viwer,PetscErrorCode *ierr)
14155fcb7f5SSatish Balay {
14216bf3c38SBarry Smith   PetscViewer v;
14316bf3c38SBarry Smith   PetscPatchDefaultViewers_Fortran(viwer,v);
14416bf3c38SBarry Smith   *ierr = PetscIntView(*n,d,v);
14516bf3c38SBarry Smith }
14616bf3c38SBarry Smith 
14716bf3c38SBarry Smith #if defined(PETSC_HAVE_FORTRAN_CAPS)
14816bf3c38SBarry Smith #define petscscalarview_             PETSCSCALARVIEW
14916bf3c38SBarry Smith #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE)
15016bf3c38SBarry Smith #define petscscalarview_             petscscalarview
15116bf3c38SBarry Smith #endif
15216bf3c38SBarry Smith 
15319caf8f3SSatish Balay PETSC_EXTERN void petscscalarview_(PetscInt *n,PetscScalar *d,PetscViewer *viwer,PetscErrorCode *ierr)
15416bf3c38SBarry Smith {
15516bf3c38SBarry Smith   PetscViewer v;
15616bf3c38SBarry Smith   PetscPatchDefaultViewers_Fortran(viwer,v);
15716bf3c38SBarry Smith   *ierr = PetscScalarView(*n,d,v);
15855fcb7f5SSatish Balay }
159