xref: /petsc/src/dm/impls/shell/ftn-custom/zdmshellf.c (revision fa59e80594ae4f5b96fb1a0d88f82abc4bbaec69)
10ec63f53SRichard Tran Mills #include <petsc-private/fortranimpl.h>
20ec63f53SRichard Tran Mills #include <petscdmshell.h>       /*I    "petscdmshell.h"  I*/
30ec63f53SRichard Tran Mills 
40ec63f53SRichard Tran Mills #if defined(PETSC_HAVE_FORTRAN_CAPS)
50ec63f53SRichard Tran Mills #define dmshellsetcreatematrix_                DMSHELLSETCREATEMATRIX
60ec63f53SRichard Tran Mills #define dmshellsetcreateglobalvector_          DMSHELLSETCREATEGLOBALVECTOR_
70ec63f53SRichard Tran Mills #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE)
80ec63f53SRichard Tran Mills #define dmshellsetcreatematrix_                dmshellsetcreatematrix
90ec63f53SRichard Tran Mills #define dmshellsetcreateglobalvector_          dmshellsetcreateglobalvector
100ec63f53SRichard Tran Mills #endif
110ec63f53SRichard Tran Mills 
120ec63f53SRichard Tran Mills /*
130ec63f53SRichard Tran Mills C routines are required for matrix and global vector creation.
140ec63f53SRichard Tran Mills We define C routines here that call the corresponding Fortran routine (stashed
150ec63f53SRichard Tran Mills in dm->fortran_func_pointers) that was set by the user.
160ec63f53SRichard Tran Mills 
170ec63f53SRichard Tran Mills dm->fortran_func_pointers usage:
180ec63f53SRichard Tran Mills 
190ec63f53SRichard Tran Mills 0: ourcreatematrix
200ec63f53SRichard Tran Mills 1: ourcreateglobalvector
210ec63f53SRichard Tran Mills */
220ec63f53SRichard Tran Mills 
230ec63f53SRichard Tran Mills static PetscErrorCode ourcreatematrix(DM dm,MatType type,Mat *A)
240ec63f53SRichard Tran Mills {
250ec63f53SRichard Tran Mills   PetscErrorCode ierr = 0;
260ec63f53SRichard Tran Mills   (*(PetscErrorCode (PETSC_STDCALL *)(DM*,MatType*,Mat*,PetscErrorCode*))(((PetscObject)dm)->fortran_func_pointers[0]))(&dm,&type,A,&ierr);
270ec63f53SRichard Tran Mills   return ierr;
280ec63f53SRichard Tran Mills }
290ec63f53SRichard Tran Mills 
300ec63f53SRichard Tran Mills static PetscErrorCode ourcreateglobalvector(DM dm,Vec *v)
310ec63f53SRichard Tran Mills {
320ec63f53SRichard Tran Mills   PetscErrorCode ierr = 0;
330ec63f53SRichard Tran Mills   (*(PetscErrorCode (PETSC_STDCALL *)(DM*,Vec*,PetscErrorCode*))(((PetscObject)dm)->fortran_func_pointers[1]))(&dm,v,&ierr);
340ec63f53SRichard Tran Mills   return ierr;
350ec63f53SRichard Tran Mills }
360ec63f53SRichard Tran Mills 
370ec63f53SRichard Tran Mills EXTERN_C_BEGIN
380ec63f53SRichard Tran Mills 
390ec63f53SRichard Tran Mills void PETSC_STDCALL dmshellsetcreatematrix_(DM *dm,void (PETSC_STDCALL *func)(DM*,MatType*,Mat*,PetscErrorCode*),PetscErrorCode *ierr)
400ec63f53SRichard Tran Mills {
410ec63f53SRichard Tran Mills   PetscObjectAllocateFortranPointers(*dm,2);
420ec63f53SRichard Tran Mills   ((PetscObject)*dm)->fortran_func_pointers[0] = (PetscVoidFunction) func;
430ec63f53SRichard Tran Mills   *ierr = DMShellSetCreateMatrix(*dm,ourcreatematrix);
440ec63f53SRichard Tran Mills }
450ec63f53SRichard Tran Mills 
460ec63f53SRichard Tran Mills void PETSC_STDCALL dmshellsetcreateglobalvector_(DM *dm,void (PETSC_STDCALL *func)(DM*,Vec*,PetscErrorCode*),PetscErrorCode *ierr)
470ec63f53SRichard Tran Mills {
480ec63f53SRichard Tran Mills   PetscObjectAllocateFortranPointers(*dm,2);
490ec63f53SRichard Tran Mills   ((PetscObject)*dm)->fortran_func_pointers[1] = (PetscVoidFunction) func;
500ec63f53SRichard Tran Mills   *ierr = DMShellSetCreateGlobalVector(*dm,ourcreateglobalvector);
510ec63f53SRichard Tran Mills }
52*fa59e805SSatish Balay 
53*fa59e805SSatish Balay EXTERN_C_END
54