xref: /petsc/src/ksp/pc/impls/mg/ftn-custom/zmgfuncf.c (revision 1f6cc5b2a846dea79a785bf5d9c3705a05a876f0)
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