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_ 100ec63f53SRichard Tran Mills #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE) 110ec63f53SRichard Tran Mills #define dmshellsetcreatematrix_ dmshellsetcreatematrix 120ec63f53SRichard Tran Mills #define dmshellsetcreateglobalvector_ dmshellsetcreateglobalvector 13dc43b69eSJed Brown #define dmshellsetcreatelocalvector_ dmshellsetcreatelocalvector 14f2d7aa87SRichard Tran Mills #define dmshellsetglobaltolocal_ dmshellsetglobaltolocal 15f2d7aa87SRichard Tran Mills #define dmshellsetlocaltoglobal_ dmshellsetlocaltoglobal 160ec63f53SRichard Tran Mills #endif 170ec63f53SRichard Tran Mills 180ec63f53SRichard Tran Mills /* 19dc43b69eSJed Brown * C routines are required for matrix and global vector creation. We define C routines here that call the corresponding 20dc43b69eSJed Brown * Fortran routine (indexed by _cb) that was set by the user. 210ec63f53SRichard Tran Mills */ 220ec63f53SRichard Tran Mills 23dc43b69eSJed Brown static struct { 24dc43b69eSJed Brown PetscFortranCallbackId creatematrix; 25dc43b69eSJed Brown PetscFortranCallbackId createglobalvector; 26dc43b69eSJed Brown PetscFortranCallbackId createlocalvector; 27f2d7aa87SRichard Tran Mills PetscFortranCallbackId globaltolocalbegin; 28f2d7aa87SRichard Tran Mills PetscFortranCallbackId globaltolocalend; 29f2d7aa87SRichard Tran Mills PetscFortranCallbackId localtoglobalbegin; 30f2d7aa87SRichard Tran Mills PetscFortranCallbackId localtoglobalend; 31dc43b69eSJed Brown } _cb; 32dc43b69eSJed Brown 33de64c4c2SJed Brown #undef __FUNCT__ 34de64c4c2SJed Brown #define __FUNCT__ "ourcreatematrix" 350ec63f53SRichard Tran Mills static PetscErrorCode ourcreatematrix(DM dm,MatType type,Mat *A) 360ec63f53SRichard Tran Mills { 37dc43b69eSJed Brown int len; 38dc43b69eSJed Brown char *ftype = (char*)type; 39dc43b69eSJed Brown if (type) { 40dc43b69eSJed Brown size_t slen; 41dc43b69eSJed Brown PetscStrlen(type,&slen); 42dc43b69eSJed Brown len = (int)slen; 43dc43b69eSJed Brown } else { 44dc43b69eSJed Brown type = PETSC_NULL_CHARACTER_Fortran; 45dc43b69eSJed Brown len = 0; 46dc43b69eSJed Brown } 47*17da0f0dSJed Brown PetscObjectUseFortranCallbackSubType(dm,_cb.creatematrix,(DM*,CHAR PETSC_MIXED_LEN_PROTO,Mat*,PetscErrorCode* PETSC_END_LEN_PROTO), 48dc43b69eSJed Brown (&dm,ftype PETSC_MIXED_LEN_CALL(len),A,&ierr PETSC_END_LEN_CALL(len))); 49dc43b69eSJed Brown return 0; 500ec63f53SRichard Tran Mills } 510ec63f53SRichard Tran Mills 52de64c4c2SJed Brown #undef __FUNCT__ 53de64c4c2SJed Brown #define __FUNCT__ "ourcreateglobalvector" 540ec63f53SRichard Tran Mills static PetscErrorCode ourcreateglobalvector(DM dm,Vec *v) 550ec63f53SRichard Tran Mills { 56*17da0f0dSJed Brown PetscObjectUseFortranCallbackSubType(dm,_cb.createglobalvector,(DM*,Vec*,PetscErrorCode*),(&dm,v,&ierr)); 57dc43b69eSJed Brown return 0; 580ec63f53SRichard Tran Mills } 590ec63f53SRichard Tran Mills 60de64c4c2SJed Brown #undef __FUNCT__ 61de64c4c2SJed Brown #define __FUNCT__ "ourcreatelocalvector" 62dc43b69eSJed Brown static PetscErrorCode ourcreatelocalvector(DM dm,Vec *v) 630ec63f53SRichard Tran Mills { 64*17da0f0dSJed Brown PetscObjectUseFortranCallbackSubType(dm,_cb.createlocalvector,(DM*,Vec*,PetscErrorCode*),(&dm,v,&ierr)); 65dc43b69eSJed Brown return 0; 66dc43b69eSJed Brown } 67dc43b69eSJed Brown 68f2d7aa87SRichard Tran Mills #undef __FUNCT__ 69f2d7aa87SRichard Tran Mills #define __FUNCT__ "ourglobaltolocalbegin" 70f2d7aa87SRichard Tran Mills static PetscErrorCode ourglobaltolocalbegin(DM dm,Vec g,InsertMode mode,Vec l) 71f2d7aa87SRichard Tran Mills { 72*17da0f0dSJed Brown PetscObjectUseFortranCallbackSubType(dm,_cb.globaltolocalbegin,(DM*,Vec*,InsertMode*,Vec*,PetscErrorCode*),(&dm,&g,&mode,&l,&ierr)); 73f2d7aa87SRichard Tran Mills return 0; 74f2d7aa87SRichard Tran Mills } 75f2d7aa87SRichard Tran Mills 76f2d7aa87SRichard Tran Mills #undef __FUNCT__ 77f2d7aa87SRichard Tran Mills #define __FUNCT__ "ourglobaltolocalend" 78f2d7aa87SRichard Tran Mills static PetscErrorCode ourglobaltolocalend(DM dm,Vec g,InsertMode mode,Vec l) 79f2d7aa87SRichard Tran Mills { 80*17da0f0dSJed Brown PetscObjectUseFortranCallbackSubType(dm,_cb.globaltolocalend,(DM*,Vec*,InsertMode*,Vec*,PetscErrorCode*),(&dm,&g,&mode,&l,&ierr)); 81f2d7aa87SRichard Tran Mills return 0; 82f2d7aa87SRichard Tran Mills } 83f2d7aa87SRichard Tran Mills 84f2d7aa87SRichard Tran Mills #undef __FUNCT__ 85f2d7aa87SRichard Tran Mills #define __FUNCT__ "ourlocaltoglobalbegin" 86f2d7aa87SRichard Tran Mills static PetscErrorCode ourlocaltoglobalbegin(DM dm,Vec l,InsertMode mode,Vec g) 87f2d7aa87SRichard Tran Mills { 88*17da0f0dSJed Brown PetscObjectUseFortranCallbackSubType(dm,_cb.localtoglobalbegin,(DM*,Vec*,InsertMode*,Vec*,PetscErrorCode*),(&dm,&l,&mode,&g,&ierr)); 89f2d7aa87SRichard Tran Mills return 0; 90f2d7aa87SRichard Tran Mills } 91f2d7aa87SRichard Tran Mills 92f2d7aa87SRichard Tran Mills #undef __FUNCT__ 93f2d7aa87SRichard Tran Mills #define __FUNCT__ "ourlocaltoglobalend" 94f2d7aa87SRichard Tran Mills static PetscErrorCode ourlocaltoglobalend(DM dm,Vec l,InsertMode mode,Vec g) 95f2d7aa87SRichard Tran Mills { 96*17da0f0dSJed Brown PetscObjectUseFortranCallbackSubType(dm,_cb.localtoglobalend,(DM*,Vec*,InsertMode*,Vec*,PetscErrorCode*),(&dm,&l,&mode,&g,&ierr)); 97f2d7aa87SRichard Tran Mills return 0; 98f2d7aa87SRichard Tran Mills } 99f2d7aa87SRichard Tran Mills 100dc43b69eSJed Brown PETSC_EXTERN_C 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) 101dc43b69eSJed Brown { 1020298fd71SBarry Smith *ierr = PetscObjectSetFortranCallback((PetscObject)*dm,PETSC_FORTRAN_CALLBACK_SUBTYPE,&_cb.creatematrix,(PetscVoidFunction)func,NULL); 103dc43b69eSJed Brown if (*ierr) return; 1040ec63f53SRichard Tran Mills *ierr = DMShellSetCreateMatrix(*dm,ourcreatematrix); 1050ec63f53SRichard Tran Mills } 1060ec63f53SRichard Tran Mills 107dc43b69eSJed Brown PETSC_EXTERN_C void PETSC_STDCALL dmshellsetcreateglobalvector_(DM *dm,void (PETSC_STDCALL *func)(DM*,Vec*,PetscErrorCode*),PetscErrorCode *ierr) 1080ec63f53SRichard Tran Mills { 1090298fd71SBarry Smith *ierr = PetscObjectSetFortranCallback((PetscObject)*dm,PETSC_FORTRAN_CALLBACK_SUBTYPE,&_cb.createglobalvector,(PetscVoidFunction)func,NULL); 110dc43b69eSJed Brown if (*ierr) return; 1110ec63f53SRichard Tran Mills *ierr = DMShellSetCreateGlobalVector(*dm,ourcreateglobalvector); 1120ec63f53SRichard Tran Mills } 113fa59e805SSatish Balay 114dc43b69eSJed Brown PETSC_EXTERN_C void PETSC_STDCALL dmshellsetcreatelocalvector_(DM *dm,void (PETSC_STDCALL *func)(DM*,Vec*,PetscErrorCode*),PetscErrorCode *ierr) 115dc43b69eSJed Brown { 1160298fd71SBarry Smith *ierr = PetscObjectSetFortranCallback((PetscObject)*dm,PETSC_FORTRAN_CALLBACK_SUBTYPE,&_cb.createlocalvector,(PetscVoidFunction)func,NULL); 117dc43b69eSJed Brown if (*ierr) return; 118dc43b69eSJed Brown *ierr = DMShellSetCreateLocalVector(*dm,ourcreatelocalvector); 119dc43b69eSJed Brown } 120f2d7aa87SRichard Tran Mills 121f2d7aa87SRichard Tran Mills PETSC_EXTERN_C 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) 122f2d7aa87SRichard Tran Mills { 123f2d7aa87SRichard Tran Mills *ierr = PetscObjectSetFortranCallback((PetscObject)*dm,PETSC_FORTRAN_CALLBACK_SUBTYPE,&_cb.globaltolocalbegin,(PetscVoidFunction)begin,NULL); 124f2d7aa87SRichard Tran Mills if (*ierr) return; 125f2d7aa87SRichard Tran Mills *ierr = PetscObjectSetFortranCallback((PetscObject)*dm,PETSC_FORTRAN_CALLBACK_SUBTYPE,&_cb.globaltolocalend,(PetscVoidFunction)end,NULL); 126f2d7aa87SRichard Tran Mills if (*ierr) return; 127f2d7aa87SRichard Tran Mills *ierr = DMShellSetGlobalToLocal(*dm,ourglobaltolocalbegin,ourglobaltolocalend); 128f2d7aa87SRichard Tran Mills } 129f2d7aa87SRichard Tran Mills 130f2d7aa87SRichard Tran Mills PETSC_EXTERN_C 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) 131f2d7aa87SRichard Tran Mills { 132f2d7aa87SRichard Tran Mills *ierr = PetscObjectSetFortranCallback((PetscObject)*dm,PETSC_FORTRAN_CALLBACK_SUBTYPE,&_cb.localtoglobalbegin,(PetscVoidFunction)begin,NULL); 133f2d7aa87SRichard Tran Mills if (*ierr) return; 134f2d7aa87SRichard Tran Mills *ierr = PetscObjectSetFortranCallback((PetscObject)*dm,PETSC_FORTRAN_CALLBACK_SUBTYPE,&_cb.localtoglobalend,(PetscVoidFunction)end,NULL); 135f2d7aa87SRichard Tran Mills if (*ierr) return; 136*17da0f0dSJed Brown *ierr = DMShellSetLocalToGlobal(*dm,ourlocaltoglobalbegin,ourlocaltoglobalend); 137f2d7aa87SRichard Tran Mills } 138