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