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" 39*b412c318SBarry Smith static PetscErrorCode ourcreatematrix(DM dm,Mat *A) 400ec63f53SRichard Tran Mills { 41*b412c318SBarry Smith PetscObjectUseFortranCallbackSubType(dm,_cb.creatematrix,(DM*,Mat*,PetscErrorCode*), 42*b412c318SBarry Smith (&dm,A,&ierr)); 43dc43b69eSJed Brown return 0; 440ec63f53SRichard Tran Mills } 450ec63f53SRichard Tran Mills 46de64c4c2SJed Brown #undef __FUNCT__ 47de64c4c2SJed Brown #define __FUNCT__ "ourcreateglobalvector" 480ec63f53SRichard Tran Mills static PetscErrorCode ourcreateglobalvector(DM dm,Vec *v) 490ec63f53SRichard Tran Mills { 5017da0f0dSJed Brown PetscObjectUseFortranCallbackSubType(dm,_cb.createglobalvector,(DM*,Vec*,PetscErrorCode*),(&dm,v,&ierr)); 51dc43b69eSJed Brown return 0; 520ec63f53SRichard Tran Mills } 530ec63f53SRichard Tran Mills 54de64c4c2SJed Brown #undef __FUNCT__ 55de64c4c2SJed Brown #define __FUNCT__ "ourcreatelocalvector" 56dc43b69eSJed Brown static PetscErrorCode ourcreatelocalvector(DM dm,Vec *v) 570ec63f53SRichard Tran Mills { 5817da0f0dSJed Brown PetscObjectUseFortranCallbackSubType(dm,_cb.createlocalvector,(DM*,Vec*,PetscErrorCode*),(&dm,v,&ierr)); 59dc43b69eSJed Brown return 0; 60dc43b69eSJed Brown } 61dc43b69eSJed Brown 62f2d7aa87SRichard Tran Mills #undef __FUNCT__ 63f2d7aa87SRichard Tran Mills #define __FUNCT__ "ourglobaltolocalbegin" 64f2d7aa87SRichard Tran Mills static PetscErrorCode ourglobaltolocalbegin(DM dm,Vec g,InsertMode mode,Vec l) 65f2d7aa87SRichard Tran Mills { 6617da0f0dSJed Brown PetscObjectUseFortranCallbackSubType(dm,_cb.globaltolocalbegin,(DM*,Vec*,InsertMode*,Vec*,PetscErrorCode*),(&dm,&g,&mode,&l,&ierr)); 67f2d7aa87SRichard Tran Mills return 0; 68f2d7aa87SRichard Tran Mills } 69f2d7aa87SRichard Tran Mills 70f2d7aa87SRichard Tran Mills #undef __FUNCT__ 71f2d7aa87SRichard Tran Mills #define __FUNCT__ "ourglobaltolocalend" 72f2d7aa87SRichard Tran Mills static PetscErrorCode ourglobaltolocalend(DM dm,Vec g,InsertMode mode,Vec l) 73f2d7aa87SRichard Tran Mills { 7417da0f0dSJed Brown PetscObjectUseFortranCallbackSubType(dm,_cb.globaltolocalend,(DM*,Vec*,InsertMode*,Vec*,PetscErrorCode*),(&dm,&g,&mode,&l,&ierr)); 75f2d7aa87SRichard Tran Mills return 0; 76f2d7aa87SRichard Tran Mills } 77f2d7aa87SRichard Tran Mills 78f2d7aa87SRichard Tran Mills #undef __FUNCT__ 79f2d7aa87SRichard Tran Mills #define __FUNCT__ "ourlocaltoglobalbegin" 80f2d7aa87SRichard Tran Mills static PetscErrorCode ourlocaltoglobalbegin(DM dm,Vec l,InsertMode mode,Vec g) 81f2d7aa87SRichard Tran Mills { 8217da0f0dSJed Brown PetscObjectUseFortranCallbackSubType(dm,_cb.localtoglobalbegin,(DM*,Vec*,InsertMode*,Vec*,PetscErrorCode*),(&dm,&l,&mode,&g,&ierr)); 83f2d7aa87SRichard Tran Mills return 0; 84f2d7aa87SRichard Tran Mills } 85f2d7aa87SRichard Tran Mills 86f2d7aa87SRichard Tran Mills #undef __FUNCT__ 87f2d7aa87SRichard Tran Mills #define __FUNCT__ "ourlocaltoglobalend" 88f2d7aa87SRichard Tran Mills static PetscErrorCode ourlocaltoglobalend(DM dm,Vec l,InsertMode mode,Vec g) 89f2d7aa87SRichard Tran Mills { 9017da0f0dSJed Brown PetscObjectUseFortranCallbackSubType(dm,_cb.localtoglobalend,(DM*,Vec*,InsertMode*,Vec*,PetscErrorCode*),(&dm,&l,&mode,&g,&ierr)); 91f2d7aa87SRichard Tran Mills return 0; 92f2d7aa87SRichard Tran Mills } 93f2d7aa87SRichard Tran Mills 94f3db62a7SRichard Tran Mills #undef __FUNCT__ 95f3db62a7SRichard Tran Mills #define __FUNCT__ "ourlocaltolocalbegin" 96f3db62a7SRichard Tran Mills static PetscErrorCode ourlocaltolocalbegin(DM dm,Vec g,InsertMode mode,Vec l) 97f3db62a7SRichard Tran Mills { 98f3db62a7SRichard Tran Mills PetscObjectUseFortranCallbackSubType(dm,_cb.localtolocalbegin,(DM*,Vec*,InsertMode*,Vec*,PetscErrorCode*),(&dm,&g,&mode,&l,&ierr)); 99f3db62a7SRichard Tran Mills return 0; 100f3db62a7SRichard Tran Mills } 101f3db62a7SRichard Tran Mills 102f3db62a7SRichard Tran Mills #undef __FUNCT__ 103f3db62a7SRichard Tran Mills #define __FUNCT__ "ourlocaltolocalend" 104f3db62a7SRichard Tran Mills static PetscErrorCode ourlocaltolocalend(DM dm,Vec g,InsertMode mode,Vec l) 105f3db62a7SRichard Tran Mills { 106f3db62a7SRichard Tran Mills PetscObjectUseFortranCallbackSubType(dm,_cb.localtolocalend,(DM*,Vec*,InsertMode*,Vec*,PetscErrorCode*),(&dm,&g,&mode,&l,&ierr)); 107f3db62a7SRichard Tran Mills return 0; 108f3db62a7SRichard Tran Mills } 109f3db62a7SRichard Tran Mills 110f3db62a7SRichard Tran Mills 111*b412c318SBarry Smith PETSC_EXTERN void PETSC_STDCALL dmshellsetcreatematrix_(DM *dm,void (PETSC_STDCALL *func)(DM*,Mat*,PetscErrorCode* PETSC_END_LEN(len)),PetscErrorCode *ierr) 112dc43b69eSJed Brown { 1130298fd71SBarry Smith *ierr = PetscObjectSetFortranCallback((PetscObject)*dm,PETSC_FORTRAN_CALLBACK_SUBTYPE,&_cb.creatematrix,(PetscVoidFunction)func,NULL); 114dc43b69eSJed Brown if (*ierr) return; 1150ec63f53SRichard Tran Mills *ierr = DMShellSetCreateMatrix(*dm,ourcreatematrix); 1160ec63f53SRichard Tran Mills } 1170ec63f53SRichard Tran Mills 1188cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL dmshellsetcreateglobalvector_(DM *dm,void (PETSC_STDCALL *func)(DM*,Vec*,PetscErrorCode*),PetscErrorCode *ierr) 1190ec63f53SRichard Tran Mills { 1200298fd71SBarry Smith *ierr = PetscObjectSetFortranCallback((PetscObject)*dm,PETSC_FORTRAN_CALLBACK_SUBTYPE,&_cb.createglobalvector,(PetscVoidFunction)func,NULL); 121dc43b69eSJed Brown if (*ierr) return; 1220ec63f53SRichard Tran Mills *ierr = DMShellSetCreateGlobalVector(*dm,ourcreateglobalvector); 1230ec63f53SRichard Tran Mills } 124fa59e805SSatish Balay 1258cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL dmshellsetcreatelocalvector_(DM *dm,void (PETSC_STDCALL *func)(DM*,Vec*,PetscErrorCode*),PetscErrorCode *ierr) 126dc43b69eSJed Brown { 1270298fd71SBarry Smith *ierr = PetscObjectSetFortranCallback((PetscObject)*dm,PETSC_FORTRAN_CALLBACK_SUBTYPE,&_cb.createlocalvector,(PetscVoidFunction)func,NULL); 128dc43b69eSJed Brown if (*ierr) return; 129dc43b69eSJed Brown *ierr = DMShellSetCreateLocalVector(*dm,ourcreatelocalvector); 130dc43b69eSJed Brown } 131f2d7aa87SRichard Tran Mills 1328cc058d9SJed 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) 133f2d7aa87SRichard Tran Mills { 134f2d7aa87SRichard Tran Mills *ierr = PetscObjectSetFortranCallback((PetscObject)*dm,PETSC_FORTRAN_CALLBACK_SUBTYPE,&_cb.globaltolocalbegin,(PetscVoidFunction)begin,NULL); 135f2d7aa87SRichard Tran Mills if (*ierr) return; 136f2d7aa87SRichard Tran Mills *ierr = PetscObjectSetFortranCallback((PetscObject)*dm,PETSC_FORTRAN_CALLBACK_SUBTYPE,&_cb.globaltolocalend,(PetscVoidFunction)end,NULL); 137f2d7aa87SRichard Tran Mills if (*ierr) return; 138f2d7aa87SRichard Tran Mills *ierr = DMShellSetGlobalToLocal(*dm,ourglobaltolocalbegin,ourglobaltolocalend); 139f2d7aa87SRichard Tran Mills } 140f2d7aa87SRichard Tran Mills 1418cc058d9SJed 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) 142f2d7aa87SRichard Tran Mills { 143f2d7aa87SRichard Tran Mills *ierr = PetscObjectSetFortranCallback((PetscObject)*dm,PETSC_FORTRAN_CALLBACK_SUBTYPE,&_cb.localtoglobalbegin,(PetscVoidFunction)begin,NULL); 144f2d7aa87SRichard Tran Mills if (*ierr) return; 145f2d7aa87SRichard Tran Mills *ierr = PetscObjectSetFortranCallback((PetscObject)*dm,PETSC_FORTRAN_CALLBACK_SUBTYPE,&_cb.localtoglobalend,(PetscVoidFunction)end,NULL); 146f2d7aa87SRichard Tran Mills if (*ierr) return; 14717da0f0dSJed Brown *ierr = DMShellSetLocalToGlobal(*dm,ourlocaltoglobalbegin,ourlocaltoglobalend); 148f2d7aa87SRichard Tran Mills } 149f3db62a7SRichard Tran Mills 150f3db62a7SRichard 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) 151f3db62a7SRichard Tran Mills { 152f3db62a7SRichard Tran Mills *ierr = PetscObjectSetFortranCallback((PetscObject)*dm,PETSC_FORTRAN_CALLBACK_SUBTYPE,&_cb.localtolocalbegin,(PetscVoidFunction)begin,NULL); 153f3db62a7SRichard Tran Mills if (*ierr) return; 154f3db62a7SRichard Tran Mills *ierr = PetscObjectSetFortranCallback((PetscObject)*dm,PETSC_FORTRAN_CALLBACK_SUBTYPE,&_cb.localtolocalend,(PetscVoidFunction)end,NULL); 155f3db62a7SRichard Tran Mills if (*ierr) return; 156f3db62a7SRichard Tran Mills *ierr = DMShellSetLocalToLocal(*dm,ourlocaltolocalbegin,ourlocaltolocalend); 157f3db62a7SRichard Tran Mills } 158