xref: /petsc/src/dm/impls/shell/ftn-custom/zdmshellf.c (revision f3db62a7c89101861334f5d9a1ebf8b898c6dde5)
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_
8f2d7aa87SRichard Tran Mills #define dmshellsetglobaltolocal_               DMSHELLSETGLOBALTOLOCAL_
9f2d7aa87SRichard Tran Mills #define dmshellsetlocaltoglobal_               DMSHELLSETLOCALTOGLOBAL_
10*f3db62a7SRichard Tran Mills #define dmshellsetlocaltolocal_                DMSHELLSETLOCALTOLOCAL_
110ec63f53SRichard Tran Mills #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE)
120ec63f53SRichard Tran Mills #define dmshellsetcreatematrix_                dmshellsetcreatematrix
130ec63f53SRichard Tran Mills #define dmshellsetcreateglobalvector_          dmshellsetcreateglobalvector
14dc43b69eSJed Brown #define dmshellsetcreatelocalvector_           dmshellsetcreatelocalvector
15f2d7aa87SRichard Tran Mills #define dmshellsetglobaltolocal_               dmshellsetglobaltolocal
16f2d7aa87SRichard Tran Mills #define dmshellsetlocaltoglobal_               dmshellsetlocaltoglobal
17*f3db62a7SRichard Tran Mills #define dmshellsetlocaltolocal_                dmshellsetlocaltolocal_
180ec63f53SRichard Tran Mills #endif
190ec63f53SRichard Tran Mills 
200ec63f53SRichard Tran Mills /*
21dc43b69eSJed Brown  * C routines are required for matrix and global vector creation.  We define C routines here that call the corresponding
22dc43b69eSJed Brown  * Fortran routine (indexed by _cb) that was set by the user.
230ec63f53SRichard Tran Mills  */
240ec63f53SRichard Tran Mills 
25dc43b69eSJed Brown static struct {
26dc43b69eSJed Brown   PetscFortranCallbackId creatematrix;
27dc43b69eSJed Brown   PetscFortranCallbackId createglobalvector;
28dc43b69eSJed Brown   PetscFortranCallbackId createlocalvector;
29f2d7aa87SRichard Tran Mills   PetscFortranCallbackId globaltolocalbegin;
30f2d7aa87SRichard Tran Mills   PetscFortranCallbackId globaltolocalend;
31f2d7aa87SRichard Tran Mills   PetscFortranCallbackId localtoglobalbegin;
32f2d7aa87SRichard Tran Mills   PetscFortranCallbackId localtoglobalend;
33*f3db62a7SRichard Tran Mills   PetscFortranCallbackId localtolocalbegin;
34*f3db62a7SRichard Tran Mills   PetscFortranCallbackId localtolocalend;
35dc43b69eSJed Brown } _cb;
36dc43b69eSJed Brown 
37de64c4c2SJed Brown #undef __FUNCT__
38de64c4c2SJed Brown #define __FUNCT__ "ourcreatematrix"
390ec63f53SRichard Tran Mills static PetscErrorCode ourcreatematrix(DM dm,MatType type,Mat *A)
400ec63f53SRichard Tran Mills {
41dc43b69eSJed Brown   int  len;
42dc43b69eSJed Brown   char *ftype = (char*)type;
43dc43b69eSJed Brown   if (type) {
44dc43b69eSJed Brown     size_t slen;
45dc43b69eSJed Brown     PetscStrlen(type,&slen);
46dc43b69eSJed Brown     len = (int)slen;
47dc43b69eSJed Brown   } else {
48dc43b69eSJed Brown     type = PETSC_NULL_CHARACTER_Fortran;
49dc43b69eSJed Brown     len  = 0;
50dc43b69eSJed Brown   }
5117da0f0dSJed Brown   PetscObjectUseFortranCallbackSubType(dm,_cb.creatematrix,(DM*,CHAR PETSC_MIXED_LEN_PROTO,Mat*,PetscErrorCode* PETSC_END_LEN_PROTO),
52dc43b69eSJed Brown                                        (&dm,ftype PETSC_MIXED_LEN_CALL(len),A,&ierr PETSC_END_LEN_CALL(len)));
53dc43b69eSJed Brown   return 0;
540ec63f53SRichard Tran Mills }
550ec63f53SRichard Tran Mills 
56de64c4c2SJed Brown #undef __FUNCT__
57de64c4c2SJed Brown #define __FUNCT__ "ourcreateglobalvector"
580ec63f53SRichard Tran Mills static PetscErrorCode ourcreateglobalvector(DM dm,Vec *v)
590ec63f53SRichard Tran Mills {
6017da0f0dSJed Brown   PetscObjectUseFortranCallbackSubType(dm,_cb.createglobalvector,(DM*,Vec*,PetscErrorCode*),(&dm,v,&ierr));
61dc43b69eSJed Brown   return 0;
620ec63f53SRichard Tran Mills }
630ec63f53SRichard Tran Mills 
64de64c4c2SJed Brown #undef __FUNCT__
65de64c4c2SJed Brown #define __FUNCT__ "ourcreatelocalvector"
66dc43b69eSJed Brown static PetscErrorCode ourcreatelocalvector(DM dm,Vec *v)
670ec63f53SRichard Tran Mills {
6817da0f0dSJed Brown   PetscObjectUseFortranCallbackSubType(dm,_cb.createlocalvector,(DM*,Vec*,PetscErrorCode*),(&dm,v,&ierr));
69dc43b69eSJed Brown   return 0;
70dc43b69eSJed Brown }
71dc43b69eSJed Brown 
72f2d7aa87SRichard Tran Mills #undef __FUNCT__
73f2d7aa87SRichard Tran Mills #define __FUNCT__ "ourglobaltolocalbegin"
74f2d7aa87SRichard Tran Mills static PetscErrorCode ourglobaltolocalbegin(DM dm,Vec g,InsertMode mode,Vec l)
75f2d7aa87SRichard Tran Mills {
7617da0f0dSJed Brown   PetscObjectUseFortranCallbackSubType(dm,_cb.globaltolocalbegin,(DM*,Vec*,InsertMode*,Vec*,PetscErrorCode*),(&dm,&g,&mode,&l,&ierr));
77f2d7aa87SRichard Tran Mills   return 0;
78f2d7aa87SRichard Tran Mills }
79f2d7aa87SRichard Tran Mills 
80f2d7aa87SRichard Tran Mills #undef __FUNCT__
81f2d7aa87SRichard Tran Mills #define __FUNCT__ "ourglobaltolocalend"
82f2d7aa87SRichard Tran Mills static PetscErrorCode ourglobaltolocalend(DM dm,Vec g,InsertMode mode,Vec l)
83f2d7aa87SRichard Tran Mills {
8417da0f0dSJed Brown   PetscObjectUseFortranCallbackSubType(dm,_cb.globaltolocalend,(DM*,Vec*,InsertMode*,Vec*,PetscErrorCode*),(&dm,&g,&mode,&l,&ierr));
85f2d7aa87SRichard Tran Mills   return 0;
86f2d7aa87SRichard Tran Mills }
87f2d7aa87SRichard Tran Mills 
88f2d7aa87SRichard Tran Mills #undef __FUNCT__
89f2d7aa87SRichard Tran Mills #define __FUNCT__ "ourlocaltoglobalbegin"
90f2d7aa87SRichard Tran Mills static PetscErrorCode ourlocaltoglobalbegin(DM dm,Vec l,InsertMode mode,Vec g)
91f2d7aa87SRichard Tran Mills {
9217da0f0dSJed Brown   PetscObjectUseFortranCallbackSubType(dm,_cb.localtoglobalbegin,(DM*,Vec*,InsertMode*,Vec*,PetscErrorCode*),(&dm,&l,&mode,&g,&ierr));
93f2d7aa87SRichard Tran Mills   return 0;
94f2d7aa87SRichard Tran Mills }
95f2d7aa87SRichard Tran Mills 
96f2d7aa87SRichard Tran Mills #undef __FUNCT__
97f2d7aa87SRichard Tran Mills #define __FUNCT__ "ourlocaltoglobalend"
98f2d7aa87SRichard Tran Mills static PetscErrorCode ourlocaltoglobalend(DM dm,Vec l,InsertMode mode,Vec g)
99f2d7aa87SRichard Tran Mills {
10017da0f0dSJed Brown   PetscObjectUseFortranCallbackSubType(dm,_cb.localtoglobalend,(DM*,Vec*,InsertMode*,Vec*,PetscErrorCode*),(&dm,&l,&mode,&g,&ierr));
101f2d7aa87SRichard Tran Mills   return 0;
102f2d7aa87SRichard Tran Mills }
103f2d7aa87SRichard Tran Mills 
104*f3db62a7SRichard Tran Mills #undef __FUNCT__
105*f3db62a7SRichard Tran Mills #define __FUNCT__ "ourlocaltolocalbegin"
106*f3db62a7SRichard Tran Mills static PetscErrorCode ourlocaltolocalbegin(DM dm,Vec g,InsertMode mode,Vec l)
107*f3db62a7SRichard Tran Mills {
108*f3db62a7SRichard Tran Mills   PetscObjectUseFortranCallbackSubType(dm,_cb.localtolocalbegin,(DM*,Vec*,InsertMode*,Vec*,PetscErrorCode*),(&dm,&g,&mode,&l,&ierr));
109*f3db62a7SRichard Tran Mills   return 0;
110*f3db62a7SRichard Tran Mills }
111*f3db62a7SRichard Tran Mills 
112*f3db62a7SRichard Tran Mills #undef __FUNCT__
113*f3db62a7SRichard Tran Mills #define __FUNCT__ "ourlocaltolocalend"
114*f3db62a7SRichard Tran Mills static PetscErrorCode ourlocaltolocalend(DM dm,Vec g,InsertMode mode,Vec l)
115*f3db62a7SRichard Tran Mills {
116*f3db62a7SRichard Tran Mills   PetscObjectUseFortranCallbackSubType(dm,_cb.localtolocalend,(DM*,Vec*,InsertMode*,Vec*,PetscErrorCode*),(&dm,&g,&mode,&l,&ierr));
117*f3db62a7SRichard Tran Mills   return 0;
118*f3db62a7SRichard Tran Mills }
119*f3db62a7SRichard Tran Mills 
120*f3db62a7SRichard Tran Mills 
1218cc058d9SJed Brown PETSC_EXTERN 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)
122dc43b69eSJed Brown {
1230298fd71SBarry Smith   *ierr = PetscObjectSetFortranCallback((PetscObject)*dm,PETSC_FORTRAN_CALLBACK_SUBTYPE,&_cb.creatematrix,(PetscVoidFunction)func,NULL);
124dc43b69eSJed Brown   if (*ierr) return;
1250ec63f53SRichard Tran Mills   *ierr = DMShellSetCreateMatrix(*dm,ourcreatematrix);
1260ec63f53SRichard Tran Mills }
1270ec63f53SRichard Tran Mills 
1288cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL dmshellsetcreateglobalvector_(DM *dm,void (PETSC_STDCALL *func)(DM*,Vec*,PetscErrorCode*),PetscErrorCode *ierr)
1290ec63f53SRichard Tran Mills {
1300298fd71SBarry Smith   *ierr = PetscObjectSetFortranCallback((PetscObject)*dm,PETSC_FORTRAN_CALLBACK_SUBTYPE,&_cb.createglobalvector,(PetscVoidFunction)func,NULL);
131dc43b69eSJed Brown   if (*ierr) return;
1320ec63f53SRichard Tran Mills   *ierr = DMShellSetCreateGlobalVector(*dm,ourcreateglobalvector);
1330ec63f53SRichard Tran Mills }
134fa59e805SSatish Balay 
1358cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL dmshellsetcreatelocalvector_(DM *dm,void (PETSC_STDCALL *func)(DM*,Vec*,PetscErrorCode*),PetscErrorCode *ierr)
136dc43b69eSJed Brown {
1370298fd71SBarry Smith   *ierr = PetscObjectSetFortranCallback((PetscObject)*dm,PETSC_FORTRAN_CALLBACK_SUBTYPE,&_cb.createlocalvector,(PetscVoidFunction)func,NULL);
138dc43b69eSJed Brown   if (*ierr) return;
139dc43b69eSJed Brown   *ierr = DMShellSetCreateLocalVector(*dm,ourcreatelocalvector);
140dc43b69eSJed Brown }
141f2d7aa87SRichard Tran Mills 
1428cc058d9SJed Brown PETSC_EXTERN 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)
143f2d7aa87SRichard Tran Mills {
144f2d7aa87SRichard Tran Mills   *ierr = PetscObjectSetFortranCallback((PetscObject)*dm,PETSC_FORTRAN_CALLBACK_SUBTYPE,&_cb.globaltolocalbegin,(PetscVoidFunction)begin,NULL);
145f2d7aa87SRichard Tran Mills   if (*ierr) return;
146f2d7aa87SRichard Tran Mills   *ierr = PetscObjectSetFortranCallback((PetscObject)*dm,PETSC_FORTRAN_CALLBACK_SUBTYPE,&_cb.globaltolocalend,(PetscVoidFunction)end,NULL);
147f2d7aa87SRichard Tran Mills   if (*ierr) return;
148f2d7aa87SRichard Tran Mills   *ierr = DMShellSetGlobalToLocal(*dm,ourglobaltolocalbegin,ourglobaltolocalend);
149f2d7aa87SRichard Tran Mills }
150f2d7aa87SRichard Tran Mills 
1518cc058d9SJed Brown PETSC_EXTERN 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)
152f2d7aa87SRichard Tran Mills {
153f2d7aa87SRichard Tran Mills   *ierr = PetscObjectSetFortranCallback((PetscObject)*dm,PETSC_FORTRAN_CALLBACK_SUBTYPE,&_cb.localtoglobalbegin,(PetscVoidFunction)begin,NULL);
154f2d7aa87SRichard Tran Mills   if (*ierr) return;
155f2d7aa87SRichard Tran Mills   *ierr = PetscObjectSetFortranCallback((PetscObject)*dm,PETSC_FORTRAN_CALLBACK_SUBTYPE,&_cb.localtoglobalend,(PetscVoidFunction)end,NULL);
156f2d7aa87SRichard Tran Mills   if (*ierr) return;
15717da0f0dSJed Brown   *ierr = DMShellSetLocalToGlobal(*dm,ourlocaltoglobalbegin,ourlocaltoglobalend);
158f2d7aa87SRichard Tran Mills }
159*f3db62a7SRichard Tran Mills 
160*f3db62a7SRichard Tran Mills PETSC_EXTERN void PETSC_STDCALL dmshellsetlocaltolocal_(DM *dm,void (PETSC_STDCALL *begin)(DM*,Vec*,InsertMode*,Vec*,PetscErrorCode*),void (PETSC_STDCALL *end)(DM*,Vec*,InsertMode*,Vec*,PetscErrorCode*),PetscErrorCode *ierr)
161*f3db62a7SRichard Tran Mills {
162*f3db62a7SRichard Tran Mills   *ierr = PetscObjectSetFortranCallback((PetscObject)*dm,PETSC_FORTRAN_CALLBACK_SUBTYPE,&_cb.localtolocalbegin,(PetscVoidFunction)begin,NULL);
163*f3db62a7SRichard Tran Mills   if (*ierr) return;
164*f3db62a7SRichard Tran Mills   *ierr = PetscObjectSetFortranCallback((PetscObject)*dm,PETSC_FORTRAN_CALLBACK_SUBTYPE,&_cb.localtolocalend,(PetscVoidFunction)end,NULL);
165*f3db62a7SRichard Tran Mills   if (*ierr) return;
166*f3db62a7SRichard Tran Mills   *ierr = DMShellSetLocalToLocal(*dm,ourlocaltolocalbegin,ourlocaltolocalend);
167*f3db62a7SRichard Tran Mills }
168