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_ 10f3db62a7SRichard 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 17f3db62a7SRichard 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; 33f3db62a7SRichard Tran Mills PetscFortranCallbackId localtolocalbegin; 34f3db62a7SRichard Tran Mills PetscFortranCallbackId localtolocalend; 35dc43b69eSJed Brown } _cb; 36dc43b69eSJed Brown 37de64c4c2SJed Brown #undef __FUNCT__ 38de64c4c2SJed Brown #define __FUNCT__ "ourcreatematrix" 39b412c318SBarry Smith static PetscErrorCode ourcreatematrix(DM dm,Mat *A) 400ec63f53SRichard Tran Mills { 41*a348f287SBarry Smith PetscObjectUseFortranCallbackSubType(dm,_cb.creatematrix,(DM*,Mat*,PetscErrorCode*),(&dm,A,&ierr)); 420ec63f53SRichard Tran Mills } 430ec63f53SRichard Tran Mills 44de64c4c2SJed Brown #undef __FUNCT__ 45de64c4c2SJed Brown #define __FUNCT__ "ourcreateglobalvector" 460ec63f53SRichard Tran Mills static PetscErrorCode ourcreateglobalvector(DM dm,Vec *v) 470ec63f53SRichard Tran Mills { 4817da0f0dSJed Brown PetscObjectUseFortranCallbackSubType(dm,_cb.createglobalvector,(DM*,Vec*,PetscErrorCode*),(&dm,v,&ierr)); 490ec63f53SRichard Tran Mills } 500ec63f53SRichard Tran Mills 51de64c4c2SJed Brown #undef __FUNCT__ 52de64c4c2SJed Brown #define __FUNCT__ "ourcreatelocalvector" 53dc43b69eSJed Brown static PetscErrorCode ourcreatelocalvector(DM dm,Vec *v) 540ec63f53SRichard Tran Mills { 5517da0f0dSJed Brown PetscObjectUseFortranCallbackSubType(dm,_cb.createlocalvector,(DM*,Vec*,PetscErrorCode*),(&dm,v,&ierr)); 56dc43b69eSJed Brown } 57dc43b69eSJed Brown 58f2d7aa87SRichard Tran Mills #undef __FUNCT__ 59f2d7aa87SRichard Tran Mills #define __FUNCT__ "ourglobaltolocalbegin" 60f2d7aa87SRichard Tran Mills static PetscErrorCode ourglobaltolocalbegin(DM dm,Vec g,InsertMode mode,Vec l) 61f2d7aa87SRichard Tran Mills { 6217da0f0dSJed Brown PetscObjectUseFortranCallbackSubType(dm,_cb.globaltolocalbegin,(DM*,Vec*,InsertMode*,Vec*,PetscErrorCode*),(&dm,&g,&mode,&l,&ierr)); 63f2d7aa87SRichard Tran Mills } 64f2d7aa87SRichard Tran Mills 65f2d7aa87SRichard Tran Mills #undef __FUNCT__ 66f2d7aa87SRichard Tran Mills #define __FUNCT__ "ourglobaltolocalend" 67f2d7aa87SRichard Tran Mills static PetscErrorCode ourglobaltolocalend(DM dm,Vec g,InsertMode mode,Vec l) 68f2d7aa87SRichard Tran Mills { 6917da0f0dSJed Brown PetscObjectUseFortranCallbackSubType(dm,_cb.globaltolocalend,(DM*,Vec*,InsertMode*,Vec*,PetscErrorCode*),(&dm,&g,&mode,&l,&ierr)); 70f2d7aa87SRichard Tran Mills } 71f2d7aa87SRichard Tran Mills 72f2d7aa87SRichard Tran Mills #undef __FUNCT__ 73f2d7aa87SRichard Tran Mills #define __FUNCT__ "ourlocaltoglobalbegin" 74f2d7aa87SRichard Tran Mills static PetscErrorCode ourlocaltoglobalbegin(DM dm,Vec l,InsertMode mode,Vec g) 75f2d7aa87SRichard Tran Mills { 7617da0f0dSJed Brown PetscObjectUseFortranCallbackSubType(dm,_cb.localtoglobalbegin,(DM*,Vec*,InsertMode*,Vec*,PetscErrorCode*),(&dm,&l,&mode,&g,&ierr)); 77f2d7aa87SRichard Tran Mills } 78f2d7aa87SRichard Tran Mills 79f2d7aa87SRichard Tran Mills #undef __FUNCT__ 80f2d7aa87SRichard Tran Mills #define __FUNCT__ "ourlocaltoglobalend" 81f2d7aa87SRichard Tran Mills static PetscErrorCode ourlocaltoglobalend(DM dm,Vec l,InsertMode mode,Vec g) 82f2d7aa87SRichard Tran Mills { 8317da0f0dSJed Brown PetscObjectUseFortranCallbackSubType(dm,_cb.localtoglobalend,(DM*,Vec*,InsertMode*,Vec*,PetscErrorCode*),(&dm,&l,&mode,&g,&ierr)); 84f2d7aa87SRichard Tran Mills } 85f2d7aa87SRichard Tran Mills 86f3db62a7SRichard Tran Mills #undef __FUNCT__ 87f3db62a7SRichard Tran Mills #define __FUNCT__ "ourlocaltolocalbegin" 88f3db62a7SRichard Tran Mills static PetscErrorCode ourlocaltolocalbegin(DM dm,Vec g,InsertMode mode,Vec l) 89f3db62a7SRichard Tran Mills { 90f3db62a7SRichard Tran Mills PetscObjectUseFortranCallbackSubType(dm,_cb.localtolocalbegin,(DM*,Vec*,InsertMode*,Vec*,PetscErrorCode*),(&dm,&g,&mode,&l,&ierr)); 91f3db62a7SRichard Tran Mills } 92f3db62a7SRichard Tran Mills 93f3db62a7SRichard Tran Mills #undef __FUNCT__ 94f3db62a7SRichard Tran Mills #define __FUNCT__ "ourlocaltolocalend" 95f3db62a7SRichard Tran Mills static PetscErrorCode ourlocaltolocalend(DM dm,Vec g,InsertMode mode,Vec l) 96f3db62a7SRichard Tran Mills { 97f3db62a7SRichard Tran Mills PetscObjectUseFortranCallbackSubType(dm,_cb.localtolocalend,(DM*,Vec*,InsertMode*,Vec*,PetscErrorCode*),(&dm,&g,&mode,&l,&ierr)); 98f3db62a7SRichard Tran Mills } 99f3db62a7SRichard Tran Mills 100f3db62a7SRichard Tran Mills 101b412c318SBarry Smith PETSC_EXTERN void PETSC_STDCALL dmshellsetcreatematrix_(DM *dm,void (PETSC_STDCALL *func)(DM*,Mat*,PetscErrorCode* PETSC_END_LEN(len)),PetscErrorCode *ierr) 102dc43b69eSJed Brown { 1030298fd71SBarry Smith *ierr = PetscObjectSetFortranCallback((PetscObject)*dm,PETSC_FORTRAN_CALLBACK_SUBTYPE,&_cb.creatematrix,(PetscVoidFunction)func,NULL); 104dc43b69eSJed Brown if (*ierr) return; 1050ec63f53SRichard Tran Mills *ierr = DMShellSetCreateMatrix(*dm,ourcreatematrix); 1060ec63f53SRichard Tran Mills } 1070ec63f53SRichard Tran Mills 1088cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL dmshellsetcreateglobalvector_(DM *dm,void (PETSC_STDCALL *func)(DM*,Vec*,PetscErrorCode*),PetscErrorCode *ierr) 1090ec63f53SRichard Tran Mills { 1100298fd71SBarry Smith *ierr = PetscObjectSetFortranCallback((PetscObject)*dm,PETSC_FORTRAN_CALLBACK_SUBTYPE,&_cb.createglobalvector,(PetscVoidFunction)func,NULL); 111dc43b69eSJed Brown if (*ierr) return; 1120ec63f53SRichard Tran Mills *ierr = DMShellSetCreateGlobalVector(*dm,ourcreateglobalvector); 1130ec63f53SRichard Tran Mills } 114fa59e805SSatish Balay 1158cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL dmshellsetcreatelocalvector_(DM *dm,void (PETSC_STDCALL *func)(DM*,Vec*,PetscErrorCode*),PetscErrorCode *ierr) 116dc43b69eSJed Brown { 1170298fd71SBarry Smith *ierr = PetscObjectSetFortranCallback((PetscObject)*dm,PETSC_FORTRAN_CALLBACK_SUBTYPE,&_cb.createlocalvector,(PetscVoidFunction)func,NULL); 118dc43b69eSJed Brown if (*ierr) return; 119dc43b69eSJed Brown *ierr = DMShellSetCreateLocalVector(*dm,ourcreatelocalvector); 120dc43b69eSJed Brown } 121f2d7aa87SRichard Tran Mills 1228cc058d9SJed 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) 123f2d7aa87SRichard Tran Mills { 124f2d7aa87SRichard Tran Mills *ierr = PetscObjectSetFortranCallback((PetscObject)*dm,PETSC_FORTRAN_CALLBACK_SUBTYPE,&_cb.globaltolocalbegin,(PetscVoidFunction)begin,NULL); 125f2d7aa87SRichard Tran Mills if (*ierr) return; 126f2d7aa87SRichard Tran Mills *ierr = PetscObjectSetFortranCallback((PetscObject)*dm,PETSC_FORTRAN_CALLBACK_SUBTYPE,&_cb.globaltolocalend,(PetscVoidFunction)end,NULL); 127f2d7aa87SRichard Tran Mills if (*ierr) return; 128f2d7aa87SRichard Tran Mills *ierr = DMShellSetGlobalToLocal(*dm,ourglobaltolocalbegin,ourglobaltolocalend); 129f2d7aa87SRichard Tran Mills } 130f2d7aa87SRichard Tran Mills 1318cc058d9SJed 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) 132f2d7aa87SRichard Tran Mills { 133f2d7aa87SRichard Tran Mills *ierr = PetscObjectSetFortranCallback((PetscObject)*dm,PETSC_FORTRAN_CALLBACK_SUBTYPE,&_cb.localtoglobalbegin,(PetscVoidFunction)begin,NULL); 134f2d7aa87SRichard Tran Mills if (*ierr) return; 135f2d7aa87SRichard Tran Mills *ierr = PetscObjectSetFortranCallback((PetscObject)*dm,PETSC_FORTRAN_CALLBACK_SUBTYPE,&_cb.localtoglobalend,(PetscVoidFunction)end,NULL); 136f2d7aa87SRichard Tran Mills if (*ierr) return; 13717da0f0dSJed Brown *ierr = DMShellSetLocalToGlobal(*dm,ourlocaltoglobalbegin,ourlocaltoglobalend); 138f2d7aa87SRichard Tran Mills } 139f3db62a7SRichard Tran Mills 140f3db62a7SRichard 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) 141f3db62a7SRichard Tran Mills { 142f3db62a7SRichard Tran Mills *ierr = PetscObjectSetFortranCallback((PetscObject)*dm,PETSC_FORTRAN_CALLBACK_SUBTYPE,&_cb.localtolocalbegin,(PetscVoidFunction)begin,NULL); 143f3db62a7SRichard Tran Mills if (*ierr) return; 144f3db62a7SRichard Tran Mills *ierr = PetscObjectSetFortranCallback((PetscObject)*dm,PETSC_FORTRAN_CALLBACK_SUBTYPE,&_cb.localtolocalend,(PetscVoidFunction)end,NULL); 145f3db62a7SRichard Tran Mills if (*ierr) return; 146f3db62a7SRichard Tran Mills *ierr = DMShellSetLocalToLocal(*dm,ourlocaltolocalbegin,ourlocaltolocalend); 147f3db62a7SRichard Tran Mills } 148