xref: /petsc/src/dm/impls/shell/ftn-custom/zdmshellf.c (revision f2d7aa870b98298f7acd7caf9ddaccf42b86b3f8)
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_
7dc43b69eSJed Brown #define dmshellsetcreatelocalvector_           DMSHELLSETCREATELOCALVECTOR_
8*f2d7aa87SRichard Tran Mills #define dmshellsetglobaltolocal_               DMSHELLSETGLOBALTOLOCAL_
9*f2d7aa87SRichard Tran Mills #define dmshellsetlocaltoglobal_               DMSHELLSETLOCALTOGLOBAL_
100ec63f53SRichard Tran Mills #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE)
110ec63f53SRichard Tran Mills #define dmshellsetcreatematrix_                dmshellsetcreatematrix
120ec63f53SRichard Tran Mills #define dmshellsetcreateglobalvector_          dmshellsetcreateglobalvector
13dc43b69eSJed Brown #define dmshellsetcreatelocalvector_           dmshellsetcreatelocalvector
14*f2d7aa87SRichard Tran Mills #define dmshellsetglobaltolocal_               dmshellsetglobaltolocal
15*f2d7aa87SRichard Tran Mills #define dmshellsetlocaltoglobal_               dmshellsetlocaltoglobal
160ec63f53SRichard Tran Mills #endif
170ec63f53SRichard Tran Mills 
180ec63f53SRichard Tran Mills /*
19dc43b69eSJed Brown  * C routines are required for matrix and global vector creation.  We define C routines here that call the corresponding
20dc43b69eSJed Brown  * Fortran routine (indexed by _cb) that was set by the user.
210ec63f53SRichard Tran Mills  */
220ec63f53SRichard Tran Mills 
23dc43b69eSJed Brown static struct {
24dc43b69eSJed Brown   PetscFortranCallbackId creatematrix;
25dc43b69eSJed Brown   PetscFortranCallbackId createglobalvector;
26dc43b69eSJed Brown   PetscFortranCallbackId createlocalvector;
27*f2d7aa87SRichard Tran Mills   PetscFortranCallbackId globaltolocalbegin;
28*f2d7aa87SRichard Tran Mills   PetscFortranCallbackId globaltolocalend;
29*f2d7aa87SRichard Tran Mills   PetscFortranCallbackId localtoglobalbegin;
30*f2d7aa87SRichard Tran Mills   PetscFortranCallbackId localtoglobalend;
31dc43b69eSJed Brown } _cb;
32dc43b69eSJed Brown 
33de64c4c2SJed Brown #undef __FUNCT__
34de64c4c2SJed Brown #define __FUNCT__ "ourcreatematrix"
350ec63f53SRichard Tran Mills static PetscErrorCode ourcreatematrix(DM dm,MatType type,Mat *A)
360ec63f53SRichard Tran Mills {
37dc43b69eSJed Brown   int  len;
38dc43b69eSJed Brown   char *ftype = (char*)type;
39dc43b69eSJed Brown   if (type) {
40dc43b69eSJed Brown     size_t slen;
41dc43b69eSJed Brown     PetscStrlen(type,&slen);
42dc43b69eSJed Brown     len = (int)slen;
43dc43b69eSJed Brown   } else {
44dc43b69eSJed Brown     type = PETSC_NULL_CHARACTER_Fortran;
45dc43b69eSJed Brown     len  = 0;
46dc43b69eSJed Brown   }
47f83b4887SSatish Balay   PetscObjectUseFortranCallback(dm,_cb.creatematrix,(DM*,CHAR PETSC_MIXED_LEN_PROTO,Mat*,PetscErrorCode* PETSC_END_LEN_PROTO),
48dc43b69eSJed Brown                                 (&dm,ftype PETSC_MIXED_LEN_CALL(len),A,&ierr PETSC_END_LEN_CALL(len)));
49dc43b69eSJed Brown   return 0;
500ec63f53SRichard Tran Mills }
510ec63f53SRichard Tran Mills 
52de64c4c2SJed Brown #undef __FUNCT__
53de64c4c2SJed Brown #define __FUNCT__ "ourcreateglobalvector"
540ec63f53SRichard Tran Mills static PetscErrorCode ourcreateglobalvector(DM dm,Vec *v)
550ec63f53SRichard Tran Mills {
56dc43b69eSJed Brown   PetscObjectUseFortranCallback(dm,_cb.createglobalvector,(DM*,Vec*,PetscErrorCode*),(&dm,v,&ierr));
57dc43b69eSJed Brown   return 0;
580ec63f53SRichard Tran Mills }
590ec63f53SRichard Tran Mills 
60de64c4c2SJed Brown #undef __FUNCT__
61de64c4c2SJed Brown #define __FUNCT__ "ourcreatelocalvector"
62dc43b69eSJed Brown static PetscErrorCode ourcreatelocalvector(DM dm,Vec *v)
630ec63f53SRichard Tran Mills {
64dc43b69eSJed Brown   PetscObjectUseFortranCallback(dm,_cb.createlocalvector,(DM*,Vec*,PetscErrorCode*),(&dm,v,&ierr));
65dc43b69eSJed Brown   return 0;
66dc43b69eSJed Brown }
67dc43b69eSJed Brown 
68*f2d7aa87SRichard Tran Mills #undef __FUNCT__
69*f2d7aa87SRichard Tran Mills #define __FUNCT__ "ourglobaltolocalbegin"
70*f2d7aa87SRichard Tran Mills static PetscErrorCode ourglobaltolocalbegin(DM dm,Vec g,InsertMode mode,Vec l)
71*f2d7aa87SRichard Tran Mills {
72*f2d7aa87SRichard Tran Mills   PetscObjectUseFortranCallback(dm,_cb.globaltolocalbegin,(DM*,Vec*,InsertMode*,Vec*,PetscErrorCode*),(&dm,g,&mode,l,&ierr));
73*f2d7aa87SRichard Tran Mills   return 0;
74*f2d7aa87SRichard Tran Mills }
75*f2d7aa87SRichard Tran Mills 
76*f2d7aa87SRichard Tran Mills #undef __FUNCT__
77*f2d7aa87SRichard Tran Mills #define __FUNCT__ "ourglobaltolocalend"
78*f2d7aa87SRichard Tran Mills static PetscErrorCode ourglobaltolocalend(DM dm,Vec g,InsertMode mode,Vec l)
79*f2d7aa87SRichard Tran Mills {
80*f2d7aa87SRichard Tran Mills   PetscObjectUseFortranCallback(dm,_cb.globaltolocalend,(DM*,Vec*,InsertMode*,Vec*,PetscErrorCode*),(&dm,g,&mode,l,&ierr));
81*f2d7aa87SRichard Tran Mills   return 0;
82*f2d7aa87SRichard Tran Mills }
83*f2d7aa87SRichard Tran Mills 
84*f2d7aa87SRichard Tran Mills #undef __FUNCT__
85*f2d7aa87SRichard Tran Mills #define __FUNCT__ "ourlocaltoglobalbegin"
86*f2d7aa87SRichard Tran Mills static PetscErrorCode ourlocaltoglobalbegin(DM dm,Vec l,InsertMode mode,Vec g)
87*f2d7aa87SRichard Tran Mills {
88*f2d7aa87SRichard Tran Mills   PetscObjectUseFortranCallback(dm,_cb.localtoglobalbegin,(DM*,Vec*,InsertMode*,Vec*,PetscErrorCode*),(&dm,l,&mode,g,&ierr));
89*f2d7aa87SRichard Tran Mills   return 0;
90*f2d7aa87SRichard Tran Mills }
91*f2d7aa87SRichard Tran Mills 
92*f2d7aa87SRichard Tran Mills #undef __FUNCT__
93*f2d7aa87SRichard Tran Mills #define __FUNCT__ "ourlocaltoglobalend"
94*f2d7aa87SRichard Tran Mills static PetscErrorCode ourlocaltoglobalend(DM dm,Vec l,InsertMode mode,Vec g)
95*f2d7aa87SRichard Tran Mills {
96*f2d7aa87SRichard Tran Mills   PetscObjectUseFortranCallback(dm,_cb.localtoglobalend,(DM*,Vec*,InsertMode*,Vec*,PetscErrorCode*),(&dm,l,&mode,g,&ierr));
97*f2d7aa87SRichard Tran Mills   return 0;
98*f2d7aa87SRichard Tran Mills }
99*f2d7aa87SRichard Tran Mills 
100dc43b69eSJed Brown PETSC_EXTERN_C void PETSC_STDCALL dmshellsetcreatematrix_(DM *dm,void (PETSC_STDCALL *func)(DM*,CHAR type PETSC_MIXED_LEN(len),Mat*,PetscErrorCode* PETSC_END_LEN(len)),PetscErrorCode *ierr)
101dc43b69eSJed Brown {
1020298fd71SBarry Smith   *ierr = PetscObjectSetFortranCallback((PetscObject)*dm,PETSC_FORTRAN_CALLBACK_SUBTYPE,&_cb.creatematrix,(PetscVoidFunction)func,NULL);
103dc43b69eSJed Brown   if (*ierr) return;
1040ec63f53SRichard Tran Mills   *ierr = DMShellSetCreateMatrix(*dm,ourcreatematrix);
1050ec63f53SRichard Tran Mills }
1060ec63f53SRichard Tran Mills 
107dc43b69eSJed Brown PETSC_EXTERN_C void PETSC_STDCALL dmshellsetcreateglobalvector_(DM *dm,void (PETSC_STDCALL *func)(DM*,Vec*,PetscErrorCode*),PetscErrorCode *ierr)
1080ec63f53SRichard Tran Mills {
1090298fd71SBarry Smith   *ierr = PetscObjectSetFortranCallback((PetscObject)*dm,PETSC_FORTRAN_CALLBACK_SUBTYPE,&_cb.createglobalvector,(PetscVoidFunction)func,NULL);
110dc43b69eSJed Brown   if (*ierr) return;
1110ec63f53SRichard Tran Mills   *ierr = DMShellSetCreateGlobalVector(*dm,ourcreateglobalvector);
1120ec63f53SRichard Tran Mills }
113fa59e805SSatish Balay 
114dc43b69eSJed Brown PETSC_EXTERN_C void PETSC_STDCALL dmshellsetcreatelocalvector_(DM *dm,void (PETSC_STDCALL *func)(DM*,Vec*,PetscErrorCode*),PetscErrorCode *ierr)
115dc43b69eSJed Brown {
1160298fd71SBarry Smith   *ierr = PetscObjectSetFortranCallback((PetscObject)*dm,PETSC_FORTRAN_CALLBACK_SUBTYPE,&_cb.createlocalvector,(PetscVoidFunction)func,NULL);
117dc43b69eSJed Brown   if (*ierr) return;
118dc43b69eSJed Brown   *ierr = DMShellSetCreateLocalVector(*dm,ourcreatelocalvector);
119dc43b69eSJed Brown }
120*f2d7aa87SRichard Tran Mills 
121*f2d7aa87SRichard Tran Mills PETSC_EXTERN_C void PETSC_STDCALL dmshellsetglobaltolocal_(DM *dm,void (PETSC_STDCALL *begin)(DM*,Vec*,InsertMode*,Vec*,PetscErrorCode*),void (PETSC_STDCALL *end)(DM*,Vec*,InsertMode*,Vec*,PetscErrorCode*),PetscErrorCode *ierr)
122*f2d7aa87SRichard Tran Mills {
123*f2d7aa87SRichard Tran Mills   *ierr = PetscObjectSetFortranCallback((PetscObject)*dm,PETSC_FORTRAN_CALLBACK_SUBTYPE,&_cb.globaltolocalbegin,(PetscVoidFunction)begin,NULL);
124*f2d7aa87SRichard Tran Mills   if (*ierr) return;
125*f2d7aa87SRichard Tran Mills   *ierr = PetscObjectSetFortranCallback((PetscObject)*dm,PETSC_FORTRAN_CALLBACK_SUBTYPE,&_cb.globaltolocalend,(PetscVoidFunction)end,NULL);
126*f2d7aa87SRichard Tran Mills   if (*ierr) return;
127*f2d7aa87SRichard Tran Mills   *ierr = DMShellSetGlobalToLocal(*dm,ourglobaltolocalbegin,ourglobaltolocalend);
128*f2d7aa87SRichard Tran Mills }
129*f2d7aa87SRichard Tran Mills 
130*f2d7aa87SRichard Tran Mills PETSC_EXTERN_C void PETSC_STDCALL dmshellsetlocaltoglobal_(DM *dm,void (PETSC_STDCALL *begin)(DM*,Vec*,InsertMode*,Vec*,PetscErrorCode*),void (PETSC_STDCALL *end)(DM*,Vec*,InsertMode*,Vec*,PetscErrorCode*),PetscErrorCode *ierr)
131*f2d7aa87SRichard Tran Mills {
132*f2d7aa87SRichard Tran Mills   *ierr = PetscObjectSetFortranCallback((PetscObject)*dm,PETSC_FORTRAN_CALLBACK_SUBTYPE,&_cb.localtoglobalbegin,(PetscVoidFunction)begin,NULL);
133*f2d7aa87SRichard Tran Mills   if (*ierr) return;
134*f2d7aa87SRichard Tran Mills   *ierr = PetscObjectSetFortranCallback((PetscObject)*dm,PETSC_FORTRAN_CALLBACK_SUBTYPE,&_cb.localtoglobalend,(PetscVoidFunction)end,NULL);
135*f2d7aa87SRichard Tran Mills   if (*ierr) return;
136*f2d7aa87SRichard Tran Mills   *ierr = DMShellSetLocalToGlobal(*dm,ourglobaltolocalbegin,ourglobaltolocalend);
137*f2d7aa87SRichard Tran Mills }
138