1b45d2f2cSJed Brown #include <petsc-private/fortranimpl.h> 2c6db04a5SJed Brown #include <petscsys.h> 3*665c2dedSJed 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 2755fcb7f5SSatish Balay EXTERN_C_BEGIN 28668f157eSBarry Smith static void (PETSC_STDCALL *f2)(MPI_Comm *comm,int*,const CHAR PETSC_MIXED_LEN(len1),const CHAR PETSC_MIXED_LEN(len2),const CHAR PETSC_MIXED_LEN(len3),PetscErrorCode*,PetscErrorType*,const CHAR PETSC_MIXED_LEN(len4),void*,PetscErrorCode* PETSC_END_LEN(len1) PETSC_END_LEN(len2) PETSC_END_LEN(len3) PETSC_END_LEN(len4)); 2955fcb7f5SSatish Balay EXTERN_C_END 3055fcb7f5SSatish Balay 3155fcb7f5SSatish Balay /* These are not extern C because they are passed into non-extern C user level functions */ 32668f157eSBarry Smith static PetscErrorCode ourerrorhandler(MPI_Comm comm,int line,const char *fun,const char *file,const char *dir,PetscErrorCode n,PetscErrorType p,const char *mess,void *ctx) 3355fcb7f5SSatish Balay { 3455fcb7f5SSatish Balay PetscErrorCode ierr = 0; 3555fcb7f5SSatish Balay size_t len1,len2,len3,len4; 3655fcb7f5SSatish Balay int l1,l2,l3,l4; 3755fcb7f5SSatish Balay 3855fcb7f5SSatish Balay PetscStrlen(fun,&len1); l1 = (int)len1; 3955fcb7f5SSatish Balay PetscStrlen(file,&len2);l2 = (int)len2; 4055fcb7f5SSatish Balay PetscStrlen(dir,&len3); l3 = (int)len3; 4155fcb7f5SSatish Balay PetscStrlen(mess,&len4);l4 = (int)len4; 4255fcb7f5SSatish Balay 43a9943481SBarry Smith #if defined(PETSC_HAVE_FORTRAN_MIXED_STR_ARG) 44e32f2f54SBarry Smith (*f2)(&comm,&line,fun,l1,file,l2,dir,l3,&n,&p,mess,l4,ctx,&ierr); 4555fcb7f5SSatish Balay #else 46e32f2f54SBarry Smith (*f2)(&comm,&line,fun,file,dir,&n,&p,mess,ctx,&ierr,l1,l2,l3,l4); 4755fcb7f5SSatish Balay #endif 4855fcb7f5SSatish Balay return ierr; 4955fcb7f5SSatish Balay } 5055fcb7f5SSatish Balay 5155fcb7f5SSatish Balay EXTERN_C_BEGIN 5255fcb7f5SSatish Balay 5355fcb7f5SSatish Balay /* 5455fcb7f5SSatish Balay These are not usually called from Fortran but allow Fortran users 5555fcb7f5SSatish Balay to transparently set these monitors from .F code 5655fcb7f5SSatish Balay 5755fcb7f5SSatish Balay functions, hence no STDCALL 5855fcb7f5SSatish Balay */ 59668f157eSBarry Smith void petsctracebackerrorhandler_(MPI_Comm *comm,int *line,const char *fun,const char *file,const char *dir,PetscErrorCode *n,PetscErrorType *p,const char *mess,void *ctx,PetscErrorCode *ierr) 6055fcb7f5SSatish Balay { 61e32f2f54SBarry Smith *ierr = PetscTraceBackErrorHandler(*comm,*line,fun,file,dir,*n,*p,mess,ctx); 6255fcb7f5SSatish Balay } 6355fcb7f5SSatish Balay 64668f157eSBarry Smith void petscaborterrorhandler_(MPI_Comm *comm,int *line,const char *fun,const char *file,const char *dir,PetscErrorCode *n,PetscErrorType *p,const char *mess,void *ctx,PetscErrorCode *ierr) 6555fcb7f5SSatish Balay { 66e32f2f54SBarry Smith *ierr = PetscAbortErrorHandler(*comm,*line,fun,file,dir,*n,*p,mess,ctx); 6755fcb7f5SSatish Balay } 6855fcb7f5SSatish Balay 69668f157eSBarry Smith void petscattachdebuggererrorhandler_(MPI_Comm *comm,int *line,const char *fun,const char *file,const char *dir,PetscErrorCode *n,PetscErrorType *p,const char *mess,void *ctx,PetscErrorCode *ierr) 7055fcb7f5SSatish Balay { 71e32f2f54SBarry Smith *ierr = PetscAttachDebuggerErrorHandler(*comm,*line,fun,file,dir,*n,*p,mess,ctx); 7255fcb7f5SSatish Balay } 7355fcb7f5SSatish Balay 74668f157eSBarry Smith void petscemacsclienterrorhandler_(MPI_Comm *comm,int *line,const char *fun,const char *file,const char *dir,PetscErrorCode *n,PetscErrorType *p,const char *mess,void *ctx,PetscErrorCode *ierr) 7555fcb7f5SSatish Balay { 76e32f2f54SBarry Smith *ierr = PetscEmacsClientErrorHandler(*comm,*line,fun,file,dir,*n,*p,mess,ctx); 7755fcb7f5SSatish Balay } 7855fcb7f5SSatish Balay 79668f157eSBarry Smith void petscignoreerrorhandler_(MPI_Comm *comm,int *line,const char *fun,const char *file,const char *dir,PetscErrorCode *n,PetscErrorType *p,const char *mess,void *ctx,PetscErrorCode *ierr) 8055fcb7f5SSatish Balay { 81e32f2f54SBarry Smith *ierr = PetscIgnoreErrorHandler(*comm,*line,fun,file,dir,*n,*p,mess,ctx); 8255fcb7f5SSatish Balay } 8355fcb7f5SSatish Balay 84668f157eSBarry Smith void PETSC_STDCALL petscpusherrorhandler_(void (PETSC_STDCALL *handler)(MPI_Comm *comm,int*,const CHAR PETSC_MIXED_LEN(len1),const CHAR PETSC_MIXED_LEN(len2),const CHAR PETSC_MIXED_LEN(len3),PetscErrorCode*,PetscErrorType*,const CHAR PETSC_MIXED_LEN(len4),void*,PetscErrorCode* PETSC_END_LEN(len1) PETSC_END_LEN(len2) PETSC_END_LEN(len3) PETSC_END_LEN(len4)),void *ctx,PetscErrorCode *ierr) 8555fcb7f5SSatish Balay { 86a297a907SKarl Rupp if ((void(*)(void))handler == (void(*)(void))petsctracebackerrorhandler_) *ierr = PetscPushErrorHandler(PetscTraceBackErrorHandler,0); 87a297a907SKarl Rupp else { 8855fcb7f5SSatish Balay f2 = handler; 8955fcb7f5SSatish Balay *ierr = PetscPushErrorHandler(ourerrorhandler,ctx); 9055fcb7f5SSatish Balay } 9155fcb7f5SSatish Balay } 9255fcb7f5SSatish Balay 93668f157eSBarry Smith void PETSC_STDCALL petscerror_(MPI_Comm *comm,PetscErrorCode *number,int *line,PetscErrorType *p,CHAR message PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len)) 9455fcb7f5SSatish Balay { 9555fcb7f5SSatish Balay char *t1; 9655fcb7f5SSatish Balay FIXCHAR(message,len,t1); 97e32f2f54SBarry Smith *ierr = PetscError(*comm,*line,0,0,0,*number,*p,t1); 9855fcb7f5SSatish Balay FREECHAR(message,t1); 9955fcb7f5SSatish Balay } 10055fcb7f5SSatish Balay 10116bf3c38SBarry Smith void PETSC_STDCALL petscrealview_(PetscInt *n,PetscReal *d,PetscViewer *viwer,PetscErrorCode *ierr) 10255fcb7f5SSatish Balay { 10316bf3c38SBarry Smith PetscViewer v; 10416bf3c38SBarry Smith PetscPatchDefaultViewers_Fortran(viwer,v); 10516bf3c38SBarry Smith *ierr = PetscRealView(*n,d,v); 10655fcb7f5SSatish Balay } 10755fcb7f5SSatish Balay 10816bf3c38SBarry Smith void PETSC_STDCALL petscintview_(PetscInt *n,PetscInt *d,PetscViewer *viwer,PetscErrorCode *ierr) 10955fcb7f5SSatish Balay { 11016bf3c38SBarry Smith PetscViewer v; 11116bf3c38SBarry Smith PetscPatchDefaultViewers_Fortran(viwer,v); 11216bf3c38SBarry Smith *ierr = PetscIntView(*n,d,v); 11316bf3c38SBarry Smith } 11416bf3c38SBarry Smith 11516bf3c38SBarry Smith #if defined(PETSC_HAVE_FORTRAN_CAPS) 11616bf3c38SBarry Smith #define petscscalarview_ PETSCSCALARVIEW 11716bf3c38SBarry Smith #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE) 11816bf3c38SBarry Smith #define petscscalarview_ petscscalarview 11916bf3c38SBarry Smith #endif 12016bf3c38SBarry Smith 12116bf3c38SBarry Smith void PETSC_STDCALL petscscalarview_(PetscInt *n,PetscScalar *d,PetscViewer *viwer,PetscErrorCode *ierr) 12216bf3c38SBarry Smith { 12316bf3c38SBarry Smith PetscViewer v; 12416bf3c38SBarry Smith PetscPatchDefaultViewers_Fortran(viwer,v); 12516bf3c38SBarry Smith *ierr = PetscScalarView(*n,d,v); 12655fcb7f5SSatish Balay } 12755fcb7f5SSatish Balay 12855fcb7f5SSatish Balay EXTERN_C_END 129