155fcb7f5SSatish Balay #include "zpetsc.h" 255fcb7f5SSatish Balay #include "petsc.h" 355fcb7f5SSatish Balay 455fcb7f5SSatish Balay #if defined(PETSC_HAVE_FORTRAN_CAPS) 555fcb7f5SSatish Balay #define petscpusherrorhandler_ PETSCPUSHERRORHANDLER 655fcb7f5SSatish Balay #define petsctracebackerrorhandler_ PETSCTRACEBACKERRORHANDLER 755fcb7f5SSatish Balay #define petscaborterrorhandler_ PETSCABORTERRORHANDLER 855fcb7f5SSatish Balay #define petscignoreerrorhandler_ PETSCIGNOREERRORHANDLER 955fcb7f5SSatish Balay #define petscemacsclienterrorhandler_ PETSCEMACSCLIENTERRORHANDLER 1055fcb7f5SSatish Balay #define petscattachdebuggererrorhandler_ PETSCATTACHDEBUGGERERRORHANDLER 1155fcb7f5SSatish Balay #define petscerror_ PETSCERROR 1255fcb7f5SSatish Balay #define petscrealview_ PETSCREALVIEW 1355fcb7f5SSatish Balay #define petscintview_ PETSCINTVIEW 1455fcb7f5SSatish Balay #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE) 1555fcb7f5SSatish Balay #define petscpusherrorhandler_ petscpusherrorhandler 1655fcb7f5SSatish Balay #define petsctracebackerrorhandler_ petsctracebackerrorhandler 1755fcb7f5SSatish Balay #define petscaborterrorhandler_ petscaborterrorhandler 1855fcb7f5SSatish Balay #define petscignoreerrorhandler_ petscignoreerrorhandler 1955fcb7f5SSatish Balay #define petscemacsclienterrorhandler_ petscemacsclienterrorhandler 2055fcb7f5SSatish Balay #define petscattachdebuggererrorhandler_ petscattachdebuggererrorhandler 2155fcb7f5SSatish Balay #define petscerror_ petscerror 2255fcb7f5SSatish Balay #define petscrealview_ petscrealview 2355fcb7f5SSatish Balay #define petscintview_ petscintview 2455fcb7f5SSatish Balay #endif 2555fcb7f5SSatish Balay 2655fcb7f5SSatish Balay EXTERN_C_BEGIN 2755fcb7f5SSatish Balay static void (PETSC_STDCALL *f2)(int*,const CHAR PETSC_MIXED_LEN(len1),const CHAR PETSC_MIXED_LEN(len2),const CHAR PETSC_MIXED_LEN(len3),int*,int*,const CHAR PETSC_MIXED_LEN(len4),void*,PetscErrorCode* PETSC_END_LEN(len1) PETSC_END_LEN(len2) PETSC_END_LEN(len3) PETSC_END_LEN(len4)); 2855fcb7f5SSatish Balay EXTERN_C_END 2955fcb7f5SSatish Balay 3055fcb7f5SSatish Balay /* These are not extern C because they are passed into non-extern C user level functions */ 3155fcb7f5SSatish Balay static PetscErrorCode ourerrorhandler(int line,const char *fun,const char *file,const char *dir,int n,int p,const char *mess,void *ctx) 3255fcb7f5SSatish Balay { 3355fcb7f5SSatish Balay PetscErrorCode ierr = 0; 3455fcb7f5SSatish Balay size_t len1,len2,len3,len4; 3555fcb7f5SSatish Balay int l1,l2,l3,l4; 3655fcb7f5SSatish Balay 3755fcb7f5SSatish Balay PetscStrlen(fun,&len1); l1 = (int)len1; 3855fcb7f5SSatish Balay PetscStrlen(file,&len2);l2 = (int)len2; 3955fcb7f5SSatish Balay PetscStrlen(dir,&len3);l3 = (int)len3; 4055fcb7f5SSatish Balay PetscStrlen(mess,&len4);l4 = (int)len4; 4155fcb7f5SSatish Balay 4255fcb7f5SSatish Balay #if defined(PETSC_USES_CPTOFCD) 4355fcb7f5SSatish Balay { 4455fcb7f5SSatish Balay CHAR fun_c,file_c,dir_c,mess_c; 4555fcb7f5SSatish Balay 4655fcb7f5SSatish Balay fun_c = _cptofcd(fun,len1); 4755fcb7f5SSatish Balay file_c = _cptofcd(file,len2); 4855fcb7f5SSatish Balay dir_c = _cptofcd(dir,len3); 4955fcb7f5SSatish Balay mess_c = _cptofcd(mess,len4); 5055fcb7f5SSatish Balay (*f2)(&line,fun_c,file_c,dir_c,&n,&p,mess_c,ctx,&ierr,len1,len2,len3,len4); 5155fcb7f5SSatish Balay 5255fcb7f5SSatish Balay } 5355fcb7f5SSatish Balay #elif defined(PETSC_HAVE_FORTRAN_MIXED_STR_ARG) 5455fcb7f5SSatish Balay (*f2)(&line,fun,l1,file,l2,dir,l3,&n,&p,mess,l4,ctx,&ierr); 5555fcb7f5SSatish Balay #else 5655fcb7f5SSatish Balay (*f2)(&line,fun,file,dir,&n,&p,mess,ctx,&ierr,l1,l2,l3,l4); 5755fcb7f5SSatish Balay #endif 5855fcb7f5SSatish Balay return ierr; 5955fcb7f5SSatish Balay } 6055fcb7f5SSatish Balay 6155fcb7f5SSatish Balay EXTERN_C_BEGIN 6255fcb7f5SSatish Balay 6355fcb7f5SSatish Balay /* 6455fcb7f5SSatish Balay These are not usually called from Fortran but allow Fortran users 6555fcb7f5SSatish Balay to transparently set these monitors from .F code 6655fcb7f5SSatish Balay 6755fcb7f5SSatish Balay functions, hence no STDCALL 6855fcb7f5SSatish Balay */ 6955fcb7f5SSatish Balay void petsctracebackerrorhandler_(int *line,const char *fun,const char *file,const char *dir,int *n,int *p,const char *mess,void *ctx,PetscErrorCode *ierr) 7055fcb7f5SSatish Balay { 7155fcb7f5SSatish Balay *ierr = PetscTraceBackErrorHandler(*line,fun,file,dir,*n,*p,mess,ctx); 7255fcb7f5SSatish Balay } 7355fcb7f5SSatish Balay 7455fcb7f5SSatish Balay void petscaborterrorhandler_(int *line,const char *fun,const char *file,const char *dir,int *n,int *p,const char *mess,void *ctx,PetscErrorCode *ierr) 7555fcb7f5SSatish Balay { 7655fcb7f5SSatish Balay *ierr = PetscAbortErrorHandler(*line,fun,file,dir,*n,*p,mess,ctx); 7755fcb7f5SSatish Balay } 7855fcb7f5SSatish Balay 7955fcb7f5SSatish Balay void petscattachdebuggererrorhandler_(int *line,const char *fun,const char *file,const char *dir,int *n,int *p,const char *mess,void *ctx,PetscErrorCode *ierr) 8055fcb7f5SSatish Balay { 8155fcb7f5SSatish Balay *ierr = PetscAttachDebuggerErrorHandler(*line,fun,file,dir,*n,*p,mess,ctx); 8255fcb7f5SSatish Balay } 8355fcb7f5SSatish Balay 8455fcb7f5SSatish Balay void petscemacsclienterrorhandler_(int *line,const char *fun,const char *file,const char *dir,int *n,int *p,const char *mess,void *ctx,PetscErrorCode *ierr) 8555fcb7f5SSatish Balay { 8655fcb7f5SSatish Balay *ierr = PetscEmacsClientErrorHandler(*line,fun,file,dir,*n,*p,mess,ctx); 8755fcb7f5SSatish Balay } 8855fcb7f5SSatish Balay 8955fcb7f5SSatish Balay void petscignoreerrorhandler_(int *line,const char *fun,const char *file,const char *dir,int *n,int *p,const char *mess,void *ctx,PetscErrorCode *ierr) 9055fcb7f5SSatish Balay { 9155fcb7f5SSatish Balay *ierr = PetscIgnoreErrorHandler(*line,fun,file,dir,*n,*p,mess,ctx); 9255fcb7f5SSatish Balay } 9355fcb7f5SSatish Balay 9455fcb7f5SSatish Balay void PETSC_STDCALL petscpusherrorhandler_(void (PETSC_STDCALL *handler)(int*,const CHAR PETSC_MIXED_LEN(len1),const CHAR PETSC_MIXED_LEN(len2),const CHAR PETSC_MIXED_LEN(len3),int*,int*,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) 9555fcb7f5SSatish Balay { 9655fcb7f5SSatish Balay if ((void(*)(void))handler == (void(*)(void))petsctracebackerrorhandler_) { 9755fcb7f5SSatish Balay *ierr = PetscPushErrorHandler(PetscTraceBackErrorHandler,0); 9855fcb7f5SSatish Balay } else { 9955fcb7f5SSatish Balay f2 = handler; 10055fcb7f5SSatish Balay *ierr = PetscPushErrorHandler(ourerrorhandler,ctx); 10155fcb7f5SSatish Balay } 10255fcb7f5SSatish Balay } 10355fcb7f5SSatish Balay 10455fcb7f5SSatish Balay void PETSC_STDCALL petscerror_(int *number,int *p,CHAR message PETSC_MIXED_LEN(len), 10555fcb7f5SSatish Balay PetscErrorCode *ierr PETSC_END_LEN(len)) 10655fcb7f5SSatish Balay { 10755fcb7f5SSatish Balay char *t1; 10855fcb7f5SSatish Balay FIXCHAR(message,len,t1); 10955fcb7f5SSatish Balay *ierr = PetscError(-1,0,0,0,*number,*p,t1); 11055fcb7f5SSatish Balay FREECHAR(message,t1); 11155fcb7f5SSatish Balay } 11255fcb7f5SSatish Balay 113*16bf3c38SBarry Smith void PETSC_STDCALL petscrealview_(PetscInt *n,PetscReal *d,PetscViewer *viwer,PetscErrorCode *ierr) 11455fcb7f5SSatish Balay { 115*16bf3c38SBarry Smith PetscViewer v; 116*16bf3c38SBarry Smith PetscPatchDefaultViewers_Fortran(viwer,v); 117*16bf3c38SBarry Smith *ierr = PetscRealView(*n,d,v); 11855fcb7f5SSatish Balay } 11955fcb7f5SSatish Balay 120*16bf3c38SBarry Smith void PETSC_STDCALL petscintview_(PetscInt *n,PetscInt *d,PetscViewer *viwer,PetscErrorCode *ierr) 12155fcb7f5SSatish Balay { 122*16bf3c38SBarry Smith PetscViewer v; 123*16bf3c38SBarry Smith PetscPatchDefaultViewers_Fortran(viwer,v); 124*16bf3c38SBarry Smith *ierr = PetscIntView(*n,d,v); 125*16bf3c38SBarry Smith } 126*16bf3c38SBarry Smith 127*16bf3c38SBarry Smith #if defined(PETSC_HAVE_FORTRAN_CAPS) 128*16bf3c38SBarry Smith #define petscscalarview_ PETSCSCALARVIEW 129*16bf3c38SBarry Smith #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE) 130*16bf3c38SBarry Smith #define petscscalarview_ petscscalarview 131*16bf3c38SBarry Smith #endif 132*16bf3c38SBarry Smith 133*16bf3c38SBarry Smith void PETSC_STDCALL petscscalarview_(PetscInt *n,PetscScalar *d,PetscViewer *viwer,PetscErrorCode *ierr) 134*16bf3c38SBarry Smith { 135*16bf3c38SBarry Smith PetscViewer v; 136*16bf3c38SBarry Smith PetscPatchDefaultViewers_Fortran(viwer,v); 137*16bf3c38SBarry Smith *ierr = PetscScalarView(*n,d,v); 13855fcb7f5SSatish Balay } 13955fcb7f5SSatish Balay 14055fcb7f5SSatish Balay EXTERN_C_END 141