1*55fcb7f5SSatish Balay #include "zpetsc.h" 2*55fcb7f5SSatish Balay #include "petsc.h" 3*55fcb7f5SSatish Balay 4*55fcb7f5SSatish Balay #if defined(PETSC_HAVE_FORTRAN_CAPS) 5*55fcb7f5SSatish Balay #define petscpusherrorhandler_ PETSCPUSHERRORHANDLER 6*55fcb7f5SSatish Balay #define petsctracebackerrorhandler_ PETSCTRACEBACKERRORHANDLER 7*55fcb7f5SSatish Balay #define petscaborterrorhandler_ PETSCABORTERRORHANDLER 8*55fcb7f5SSatish Balay #define petscignoreerrorhandler_ PETSCIGNOREERRORHANDLER 9*55fcb7f5SSatish Balay #define petscemacsclienterrorhandler_ PETSCEMACSCLIENTERRORHANDLER 10*55fcb7f5SSatish Balay #define petscattachdebuggererrorhandler_ PETSCATTACHDEBUGGERERRORHANDLER 11*55fcb7f5SSatish Balay #define petscerror_ PETSCERROR 12*55fcb7f5SSatish Balay #define petscrealview_ PETSCREALVIEW 13*55fcb7f5SSatish Balay #define petscintview_ PETSCINTVIEW 14*55fcb7f5SSatish Balay #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE) 15*55fcb7f5SSatish Balay #define petscpusherrorhandler_ petscpusherrorhandler 16*55fcb7f5SSatish Balay #define petsctracebackerrorhandler_ petsctracebackerrorhandler 17*55fcb7f5SSatish Balay #define petscaborterrorhandler_ petscaborterrorhandler 18*55fcb7f5SSatish Balay #define petscignoreerrorhandler_ petscignoreerrorhandler 19*55fcb7f5SSatish Balay #define petscemacsclienterrorhandler_ petscemacsclienterrorhandler 20*55fcb7f5SSatish Balay #define petscattachdebuggererrorhandler_ petscattachdebuggererrorhandler 21*55fcb7f5SSatish Balay #define petscerror_ petscerror 22*55fcb7f5SSatish Balay #define petscrealview_ petscrealview 23*55fcb7f5SSatish Balay #define petscintview_ petscintview 24*55fcb7f5SSatish Balay #endif 25*55fcb7f5SSatish Balay 26*55fcb7f5SSatish Balay EXTERN_C_BEGIN 27*55fcb7f5SSatish 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)); 28*55fcb7f5SSatish Balay EXTERN_C_END 29*55fcb7f5SSatish Balay 30*55fcb7f5SSatish Balay /* These are not extern C because they are passed into non-extern C user level functions */ 31*55fcb7f5SSatish Balay static PetscErrorCode ourerrorhandler(int line,const char *fun,const char *file,const char *dir,int n,int p,const char *mess,void *ctx) 32*55fcb7f5SSatish Balay { 33*55fcb7f5SSatish Balay PetscErrorCode ierr = 0; 34*55fcb7f5SSatish Balay size_t len1,len2,len3,len4; 35*55fcb7f5SSatish Balay int l1,l2,l3,l4; 36*55fcb7f5SSatish Balay 37*55fcb7f5SSatish Balay PetscStrlen(fun,&len1); l1 = (int)len1; 38*55fcb7f5SSatish Balay PetscStrlen(file,&len2);l2 = (int)len2; 39*55fcb7f5SSatish Balay PetscStrlen(dir,&len3);l3 = (int)len3; 40*55fcb7f5SSatish Balay PetscStrlen(mess,&len4);l4 = (int)len4; 41*55fcb7f5SSatish Balay 42*55fcb7f5SSatish Balay #if defined(PETSC_USES_CPTOFCD) 43*55fcb7f5SSatish Balay { 44*55fcb7f5SSatish Balay CHAR fun_c,file_c,dir_c,mess_c; 45*55fcb7f5SSatish Balay 46*55fcb7f5SSatish Balay fun_c = _cptofcd(fun,len1); 47*55fcb7f5SSatish Balay file_c = _cptofcd(file,len2); 48*55fcb7f5SSatish Balay dir_c = _cptofcd(dir,len3); 49*55fcb7f5SSatish Balay mess_c = _cptofcd(mess,len4); 50*55fcb7f5SSatish Balay (*f2)(&line,fun_c,file_c,dir_c,&n,&p,mess_c,ctx,&ierr,len1,len2,len3,len4); 51*55fcb7f5SSatish Balay 52*55fcb7f5SSatish Balay } 53*55fcb7f5SSatish Balay #elif defined(PETSC_HAVE_FORTRAN_MIXED_STR_ARG) 54*55fcb7f5SSatish Balay (*f2)(&line,fun,l1,file,l2,dir,l3,&n,&p,mess,l4,ctx,&ierr); 55*55fcb7f5SSatish Balay #else 56*55fcb7f5SSatish Balay (*f2)(&line,fun,file,dir,&n,&p,mess,ctx,&ierr,l1,l2,l3,l4); 57*55fcb7f5SSatish Balay #endif 58*55fcb7f5SSatish Balay return ierr; 59*55fcb7f5SSatish Balay } 60*55fcb7f5SSatish Balay 61*55fcb7f5SSatish Balay EXTERN_C_BEGIN 62*55fcb7f5SSatish Balay 63*55fcb7f5SSatish Balay /* 64*55fcb7f5SSatish Balay These are not usually called from Fortran but allow Fortran users 65*55fcb7f5SSatish Balay to transparently set these monitors from .F code 66*55fcb7f5SSatish Balay 67*55fcb7f5SSatish Balay functions, hence no STDCALL 68*55fcb7f5SSatish Balay */ 69*55fcb7f5SSatish 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) 70*55fcb7f5SSatish Balay { 71*55fcb7f5SSatish Balay *ierr = PetscTraceBackErrorHandler(*line,fun,file,dir,*n,*p,mess,ctx); 72*55fcb7f5SSatish Balay } 73*55fcb7f5SSatish Balay 74*55fcb7f5SSatish 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) 75*55fcb7f5SSatish Balay { 76*55fcb7f5SSatish Balay *ierr = PetscAbortErrorHandler(*line,fun,file,dir,*n,*p,mess,ctx); 77*55fcb7f5SSatish Balay } 78*55fcb7f5SSatish Balay 79*55fcb7f5SSatish 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) 80*55fcb7f5SSatish Balay { 81*55fcb7f5SSatish Balay *ierr = PetscAttachDebuggerErrorHandler(*line,fun,file,dir,*n,*p,mess,ctx); 82*55fcb7f5SSatish Balay } 83*55fcb7f5SSatish Balay 84*55fcb7f5SSatish 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) 85*55fcb7f5SSatish Balay { 86*55fcb7f5SSatish Balay *ierr = PetscEmacsClientErrorHandler(*line,fun,file,dir,*n,*p,mess,ctx); 87*55fcb7f5SSatish Balay } 88*55fcb7f5SSatish Balay 89*55fcb7f5SSatish 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) 90*55fcb7f5SSatish Balay { 91*55fcb7f5SSatish Balay *ierr = PetscIgnoreErrorHandler(*line,fun,file,dir,*n,*p,mess,ctx); 92*55fcb7f5SSatish Balay } 93*55fcb7f5SSatish Balay 94*55fcb7f5SSatish 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) 95*55fcb7f5SSatish Balay { 96*55fcb7f5SSatish Balay if ((void(*)(void))handler == (void(*)(void))petsctracebackerrorhandler_) { 97*55fcb7f5SSatish Balay *ierr = PetscPushErrorHandler(PetscTraceBackErrorHandler,0); 98*55fcb7f5SSatish Balay } else { 99*55fcb7f5SSatish Balay f2 = handler; 100*55fcb7f5SSatish Balay *ierr = PetscPushErrorHandler(ourerrorhandler,ctx); 101*55fcb7f5SSatish Balay } 102*55fcb7f5SSatish Balay } 103*55fcb7f5SSatish Balay 104*55fcb7f5SSatish Balay void PETSC_STDCALL petscerror_(int *number,int *p,CHAR message PETSC_MIXED_LEN(len), 105*55fcb7f5SSatish Balay PetscErrorCode *ierr PETSC_END_LEN(len)) 106*55fcb7f5SSatish Balay { 107*55fcb7f5SSatish Balay char *t1; 108*55fcb7f5SSatish Balay FIXCHAR(message,len,t1); 109*55fcb7f5SSatish Balay *ierr = PetscError(-1,0,0,0,*number,*p,t1); 110*55fcb7f5SSatish Balay FREECHAR(message,t1); 111*55fcb7f5SSatish Balay } 112*55fcb7f5SSatish Balay 113*55fcb7f5SSatish Balay void PETSC_STDCALL petscrealview_(PetscInt *n,PetscReal *d,int *viwer,PetscErrorCode *ierr) 114*55fcb7f5SSatish Balay { 115*55fcb7f5SSatish Balay *ierr = PetscRealView(*n,d,0); 116*55fcb7f5SSatish Balay } 117*55fcb7f5SSatish Balay 118*55fcb7f5SSatish Balay void PETSC_STDCALL petscintview_(PetscInt *n,PetscInt *d,int *viwer,PetscErrorCode *ierr) 119*55fcb7f5SSatish Balay { 120*55fcb7f5SSatish Balay *ierr = PetscIntView(*n,d,0); 121*55fcb7f5SSatish Balay } 122*55fcb7f5SSatish Balay 123*55fcb7f5SSatish Balay EXTERN_C_END 124