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_ 8*f2d7aa87SRichard Tran Mills #define dmshellsetglobaltolocal_ DMSHELLSETGLOBALTOLOCAL_ 9*f2d7aa87SRichard 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 14*f2d7aa87SRichard Tran Mills #define dmshellsetglobaltolocal_ dmshellsetglobaltolocal 15*f2d7aa87SRichard 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; 27*f2d7aa87SRichard Tran Mills PetscFortranCallbackId globaltolocalbegin; 28*f2d7aa87SRichard Tran Mills PetscFortranCallbackId globaltolocalend; 29*f2d7aa87SRichard Tran Mills PetscFortranCallbackId localtoglobalbegin; 30*f2d7aa87SRichard 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 } 47f83b4887SSatish Balay PetscObjectUseFortranCallback(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 { 56dc43b69eSJed Brown PetscObjectUseFortranCallback(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 { 64dc43b69eSJed Brown PetscObjectUseFortranCallback(dm,_cb.createlocalvector,(DM*,Vec*,PetscErrorCode*),(&dm,v,&ierr)); 65dc43b69eSJed Brown return 0; 66dc43b69eSJed Brown } 67dc43b69eSJed Brown 68*f2d7aa87SRichard Tran Mills #undef __FUNCT__ 69*f2d7aa87SRichard Tran Mills #define __FUNCT__ "ourglobaltolocalbegin" 70*f2d7aa87SRichard Tran Mills static PetscErrorCode ourglobaltolocalbegin(DM dm,Vec g,InsertMode mode,Vec l) 71*f2d7aa87SRichard Tran Mills { 72*f2d7aa87SRichard Tran Mills PetscObjectUseFortranCallback(dm,_cb.globaltolocalbegin,(DM*,Vec*,InsertMode*,Vec*,PetscErrorCode*),(&dm,g,&mode,l,&ierr)); 73*f2d7aa87SRichard Tran Mills return 0; 74*f2d7aa87SRichard Tran Mills } 75*f2d7aa87SRichard Tran Mills 76*f2d7aa87SRichard Tran Mills #undef __FUNCT__ 77*f2d7aa87SRichard Tran Mills #define __FUNCT__ "ourglobaltolocalend" 78*f2d7aa87SRichard Tran Mills static PetscErrorCode ourglobaltolocalend(DM dm,Vec g,InsertMode mode,Vec l) 79*f2d7aa87SRichard Tran Mills { 80*f2d7aa87SRichard Tran Mills PetscObjectUseFortranCallback(dm,_cb.globaltolocalend,(DM*,Vec*,InsertMode*,Vec*,PetscErrorCode*),(&dm,g,&mode,l,&ierr)); 81*f2d7aa87SRichard Tran Mills return 0; 82*f2d7aa87SRichard Tran Mills } 83*f2d7aa87SRichard Tran Mills 84*f2d7aa87SRichard Tran Mills #undef __FUNCT__ 85*f2d7aa87SRichard Tran Mills #define __FUNCT__ "ourlocaltoglobalbegin" 86*f2d7aa87SRichard Tran Mills static PetscErrorCode ourlocaltoglobalbegin(DM dm,Vec l,InsertMode mode,Vec g) 87*f2d7aa87SRichard Tran Mills { 88*f2d7aa87SRichard Tran Mills PetscObjectUseFortranCallback(dm,_cb.localtoglobalbegin,(DM*,Vec*,InsertMode*,Vec*,PetscErrorCode*),(&dm,l,&mode,g,&ierr)); 89*f2d7aa87SRichard Tran Mills return 0; 90*f2d7aa87SRichard Tran Mills } 91*f2d7aa87SRichard Tran Mills 92*f2d7aa87SRichard Tran Mills #undef __FUNCT__ 93*f2d7aa87SRichard Tran Mills #define __FUNCT__ "ourlocaltoglobalend" 94*f2d7aa87SRichard Tran Mills static PetscErrorCode ourlocaltoglobalend(DM dm,Vec l,InsertMode mode,Vec g) 95*f2d7aa87SRichard Tran Mills { 96*f2d7aa87SRichard Tran Mills PetscObjectUseFortranCallback(dm,_cb.localtoglobalend,(DM*,Vec*,InsertMode*,Vec*,PetscErrorCode*),(&dm,l,&mode,g,&ierr)); 97*f2d7aa87SRichard Tran Mills return 0; 98*f2d7aa87SRichard Tran Mills } 99*f2d7aa87SRichard 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 } 120*f2d7aa87SRichard Tran Mills 121*f2d7aa87SRichard 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) 122*f2d7aa87SRichard Tran Mills { 123*f2d7aa87SRichard Tran Mills *ierr = PetscObjectSetFortranCallback((PetscObject)*dm,PETSC_FORTRAN_CALLBACK_SUBTYPE,&_cb.globaltolocalbegin,(PetscVoidFunction)begin,NULL); 124*f2d7aa87SRichard Tran Mills if (*ierr) return; 125*f2d7aa87SRichard Tran Mills *ierr = PetscObjectSetFortranCallback((PetscObject)*dm,PETSC_FORTRAN_CALLBACK_SUBTYPE,&_cb.globaltolocalend,(PetscVoidFunction)end,NULL); 126*f2d7aa87SRichard Tran Mills if (*ierr) return; 127*f2d7aa87SRichard Tran Mills *ierr = DMShellSetGlobalToLocal(*dm,ourglobaltolocalbegin,ourglobaltolocalend); 128*f2d7aa87SRichard Tran Mills } 129*f2d7aa87SRichard Tran Mills 130*f2d7aa87SRichard 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) 131*f2d7aa87SRichard Tran Mills { 132*f2d7aa87SRichard Tran Mills *ierr = PetscObjectSetFortranCallback((PetscObject)*dm,PETSC_FORTRAN_CALLBACK_SUBTYPE,&_cb.localtoglobalbegin,(PetscVoidFunction)begin,NULL); 133*f2d7aa87SRichard Tran Mills if (*ierr) return; 134*f2d7aa87SRichard Tran Mills *ierr = PetscObjectSetFortranCallback((PetscObject)*dm,PETSC_FORTRAN_CALLBACK_SUBTYPE,&_cb.localtoglobalend,(PetscVoidFunction)end,NULL); 135*f2d7aa87SRichard Tran Mills if (*ierr) return; 136*f2d7aa87SRichard Tran Mills *ierr = DMShellSetLocalToGlobal(*dm,ourglobaltolocalbegin,ourglobaltolocalend); 137*f2d7aa87SRichard Tran Mills } 138