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 14*49c86fc7SBarry Smith #define petscerrormpi_ PETSCERRORMPI 1555fcb7f5SSatish Balay #define petscrealview_ PETSCREALVIEW 1655fcb7f5SSatish Balay #define petscintview_ PETSCINTVIEW 1755fcb7f5SSatish Balay #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE) 1855fcb7f5SSatish Balay #define petscpusherrorhandler_ petscpusherrorhandler 1955fcb7f5SSatish Balay #define petsctracebackerrorhandler_ petsctracebackerrorhandler 2055fcb7f5SSatish Balay #define petscaborterrorhandler_ petscaborterrorhandler 2155fcb7f5SSatish Balay #define petscignoreerrorhandler_ petscignoreerrorhandler 2255fcb7f5SSatish Balay #define petscemacsclienterrorhandler_ petscemacsclienterrorhandler 2355fcb7f5SSatish Balay #define petscattachdebuggererrorhandler_ petscattachdebuggererrorhandler 2455fcb7f5SSatish Balay #define petscerror_ petscerror 25bfe649d8SSatish Balay #define petscerrorf_ petscerrorf 26*49c86fc7SBarry Smith #define petscerrormpi_ petscerrormpi 2755fcb7f5SSatish Balay #define petscrealview_ petscrealview 2855fcb7f5SSatish Balay #define petscintview_ petscintview 2955fcb7f5SSatish Balay #endif 3055fcb7f5SSatish Balay 3119caf8f3SSatish 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); 3255fcb7f5SSatish Balay 3355fcb7f5SSatish Balay /* These are not extern C because they are passed into non-extern C user level functions */ 34efca3c55SSatish Balay static PetscErrorCode ourerrorhandler(MPI_Comm comm,int line,const char *fun,const char *file,PetscErrorCode n,PetscErrorType p,const char *mess,void *ctx) 3555fcb7f5SSatish Balay { 3655fcb7f5SSatish Balay PetscErrorCode ierr = 0; 37efca3c55SSatish Balay size_t len1,len2,len3; 3855fcb7f5SSatish Balay 397bdf51c9SJed Brown PetscStrlen(fun,&len1); 407bdf51c9SJed Brown PetscStrlen(file,&len2); 417bdf51c9SJed Brown PetscStrlen(mess,&len3); 4255fcb7f5SSatish Balay 4319caf8f3SSatish 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))); 4455fcb7f5SSatish Balay return ierr; 4555fcb7f5SSatish Balay } 4655fcb7f5SSatish Balay 4755fcb7f5SSatish Balay /* 4855fcb7f5SSatish Balay These are not usually called from Fortran but allow Fortran users 4955fcb7f5SSatish Balay to transparently set these monitors from .F code 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 7619caf8f3SSatish 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) 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 8519caf8f3SSatish Balay PETSC_EXTERN void petscerror_(MPI_Fint *comm,PetscErrorCode *number,PetscErrorType *p,char* message,PETSC_FORTRAN_CHARLEN_T len) 8655fcb7f5SSatish Balay { 87e3081792SBarry Smith PetscErrorCode nierr,*ierr = &nierr; 8855fcb7f5SSatish Balay char *t1; 8955fcb7f5SSatish Balay FIXCHAR(message,len,t1); 903ca90d2dSJacob Faibussowitsch nierr = PetscError(MPI_Comm_f2c(*(comm)),0,NULL,NULL,*number,*p,"%s",t1); 9155fcb7f5SSatish Balay FREECHAR(message,t1); 9255fcb7f5SSatish Balay } 9355fcb7f5SSatish Balay 94*49c86fc7SBarry Smith #if defined(PETSC_HAVE_FORTRAN_FREE_LINE_LENGTH_NONE) 95*49c86fc7SBarry Smith PETSC_EXTERN void petscerrorf_(PetscErrorCode *err,int *line,char *file,PETSC_FORTRAN_CHARLEN_T len) 96bfe649d8SSatish Balay { 97*49c86fc7SBarry Smith char *tfile; 98*49c86fc7SBarry Smith PetscErrorCode derr,*ierr = &derr; /* needed by FIXCHAR */ 99*49c86fc7SBarry Smith 100*49c86fc7SBarry Smith FIXCHAR(file,len,tfile); 101*49c86fc7SBarry Smith PetscError(PETSC_COMM_SELF,*line,NULL,tfile,*err,PETSC_ERROR_REPEAT,NULL); 102*49c86fc7SBarry Smith FREECHAR(file,tfile); 103bfe649d8SSatish Balay } 104bfe649d8SSatish Balay 105*49c86fc7SBarry Smith PETSC_EXTERN void petscerrormpi_(PetscErrorCode *err,int *line,char *file,PETSC_FORTRAN_CHARLEN_T len) 106*49c86fc7SBarry Smith { 107*49c86fc7SBarry Smith char errorstring[2*MPI_MAX_ERROR_STRING]; 108*49c86fc7SBarry Smith char *tfile; 109*49c86fc7SBarry Smith PetscErrorCode derr,*ierr = &derr; /* needed by FIXCHAR */ 110*49c86fc7SBarry Smith 111*49c86fc7SBarry Smith FIXCHAR(file,len,tfile); 112*49c86fc7SBarry Smith PetscMPIErrorString(*err,errorstring); 113*49c86fc7SBarry Smith PetscError(PETSC_COMM_SELF,*line,NULL,file,PETSC_ERR_MPI,PETSC_ERROR_INITIAL,"MPI error %d %s",*err,errorstring); 114*49c86fc7SBarry Smith FREECHAR(file,tfile); 115*49c86fc7SBarry Smith *err = PETSC_ERR_MPI; 116*49c86fc7SBarry Smith } 117*49c86fc7SBarry Smith #else 118*49c86fc7SBarry Smith PETSC_EXTERN void petscerrorf_(PetscErrorCode *err) 119*49c86fc7SBarry Smith { 120*49c86fc7SBarry Smith PetscError(PETSC_COMM_SELF,0,NULL,NULL,*err,PETSC_ERROR_REPEAT,NULL); 121*49c86fc7SBarry Smith } 122*49c86fc7SBarry Smith 123*49c86fc7SBarry Smith PETSC_EXTERN void petscerrormpi_(PetscErrorCode *err) 124*49c86fc7SBarry Smith { 125*49c86fc7SBarry Smith char errorstring[2*MPI_MAX_ERROR_STRING]; 126*49c86fc7SBarry Smith 127*49c86fc7SBarry Smith PetscMPIErrorString(*err,errorstring); 128*49c86fc7SBarry Smith PetscError(PETSC_COMM_SELF,0,NULL,NULL,PETSC_ERR_MPI,PETSC_ERROR_INITIAL,"MPI error %d %s",*err,errorstring); 129*49c86fc7SBarry Smith *err = PETSC_ERR_MPI; 130*49c86fc7SBarry Smith } 131*49c86fc7SBarry Smith #endif 132*49c86fc7SBarry Smith 13319caf8f3SSatish Balay PETSC_EXTERN void petscrealview_(PetscInt *n,PetscReal *d,PetscViewer *viwer,PetscErrorCode *ierr) 13455fcb7f5SSatish Balay { 13516bf3c38SBarry Smith PetscViewer v; 13616bf3c38SBarry Smith PetscPatchDefaultViewers_Fortran(viwer,v); 13716bf3c38SBarry Smith *ierr = PetscRealView(*n,d,v); 13855fcb7f5SSatish Balay } 13955fcb7f5SSatish Balay 14019caf8f3SSatish Balay PETSC_EXTERN void petscintview_(PetscInt *n,PetscInt *d,PetscViewer *viwer,PetscErrorCode *ierr) 14155fcb7f5SSatish Balay { 14216bf3c38SBarry Smith PetscViewer v; 14316bf3c38SBarry Smith PetscPatchDefaultViewers_Fortran(viwer,v); 14416bf3c38SBarry Smith *ierr = PetscIntView(*n,d,v); 14516bf3c38SBarry Smith } 14616bf3c38SBarry Smith 14716bf3c38SBarry Smith #if defined(PETSC_HAVE_FORTRAN_CAPS) 14816bf3c38SBarry Smith #define petscscalarview_ PETSCSCALARVIEW 14916bf3c38SBarry Smith #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE) 15016bf3c38SBarry Smith #define petscscalarview_ petscscalarview 15116bf3c38SBarry Smith #endif 15216bf3c38SBarry Smith 15319caf8f3SSatish Balay PETSC_EXTERN void petscscalarview_(PetscInt *n,PetscScalar *d,PetscViewer *viwer,PetscErrorCode *ierr) 15416bf3c38SBarry Smith { 15516bf3c38SBarry Smith PetscViewer v; 15616bf3c38SBarry Smith PetscPatchDefaultViewers_Fortran(viwer,v); 15716bf3c38SBarry Smith *ierr = PetscScalarView(*n,d,v); 15855fcb7f5SSatish Balay } 159