1e54e4138SSatish Balay #include "zpetsc.h" 2e54e4138SSatish Balay #include "petscpc.h" 3e54e4138SSatish Balay #include "petscmg.h" 4e54e4138SSatish Balay 5e54e4138SSatish Balay #if defined(PETSC_HAVE_FORTRAN_CAPS) 6e54e4138SSatish Balay #define pcmgsetresidual_ PCMGSETRESIDUAL 7e54e4138SSatish Balay #define pcmgdefaultresidual_ PCMGDEFAULTRESIDUAL 8e54e4138SSatish Balay #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE) 9e54e4138SSatish Balay #define pcmgsetresidual_ pcmgsetresidual 10e54e4138SSatish Balay #define pcmgdefaultresidual_ pcmgdefaultresidual 11e54e4138SSatish Balay #endif 12e54e4138SSatish Balay 13e54e4138SSatish Balay typedef PetscErrorCode (*MVVVV)(Mat,Vec,Vec,Vec); 14e54e4138SSatish Balay static PetscErrorCode ourresidualfunction(Mat mat,Vec b,Vec x,Vec R) 15e54e4138SSatish Balay { 16e54e4138SSatish Balay PetscErrorCode ierr = 0; 17e54e4138SSatish Balay (*(void (PETSC_STDCALL *)(Mat*,Vec*,Vec*,Vec*,PetscErrorCode*))(((PetscObject)mat)->fortran_func_pointers[0]))(&mat,&b,&x,&R,&ierr); 18e54e4138SSatish Balay return 0; 19e54e4138SSatish Balay } 20e54e4138SSatish Balay 21e54e4138SSatish Balay EXTERN_C_BEGIN 22*1f6cc5b2SSatish Balay void pcmgdefaultresidual_(Mat *mat,Vec *b,Vec *x,Vec *r, PetscErrorCode *ierr) 23*1f6cc5b2SSatish Balay { 24*1f6cc5b2SSatish Balay *ierr = PCMGDefaultResidual(*mat,*b,*x,*r); 25*1f6cc5b2SSatish Balay } 26e54e4138SSatish Balay 27e54e4138SSatish Balay void PETSC_STDCALL pcmgsetresidual_(PC *pc,PetscInt *l,PetscErrorCode (*residual)(Mat*,Vec*,Vec*,Vec*,PetscErrorCode*),Mat *mat, PetscErrorCode *ierr) 28e54e4138SSatish Balay { 29e54e4138SSatish Balay MVVVV rr; 30f68b968cSBarry Smith if ((PetscVoidFunction)residual == (PetscVoidFunction)pcmgdefaultresidual_) rr = PCMGDefaultResidual; 31e54e4138SSatish Balay else { 32e54e4138SSatish Balay if (!((PetscObject)*mat)->fortran_func_pointers) { 33e54e4138SSatish Balay *ierr = PetscMalloc(1*sizeof(void*),&((PetscObject)*mat)->fortran_func_pointers); 34e54e4138SSatish Balay } 35f68b968cSBarry Smith ((PetscObject)*mat)->fortran_func_pointers[0] = (PetscVoidFunction)residual; 36e54e4138SSatish Balay rr = ourresidualfunction; 37e54e4138SSatish Balay } 38e54e4138SSatish Balay *ierr = PCMGSetResidual(*pc,*l,rr,*mat); 39e54e4138SSatish Balay } 40e54e4138SSatish Balay 41e54e4138SSatish Balay EXTERN_C_END 42