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 2919caf8f3SSatish Balay static void (*f2)(MPI_Comm *comm,int*,const char*,const char*,PetscErrorCode*,PetscErrorType*,const char*,void*,PetscErrorCode*,PETSC_FORTRAN_CHARLEN_T len1,PETSC_FORTRAN_CHARLEN_T len2,PETSC_FORTRAN_CHARLEN_T 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 377bdf51c9SJed Brown PetscStrlen(fun,&len1); 387bdf51c9SJed Brown PetscStrlen(file,&len2); 397bdf51c9SJed Brown PetscStrlen(mess,&len3); 4055fcb7f5SSatish Balay 4119caf8f3SSatish Balay (*f2)(&comm,&line,fun,file,&n,&p,mess,ctx,&ierr,((PETSC_FORTRAN_CHARLEN_T)(len1)),((PETSC_FORTRAN_CHARLEN_T)(len2)),((PETSC_FORTRAN_CHARLEN_T)(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 */ 49efca3c55SSatish 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) 5055fcb7f5SSatish Balay { 51efca3c55SSatish Balay *ierr = PetscTraceBackErrorHandler(*comm,*line,fun,file,*n,*p,mess,ctx); 5255fcb7f5SSatish Balay } 5355fcb7f5SSatish Balay 54efca3c55SSatish 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) 5555fcb7f5SSatish Balay { 56efca3c55SSatish Balay *ierr = PetscAbortErrorHandler(*comm,*line,fun,file,*n,*p,mess,ctx); 5755fcb7f5SSatish Balay } 5855fcb7f5SSatish Balay 59efca3c55SSatish 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) 6055fcb7f5SSatish Balay { 61efca3c55SSatish Balay *ierr = PetscAttachDebuggerErrorHandler(*comm,*line,fun,file,*n,*p,mess,ctx); 6255fcb7f5SSatish Balay } 6355fcb7f5SSatish Balay 64efca3c55SSatish 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) 6555fcb7f5SSatish Balay { 66efca3c55SSatish Balay *ierr = PetscEmacsClientErrorHandler(*comm,*line,fun,file,*n,*p,mess,ctx); 6755fcb7f5SSatish Balay } 6855fcb7f5SSatish Balay 69efca3c55SSatish 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) 7055fcb7f5SSatish Balay { 71efca3c55SSatish Balay *ierr = PetscIgnoreErrorHandler(*comm,*line,fun,file,*n,*p,mess,ctx); 7255fcb7f5SSatish Balay } 7355fcb7f5SSatish Balay 7419caf8f3SSatish Balay PETSC_EXTERN void petscpusherrorhandler_(void (*handler)(MPI_Comm *comm,int*,const char*,const char*,PetscErrorCode*,PetscErrorType*,const char*,void*,PetscErrorCode*,PETSC_FORTRAN_CHARLEN_T len1,PETSC_FORTRAN_CHARLEN_T len2,PETSC_FORTRAN_CHARLEN_T len3),void *ctx,PetscErrorCode *ierr) 7555fcb7f5SSatish Balay { 76a297a907SKarl Rupp if ((void(*)(void))handler == (void(*)(void))petsctracebackerrorhandler_) *ierr = PetscPushErrorHandler(PetscTraceBackErrorHandler,0); 77a297a907SKarl Rupp else { 7855fcb7f5SSatish Balay f2 = handler; 7955fcb7f5SSatish Balay *ierr = PetscPushErrorHandler(ourerrorhandler,ctx); 8055fcb7f5SSatish Balay } 8155fcb7f5SSatish Balay } 8255fcb7f5SSatish Balay 8319caf8f3SSatish Balay PETSC_EXTERN void petscerror_(MPI_Fint *comm,PetscErrorCode *number,PetscErrorType *p,char* message,PETSC_FORTRAN_CHARLEN_T len) 8455fcb7f5SSatish Balay { 85e3081792SBarry Smith PetscErrorCode nierr,*ierr = &nierr; 8655fcb7f5SSatish Balay char *t1; 8755fcb7f5SSatish Balay FIXCHAR(message,len,t1); 88*3ca90d2dSJacob Faibussowitsch nierr = PetscError(MPI_Comm_f2c(*(comm)),0,NULL,NULL,*number,*p,"%s",t1); 8955fcb7f5SSatish Balay FREECHAR(message,t1); 9055fcb7f5SSatish Balay } 9155fcb7f5SSatish Balay 92bfe649d8SSatish Balay /* helper routine for CHKERRQ and CHKERRABORT macros on the fortran side */ 9319caf8f3SSatish Balay PETSC_EXTERN void petscerrorf_(PetscErrorCode *number) 94bfe649d8SSatish Balay { 95bfe649d8SSatish Balay PetscError(PETSC_COMM_SELF,0,NULL,NULL,*number,PETSC_ERROR_REPEAT,NULL); 96bfe649d8SSatish Balay } 97bfe649d8SSatish Balay 9819caf8f3SSatish Balay PETSC_EXTERN void petscrealview_(PetscInt *n,PetscReal *d,PetscViewer *viwer,PetscErrorCode *ierr) 9955fcb7f5SSatish Balay { 10016bf3c38SBarry Smith PetscViewer v; 10116bf3c38SBarry Smith PetscPatchDefaultViewers_Fortran(viwer,v); 10216bf3c38SBarry Smith *ierr = PetscRealView(*n,d,v); 10355fcb7f5SSatish Balay } 10455fcb7f5SSatish Balay 10519caf8f3SSatish Balay PETSC_EXTERN void petscintview_(PetscInt *n,PetscInt *d,PetscViewer *viwer,PetscErrorCode *ierr) 10655fcb7f5SSatish Balay { 10716bf3c38SBarry Smith PetscViewer v; 10816bf3c38SBarry Smith PetscPatchDefaultViewers_Fortran(viwer,v); 10916bf3c38SBarry Smith *ierr = PetscIntView(*n,d,v); 11016bf3c38SBarry Smith } 11116bf3c38SBarry Smith 11216bf3c38SBarry Smith #if defined(PETSC_HAVE_FORTRAN_CAPS) 11316bf3c38SBarry Smith #define petscscalarview_ PETSCSCALARVIEW 11416bf3c38SBarry Smith #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE) 11516bf3c38SBarry Smith #define petscscalarview_ petscscalarview 11616bf3c38SBarry Smith #endif 11716bf3c38SBarry Smith 11819caf8f3SSatish Balay PETSC_EXTERN void petscscalarview_(PetscInt *n,PetscScalar *d,PetscViewer *viwer,PetscErrorCode *ierr) 11916bf3c38SBarry Smith { 12016bf3c38SBarry Smith PetscViewer v; 12116bf3c38SBarry Smith PetscPatchDefaultViewers_Fortran(viwer,v); 12216bf3c38SBarry Smith *ierr = PetscScalarView(*n,d,v); 12355fcb7f5SSatish Balay } 124