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 1355fcb7f5SSatish Balay #define petscrealview_ PETSCREALVIEW 1455fcb7f5SSatish Balay #define petscintview_ PETSCINTVIEW 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 2355fcb7f5SSatish Balay #define petscrealview_ petscrealview 2455fcb7f5SSatish Balay #define petscintview_ petscintview 2555fcb7f5SSatish Balay #endif 2655fcb7f5SSatish Balay 27*390e1bf2SBarry 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)); 2855fcb7f5SSatish Balay 2955fcb7f5SSatish Balay /* These are not extern C because they are passed into non-extern C user level functions */ 30efca3c55SSatish Balay static PetscErrorCode ourerrorhandler(MPI_Comm comm,int line,const char *fun,const char *file,PetscErrorCode n,PetscErrorType p,const char *mess,void *ctx) 3155fcb7f5SSatish Balay { 3255fcb7f5SSatish Balay PetscErrorCode ierr = 0; 33efca3c55SSatish Balay size_t len1,len2,len3; 34efca3c55SSatish Balay int l1,l2,l3; 3555fcb7f5SSatish Balay 3655fcb7f5SSatish Balay PetscStrlen(fun,&len1); l1 = (int)len1; 3755fcb7f5SSatish Balay PetscStrlen(file,&len2);l2 = (int)len2; 38efca3c55SSatish Balay PetscStrlen(mess,&len3);l3 = (int)len3; 3955fcb7f5SSatish Balay 40a9943481SBarry Smith #if defined(PETSC_HAVE_FORTRAN_MIXED_STR_ARG) 41efca3c55SSatish Balay (*f2)(&comm,&line,fun,l1,file,l2,&n,&p,mess,l3,ctx,&ierr); 4255fcb7f5SSatish Balay #else 43efca3c55SSatish Balay (*f2)(&comm,&line,fun,file,&n,&p,mess,ctx,&ierr,l1,l2,l3); 4455fcb7f5SSatish Balay #endif 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 5255fcb7f5SSatish Balay functions, hence no STDCALL 5355fcb7f5SSatish Balay */ 54efca3c55SSatish 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) 5555fcb7f5SSatish Balay { 56efca3c55SSatish Balay *ierr = PetscTraceBackErrorHandler(*comm,*line,fun,file,*n,*p,mess,ctx); 5755fcb7f5SSatish Balay } 5855fcb7f5SSatish Balay 59efca3c55SSatish 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) 6055fcb7f5SSatish Balay { 61efca3c55SSatish Balay *ierr = PetscAbortErrorHandler(*comm,*line,fun,file,*n,*p,mess,ctx); 6255fcb7f5SSatish Balay } 6355fcb7f5SSatish Balay 64efca3c55SSatish 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) 6555fcb7f5SSatish Balay { 66efca3c55SSatish Balay *ierr = PetscAttachDebuggerErrorHandler(*comm,*line,fun,file,*n,*p,mess,ctx); 6755fcb7f5SSatish Balay } 6855fcb7f5SSatish Balay 69efca3c55SSatish 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) 7055fcb7f5SSatish Balay { 71efca3c55SSatish Balay *ierr = PetscEmacsClientErrorHandler(*comm,*line,fun,file,*n,*p,mess,ctx); 7255fcb7f5SSatish Balay } 7355fcb7f5SSatish Balay 74efca3c55SSatish 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) 7555fcb7f5SSatish Balay { 76efca3c55SSatish Balay *ierr = PetscIgnoreErrorHandler(*comm,*line,fun,file,*n,*p,mess,ctx); 7755fcb7f5SSatish Balay } 7855fcb7f5SSatish Balay 79*390e1bf2SBarry 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) 8055fcb7f5SSatish Balay { 81a297a907SKarl Rupp if ((void(*)(void))handler == (void(*)(void))petsctracebackerrorhandler_) *ierr = PetscPushErrorHandler(PetscTraceBackErrorHandler,0); 82a297a907SKarl Rupp else { 8355fcb7f5SSatish Balay f2 = handler; 8455fcb7f5SSatish Balay *ierr = PetscPushErrorHandler(ourerrorhandler,ctx); 8555fcb7f5SSatish Balay } 8655fcb7f5SSatish Balay } 8755fcb7f5SSatish Balay 88*390e1bf2SBarry Smith PETSC_EXTERN void PETSC_STDCALL petscerror_(MPI_Fint *comm,PetscErrorCode *number,int *line,PetscErrorType *p,char* message PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len)) 8955fcb7f5SSatish Balay { 9055fcb7f5SSatish Balay char *t1; 9155fcb7f5SSatish Balay FIXCHAR(message,len,t1); 9267730de9SBarry Smith *ierr = PetscError(MPI_Comm_f2c(*(comm)),*line,0,0,*number,*p,t1); 9355fcb7f5SSatish Balay FREECHAR(message,t1); 9455fcb7f5SSatish Balay } 9555fcb7f5SSatish Balay 968cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL petscrealview_(PetscInt *n,PetscReal *d,PetscViewer *viwer,PetscErrorCode *ierr) 9755fcb7f5SSatish Balay { 9816bf3c38SBarry Smith PetscViewer v; 9916bf3c38SBarry Smith PetscPatchDefaultViewers_Fortran(viwer,v); 10016bf3c38SBarry Smith *ierr = PetscRealView(*n,d,v); 10155fcb7f5SSatish Balay } 10255fcb7f5SSatish Balay 1038cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL petscintview_(PetscInt *n,PetscInt *d,PetscViewer *viwer,PetscErrorCode *ierr) 10455fcb7f5SSatish Balay { 10516bf3c38SBarry Smith PetscViewer v; 10616bf3c38SBarry Smith PetscPatchDefaultViewers_Fortran(viwer,v); 10716bf3c38SBarry Smith *ierr = PetscIntView(*n,d,v); 10816bf3c38SBarry Smith } 10916bf3c38SBarry Smith 11016bf3c38SBarry Smith #if defined(PETSC_HAVE_FORTRAN_CAPS) 11116bf3c38SBarry Smith #define petscscalarview_ PETSCSCALARVIEW 11216bf3c38SBarry Smith #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE) 11316bf3c38SBarry Smith #define petscscalarview_ petscscalarview 11416bf3c38SBarry Smith #endif 11516bf3c38SBarry Smith 1168cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL petscscalarview_(PetscInt *n,PetscScalar *d,PetscViewer *viwer,PetscErrorCode *ierr) 11716bf3c38SBarry Smith { 11816bf3c38SBarry Smith PetscViewer v; 11916bf3c38SBarry Smith PetscPatchDefaultViewers_Fortran(viwer,v); 12016bf3c38SBarry Smith *ierr = PetscScalarView(*n,d,v); 12155fcb7f5SSatish Balay } 122