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 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; 3655fcb7f5SSatish Balay 37*7bdf51c9SJed Brown PetscStrlen(fun,&len1); 38*7bdf51c9SJed Brown PetscStrlen(file,&len2); 39*7bdf51c9SJed Brown PetscStrlen(mess,&len3); 4055fcb7f5SSatish Balay 41*7bdf51c9SJed Brown (*f2)(&comm,&line,fun PETSC_MIXED_LEN_CALL(len1),file PETSC_MIXED_LEN_CALL(len2),&n,&p,mess PETSC_MIXED_LEN_CALL(len3),ctx,&ierr PETSC_END_LEN_CALL(len1) PETSC_END_LEN_CALL(len2) PETSC_END_LEN_CALL(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 4955fcb7f5SSatish Balay functions, hence no STDCALL 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 76390e1bf2SBarry 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) 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 85e3081792SBarry Smith PETSC_EXTERN void PETSC_STDCALL petscerror_(MPI_Fint *comm,PetscErrorCode *number,PetscErrorType *p,char* message PETSC_MIXED_LEN(len) PETSC_END_LEN(len)) 8655fcb7f5SSatish Balay { 87e3081792SBarry Smith PetscErrorCode nierr,*ierr = &nierr; 8855fcb7f5SSatish Balay char *t1; 8955fcb7f5SSatish Balay FIXCHAR(message,len,t1); 90e3081792SBarry Smith nierr = PetscError(MPI_Comm_f2c(*(comm)),0,NULL,NULL,*number,*p,t1); 9155fcb7f5SSatish Balay FREECHAR(message,t1); 9255fcb7f5SSatish Balay } 9355fcb7f5SSatish Balay 94bfe649d8SSatish Balay /* helper routine for CHKERRQ and CHKERRABORT macros on the fortran side */ 95bfe649d8SSatish Balay PETSC_EXTERN void PETSC_STDCALL petscerrorf_(PetscErrorCode *number) 96bfe649d8SSatish Balay { 97bfe649d8SSatish Balay PetscError(PETSC_COMM_SELF,0,NULL,NULL,*number,PETSC_ERROR_REPEAT,NULL); 98bfe649d8SSatish Balay } 99bfe649d8SSatish Balay 1008cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL petscrealview_(PetscInt *n,PetscReal *d,PetscViewer *viwer,PetscErrorCode *ierr) 10155fcb7f5SSatish Balay { 10216bf3c38SBarry Smith PetscViewer v; 10316bf3c38SBarry Smith PetscPatchDefaultViewers_Fortran(viwer,v); 10416bf3c38SBarry Smith *ierr = PetscRealView(*n,d,v); 10555fcb7f5SSatish Balay } 10655fcb7f5SSatish Balay 1078cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL petscintview_(PetscInt *n,PetscInt *d,PetscViewer *viwer,PetscErrorCode *ierr) 10855fcb7f5SSatish Balay { 10916bf3c38SBarry Smith PetscViewer v; 11016bf3c38SBarry Smith PetscPatchDefaultViewers_Fortran(viwer,v); 11116bf3c38SBarry Smith *ierr = PetscIntView(*n,d,v); 11216bf3c38SBarry Smith } 11316bf3c38SBarry Smith 11416bf3c38SBarry Smith #if defined(PETSC_HAVE_FORTRAN_CAPS) 11516bf3c38SBarry Smith #define petscscalarview_ PETSCSCALARVIEW 11616bf3c38SBarry Smith #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE) 11716bf3c38SBarry Smith #define petscscalarview_ petscscalarview 11816bf3c38SBarry Smith #endif 11916bf3c38SBarry Smith 1208cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL petscscalarview_(PetscInt *n,PetscScalar *d,PetscViewer *viwer,PetscErrorCode *ierr) 12116bf3c38SBarry Smith { 12216bf3c38SBarry Smith PetscViewer v; 12316bf3c38SBarry Smith PetscPatchDefaultViewers_Fortran(viwer,v); 12416bf3c38SBarry Smith *ierr = PetscScalarView(*n,d,v); 12555fcb7f5SSatish Balay } 126