xref: /petsc/src/dm/impls/shell/ftn-custom/zdmshellf.c (revision 8a6b6cad2f7b2cdc69b9bd79694a63724703a50a)
1af0996ceSBarry Smith #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
6*8a6b6cadSSatish Balay   #define dmshellsetcreateglobalvector_ DMSHELLSETCREATEGLOBALVECTOR
7*8a6b6cadSSatish Balay   #define dmshellsetcreatelocalvector_  DMSHELLSETCREATELOCALVECTOR
8*8a6b6cadSSatish Balay   #define dmshellsetglobaltolocal_      DMSHELLSETGLOBALTOLOCAL
9*8a6b6cadSSatish Balay   #define dmshellsetlocaltoglobal_      DMSHELLSETLOCALTOGLOBAL
10*8a6b6cadSSatish Balay   #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*8a6b6cadSSatish Balay   #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;
33f3db62a7SRichard Tran Mills   PetscFortranCallbackId localtolocalbegin;
34f3db62a7SRichard Tran Mills   PetscFortranCallbackId localtolocalend;
35dc43b69eSJed Brown } _cb;
36dc43b69eSJed Brown 
37b412c318SBarry Smith static PetscErrorCode ourcreatematrix(DM dm, Mat *A)
380ec63f53SRichard Tran Mills {
39a348f287SBarry Smith   PetscObjectUseFortranCallbackSubType(dm, _cb.creatematrix, (DM *, Mat *, PetscErrorCode *), (&dm, A, &ierr));
400ec63f53SRichard Tran Mills }
410ec63f53SRichard Tran Mills 
420ec63f53SRichard Tran Mills static PetscErrorCode ourcreateglobalvector(DM dm, Vec *v)
430ec63f53SRichard Tran Mills {
4417da0f0dSJed Brown   PetscObjectUseFortranCallbackSubType(dm, _cb.createglobalvector, (DM *, Vec *, PetscErrorCode *), (&dm, v, &ierr));
450ec63f53SRichard Tran Mills }
460ec63f53SRichard Tran Mills 
47dc43b69eSJed Brown static PetscErrorCode ourcreatelocalvector(DM dm, Vec *v)
480ec63f53SRichard Tran Mills {
4917da0f0dSJed Brown   PetscObjectUseFortranCallbackSubType(dm, _cb.createlocalvector, (DM *, Vec *, PetscErrorCode *), (&dm, v, &ierr));
50dc43b69eSJed Brown }
51dc43b69eSJed Brown 
52f2d7aa87SRichard Tran Mills static PetscErrorCode ourglobaltolocalbegin(DM dm, Vec g, InsertMode mode, Vec l)
53f2d7aa87SRichard Tran Mills {
5417da0f0dSJed Brown   PetscObjectUseFortranCallbackSubType(dm, _cb.globaltolocalbegin, (DM *, Vec *, InsertMode *, Vec *, PetscErrorCode *), (&dm, &g, &mode, &l, &ierr));
55f2d7aa87SRichard Tran Mills }
56f2d7aa87SRichard Tran Mills 
57f2d7aa87SRichard Tran Mills static PetscErrorCode ourglobaltolocalend(DM dm, Vec g, InsertMode mode, Vec l)
58f2d7aa87SRichard Tran Mills {
5917da0f0dSJed Brown   PetscObjectUseFortranCallbackSubType(dm, _cb.globaltolocalend, (DM *, Vec *, InsertMode *, Vec *, PetscErrorCode *), (&dm, &g, &mode, &l, &ierr));
60f2d7aa87SRichard Tran Mills }
61f2d7aa87SRichard Tran Mills 
62f2d7aa87SRichard Tran Mills static PetscErrorCode ourlocaltoglobalbegin(DM dm, Vec l, InsertMode mode, Vec g)
63f2d7aa87SRichard Tran Mills {
6417da0f0dSJed Brown   PetscObjectUseFortranCallbackSubType(dm, _cb.localtoglobalbegin, (DM *, Vec *, InsertMode *, Vec *, PetscErrorCode *), (&dm, &l, &mode, &g, &ierr));
65f2d7aa87SRichard Tran Mills }
66f2d7aa87SRichard Tran Mills 
67f2d7aa87SRichard Tran Mills static PetscErrorCode ourlocaltoglobalend(DM dm, Vec l, InsertMode mode, Vec g)
68f2d7aa87SRichard Tran Mills {
6917da0f0dSJed Brown   PetscObjectUseFortranCallbackSubType(dm, _cb.localtoglobalend, (DM *, Vec *, InsertMode *, Vec *, PetscErrorCode *), (&dm, &l, &mode, &g, &ierr));
70f2d7aa87SRichard Tran Mills }
71f2d7aa87SRichard Tran Mills 
72f3db62a7SRichard Tran Mills static PetscErrorCode ourlocaltolocalbegin(DM dm, Vec g, InsertMode mode, Vec l)
73f3db62a7SRichard Tran Mills {
74f3db62a7SRichard Tran Mills   PetscObjectUseFortranCallbackSubType(dm, _cb.localtolocalbegin, (DM *, Vec *, InsertMode *, Vec *, PetscErrorCode *), (&dm, &g, &mode, &l, &ierr));
75f3db62a7SRichard Tran Mills }
76f3db62a7SRichard Tran Mills 
77f3db62a7SRichard Tran Mills static PetscErrorCode ourlocaltolocalend(DM dm, Vec g, InsertMode mode, Vec l)
78f3db62a7SRichard Tran Mills {
79f3db62a7SRichard Tran Mills   PetscObjectUseFortranCallbackSubType(dm, _cb.localtolocalend, (DM *, Vec *, InsertMode *, Vec *, PetscErrorCode *), (&dm, &g, &mode, &l, &ierr));
80f3db62a7SRichard Tran Mills }
81f3db62a7SRichard Tran Mills 
8219caf8f3SSatish Balay PETSC_EXTERN void dmshellsetcreatematrix_(DM *dm, void (*func)(DM *, Mat *, PetscErrorCode *, PETSC_FORTRAN_CHARLEN_T len), PetscErrorCode *ierr)
83dc43b69eSJed Brown {
848434afd1SBarry Smith   *ierr = PetscObjectSetFortranCallback((PetscObject)*dm, PETSC_FORTRAN_CALLBACK_SUBTYPE, &_cb.creatematrix, (PetscVoidFn *)func, NULL);
855975b3b6SBarry Smith   if (*ierr) return;
860ec63f53SRichard Tran Mills   *ierr = DMShellSetCreateMatrix(*dm, ourcreatematrix);
870ec63f53SRichard Tran Mills }
880ec63f53SRichard Tran Mills 
8919caf8f3SSatish Balay PETSC_EXTERN void dmshellsetcreateglobalvector_(DM *dm, void (*func)(DM *, Vec *, PetscErrorCode *), PetscErrorCode *ierr)
900ec63f53SRichard Tran Mills {
918434afd1SBarry Smith   *ierr = PetscObjectSetFortranCallback((PetscObject)*dm, PETSC_FORTRAN_CALLBACK_SUBTYPE, &_cb.createglobalvector, (PetscVoidFn *)func, NULL);
925975b3b6SBarry Smith   if (*ierr) return;
930ec63f53SRichard Tran Mills   *ierr = DMShellSetCreateGlobalVector(*dm, ourcreateglobalvector);
940ec63f53SRichard Tran Mills }
95fa59e805SSatish Balay 
9619caf8f3SSatish Balay PETSC_EXTERN void dmshellsetcreatelocalvector_(DM *dm, void (*func)(DM *, Vec *, PetscErrorCode *), PetscErrorCode *ierr)
97dc43b69eSJed Brown {
988434afd1SBarry Smith   *ierr = PetscObjectSetFortranCallback((PetscObject)*dm, PETSC_FORTRAN_CALLBACK_SUBTYPE, &_cb.createlocalvector, (PetscVoidFn *)func, NULL);
995975b3b6SBarry Smith   if (*ierr) return;
100dc43b69eSJed Brown   *ierr = DMShellSetCreateLocalVector(*dm, ourcreatelocalvector);
101dc43b69eSJed Brown }
102f2d7aa87SRichard Tran Mills 
10319caf8f3SSatish Balay PETSC_EXTERN void dmshellsetglobaltolocal_(DM *dm, void (*begin)(DM *, Vec *, InsertMode *, Vec *, PetscErrorCode *), void (*end)(DM *, Vec *, InsertMode *, Vec *, PetscErrorCode *), PetscErrorCode *ierr)
104f2d7aa87SRichard Tran Mills {
1058434afd1SBarry Smith   *ierr = PetscObjectSetFortranCallback((PetscObject)*dm, PETSC_FORTRAN_CALLBACK_SUBTYPE, &_cb.globaltolocalbegin, (PetscVoidFn *)begin, NULL);
1065975b3b6SBarry Smith   if (*ierr) return;
1078434afd1SBarry Smith   *ierr = PetscObjectSetFortranCallback((PetscObject)*dm, PETSC_FORTRAN_CALLBACK_SUBTYPE, &_cb.globaltolocalend, (PetscVoidFn *)end, NULL);
1085975b3b6SBarry Smith   if (*ierr) return;
109f2d7aa87SRichard Tran Mills   *ierr = DMShellSetGlobalToLocal(*dm, ourglobaltolocalbegin, ourglobaltolocalend);
110f2d7aa87SRichard Tran Mills }
111f2d7aa87SRichard Tran Mills 
11219caf8f3SSatish Balay PETSC_EXTERN void dmshellsetlocaltoglobal_(DM *dm, void (*begin)(DM *, Vec *, InsertMode *, Vec *, PetscErrorCode *), void (*end)(DM *, Vec *, InsertMode *, Vec *, PetscErrorCode *), PetscErrorCode *ierr)
113f2d7aa87SRichard Tran Mills {
1148434afd1SBarry Smith   *ierr = PetscObjectSetFortranCallback((PetscObject)*dm, PETSC_FORTRAN_CALLBACK_SUBTYPE, &_cb.localtoglobalbegin, (PetscVoidFn *)begin, NULL);
1155975b3b6SBarry Smith   if (*ierr) return;
1168434afd1SBarry Smith   *ierr = PetscObjectSetFortranCallback((PetscObject)*dm, PETSC_FORTRAN_CALLBACK_SUBTYPE, &_cb.localtoglobalend, (PetscVoidFn *)end, NULL);
1175975b3b6SBarry Smith   if (*ierr) return;
11817da0f0dSJed Brown   *ierr = DMShellSetLocalToGlobal(*dm, ourlocaltoglobalbegin, ourlocaltoglobalend);
119f2d7aa87SRichard Tran Mills }
120f3db62a7SRichard Tran Mills 
12119caf8f3SSatish Balay PETSC_EXTERN void dmshellsetlocaltolocal_(DM *dm, void (*begin)(DM *, Vec *, InsertMode *, Vec *, PetscErrorCode *), void (*end)(DM *, Vec *, InsertMode *, Vec *, PetscErrorCode *), PetscErrorCode *ierr)
122f3db62a7SRichard Tran Mills {
1238434afd1SBarry Smith   *ierr = PetscObjectSetFortranCallback((PetscObject)*dm, PETSC_FORTRAN_CALLBACK_SUBTYPE, &_cb.localtolocalbegin, (PetscVoidFn *)begin, NULL);
1245975b3b6SBarry Smith   if (*ierr) return;
1258434afd1SBarry Smith   *ierr = PetscObjectSetFortranCallback((PetscObject)*dm, PETSC_FORTRAN_CALLBACK_SUBTYPE, &_cb.localtolocalend, (PetscVoidFn *)end, NULL);
1265975b3b6SBarry Smith   if (*ierr) return;
127f3db62a7SRichard Tran Mills   *ierr = DMShellSetLocalToLocal(*dm, ourlocaltolocalbegin, ourlocaltolocalend);
128f3db62a7SRichard Tran Mills }
129