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_ 10*f3db62a7SRichard 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 17*f3db62a7SRichard 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; 33*f3db62a7SRichard Tran Mills PetscFortranCallbackId localtolocalbegin; 34*f3db62a7SRichard Tran Mills PetscFortranCallbackId localtolocalend; 35dc43b69eSJed Brown } _cb; 36dc43b69eSJed Brown 37de64c4c2SJed Brown #undef __FUNCT__ 38de64c4c2SJed Brown #define __FUNCT__ "ourcreatematrix" 390ec63f53SRichard Tran Mills static PetscErrorCode ourcreatematrix(DM dm,MatType type,Mat *A) 400ec63f53SRichard Tran Mills { 41dc43b69eSJed Brown int len; 42dc43b69eSJed Brown char *ftype = (char*)type; 43dc43b69eSJed Brown if (type) { 44dc43b69eSJed Brown size_t slen; 45dc43b69eSJed Brown PetscStrlen(type,&slen); 46dc43b69eSJed Brown len = (int)slen; 47dc43b69eSJed Brown } else { 48dc43b69eSJed Brown type = PETSC_NULL_CHARACTER_Fortran; 49dc43b69eSJed Brown len = 0; 50dc43b69eSJed Brown } 5117da0f0dSJed Brown PetscObjectUseFortranCallbackSubType(dm,_cb.creatematrix,(DM*,CHAR PETSC_MIXED_LEN_PROTO,Mat*,PetscErrorCode* PETSC_END_LEN_PROTO), 52dc43b69eSJed Brown (&dm,ftype PETSC_MIXED_LEN_CALL(len),A,&ierr PETSC_END_LEN_CALL(len))); 53dc43b69eSJed Brown return 0; 540ec63f53SRichard Tran Mills } 550ec63f53SRichard Tran Mills 56de64c4c2SJed Brown #undef __FUNCT__ 57de64c4c2SJed Brown #define __FUNCT__ "ourcreateglobalvector" 580ec63f53SRichard Tran Mills static PetscErrorCode ourcreateglobalvector(DM dm,Vec *v) 590ec63f53SRichard Tran Mills { 6017da0f0dSJed Brown PetscObjectUseFortranCallbackSubType(dm,_cb.createglobalvector,(DM*,Vec*,PetscErrorCode*),(&dm,v,&ierr)); 61dc43b69eSJed Brown return 0; 620ec63f53SRichard Tran Mills } 630ec63f53SRichard Tran Mills 64de64c4c2SJed Brown #undef __FUNCT__ 65de64c4c2SJed Brown #define __FUNCT__ "ourcreatelocalvector" 66dc43b69eSJed Brown static PetscErrorCode ourcreatelocalvector(DM dm,Vec *v) 670ec63f53SRichard Tran Mills { 6817da0f0dSJed Brown PetscObjectUseFortranCallbackSubType(dm,_cb.createlocalvector,(DM*,Vec*,PetscErrorCode*),(&dm,v,&ierr)); 69dc43b69eSJed Brown return 0; 70dc43b69eSJed Brown } 71dc43b69eSJed Brown 72f2d7aa87SRichard Tran Mills #undef __FUNCT__ 73f2d7aa87SRichard Tran Mills #define __FUNCT__ "ourglobaltolocalbegin" 74f2d7aa87SRichard Tran Mills static PetscErrorCode ourglobaltolocalbegin(DM dm,Vec g,InsertMode mode,Vec l) 75f2d7aa87SRichard Tran Mills { 7617da0f0dSJed Brown PetscObjectUseFortranCallbackSubType(dm,_cb.globaltolocalbegin,(DM*,Vec*,InsertMode*,Vec*,PetscErrorCode*),(&dm,&g,&mode,&l,&ierr)); 77f2d7aa87SRichard Tran Mills return 0; 78f2d7aa87SRichard Tran Mills } 79f2d7aa87SRichard Tran Mills 80f2d7aa87SRichard Tran Mills #undef __FUNCT__ 81f2d7aa87SRichard Tran Mills #define __FUNCT__ "ourglobaltolocalend" 82f2d7aa87SRichard Tran Mills static PetscErrorCode ourglobaltolocalend(DM dm,Vec g,InsertMode mode,Vec l) 83f2d7aa87SRichard Tran Mills { 8417da0f0dSJed Brown PetscObjectUseFortranCallbackSubType(dm,_cb.globaltolocalend,(DM*,Vec*,InsertMode*,Vec*,PetscErrorCode*),(&dm,&g,&mode,&l,&ierr)); 85f2d7aa87SRichard Tran Mills return 0; 86f2d7aa87SRichard Tran Mills } 87f2d7aa87SRichard Tran Mills 88f2d7aa87SRichard Tran Mills #undef __FUNCT__ 89f2d7aa87SRichard Tran Mills #define __FUNCT__ "ourlocaltoglobalbegin" 90f2d7aa87SRichard Tran Mills static PetscErrorCode ourlocaltoglobalbegin(DM dm,Vec l,InsertMode mode,Vec g) 91f2d7aa87SRichard Tran Mills { 9217da0f0dSJed Brown PetscObjectUseFortranCallbackSubType(dm,_cb.localtoglobalbegin,(DM*,Vec*,InsertMode*,Vec*,PetscErrorCode*),(&dm,&l,&mode,&g,&ierr)); 93f2d7aa87SRichard Tran Mills return 0; 94f2d7aa87SRichard Tran Mills } 95f2d7aa87SRichard Tran Mills 96f2d7aa87SRichard Tran Mills #undef __FUNCT__ 97f2d7aa87SRichard Tran Mills #define __FUNCT__ "ourlocaltoglobalend" 98f2d7aa87SRichard Tran Mills static PetscErrorCode ourlocaltoglobalend(DM dm,Vec l,InsertMode mode,Vec g) 99f2d7aa87SRichard Tran Mills { 10017da0f0dSJed Brown PetscObjectUseFortranCallbackSubType(dm,_cb.localtoglobalend,(DM*,Vec*,InsertMode*,Vec*,PetscErrorCode*),(&dm,&l,&mode,&g,&ierr)); 101f2d7aa87SRichard Tran Mills return 0; 102f2d7aa87SRichard Tran Mills } 103f2d7aa87SRichard Tran Mills 104*f3db62a7SRichard Tran Mills #undef __FUNCT__ 105*f3db62a7SRichard Tran Mills #define __FUNCT__ "ourlocaltolocalbegin" 106*f3db62a7SRichard Tran Mills static PetscErrorCode ourlocaltolocalbegin(DM dm,Vec g,InsertMode mode,Vec l) 107*f3db62a7SRichard Tran Mills { 108*f3db62a7SRichard Tran Mills PetscObjectUseFortranCallbackSubType(dm,_cb.localtolocalbegin,(DM*,Vec*,InsertMode*,Vec*,PetscErrorCode*),(&dm,&g,&mode,&l,&ierr)); 109*f3db62a7SRichard Tran Mills return 0; 110*f3db62a7SRichard Tran Mills } 111*f3db62a7SRichard Tran Mills 112*f3db62a7SRichard Tran Mills #undef __FUNCT__ 113*f3db62a7SRichard Tran Mills #define __FUNCT__ "ourlocaltolocalend" 114*f3db62a7SRichard Tran Mills static PetscErrorCode ourlocaltolocalend(DM dm,Vec g,InsertMode mode,Vec l) 115*f3db62a7SRichard Tran Mills { 116*f3db62a7SRichard Tran Mills PetscObjectUseFortranCallbackSubType(dm,_cb.localtolocalend,(DM*,Vec*,InsertMode*,Vec*,PetscErrorCode*),(&dm,&g,&mode,&l,&ierr)); 117*f3db62a7SRichard Tran Mills return 0; 118*f3db62a7SRichard Tran Mills } 119*f3db62a7SRichard Tran Mills 120*f3db62a7SRichard Tran Mills 1218cc058d9SJed Brown PETSC_EXTERN 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) 122dc43b69eSJed Brown { 1230298fd71SBarry Smith *ierr = PetscObjectSetFortranCallback((PetscObject)*dm,PETSC_FORTRAN_CALLBACK_SUBTYPE,&_cb.creatematrix,(PetscVoidFunction)func,NULL); 124dc43b69eSJed Brown if (*ierr) return; 1250ec63f53SRichard Tran Mills *ierr = DMShellSetCreateMatrix(*dm,ourcreatematrix); 1260ec63f53SRichard Tran Mills } 1270ec63f53SRichard Tran Mills 1288cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL dmshellsetcreateglobalvector_(DM *dm,void (PETSC_STDCALL *func)(DM*,Vec*,PetscErrorCode*),PetscErrorCode *ierr) 1290ec63f53SRichard Tran Mills { 1300298fd71SBarry Smith *ierr = PetscObjectSetFortranCallback((PetscObject)*dm,PETSC_FORTRAN_CALLBACK_SUBTYPE,&_cb.createglobalvector,(PetscVoidFunction)func,NULL); 131dc43b69eSJed Brown if (*ierr) return; 1320ec63f53SRichard Tran Mills *ierr = DMShellSetCreateGlobalVector(*dm,ourcreateglobalvector); 1330ec63f53SRichard Tran Mills } 134fa59e805SSatish Balay 1358cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL dmshellsetcreatelocalvector_(DM *dm,void (PETSC_STDCALL *func)(DM*,Vec*,PetscErrorCode*),PetscErrorCode *ierr) 136dc43b69eSJed Brown { 1370298fd71SBarry Smith *ierr = PetscObjectSetFortranCallback((PetscObject)*dm,PETSC_FORTRAN_CALLBACK_SUBTYPE,&_cb.createlocalvector,(PetscVoidFunction)func,NULL); 138dc43b69eSJed Brown if (*ierr) return; 139dc43b69eSJed Brown *ierr = DMShellSetCreateLocalVector(*dm,ourcreatelocalvector); 140dc43b69eSJed Brown } 141f2d7aa87SRichard Tran Mills 1428cc058d9SJed 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) 143f2d7aa87SRichard Tran Mills { 144f2d7aa87SRichard Tran Mills *ierr = PetscObjectSetFortranCallback((PetscObject)*dm,PETSC_FORTRAN_CALLBACK_SUBTYPE,&_cb.globaltolocalbegin,(PetscVoidFunction)begin,NULL); 145f2d7aa87SRichard Tran Mills if (*ierr) return; 146f2d7aa87SRichard Tran Mills *ierr = PetscObjectSetFortranCallback((PetscObject)*dm,PETSC_FORTRAN_CALLBACK_SUBTYPE,&_cb.globaltolocalend,(PetscVoidFunction)end,NULL); 147f2d7aa87SRichard Tran Mills if (*ierr) return; 148f2d7aa87SRichard Tran Mills *ierr = DMShellSetGlobalToLocal(*dm,ourglobaltolocalbegin,ourglobaltolocalend); 149f2d7aa87SRichard Tran Mills } 150f2d7aa87SRichard Tran Mills 1518cc058d9SJed 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) 152f2d7aa87SRichard Tran Mills { 153f2d7aa87SRichard Tran Mills *ierr = PetscObjectSetFortranCallback((PetscObject)*dm,PETSC_FORTRAN_CALLBACK_SUBTYPE,&_cb.localtoglobalbegin,(PetscVoidFunction)begin,NULL); 154f2d7aa87SRichard Tran Mills if (*ierr) return; 155f2d7aa87SRichard Tran Mills *ierr = PetscObjectSetFortranCallback((PetscObject)*dm,PETSC_FORTRAN_CALLBACK_SUBTYPE,&_cb.localtoglobalend,(PetscVoidFunction)end,NULL); 156f2d7aa87SRichard Tran Mills if (*ierr) return; 15717da0f0dSJed Brown *ierr = DMShellSetLocalToGlobal(*dm,ourlocaltoglobalbegin,ourlocaltoglobalend); 158f2d7aa87SRichard Tran Mills } 159*f3db62a7SRichard Tran Mills 160*f3db62a7SRichard 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) 161*f3db62a7SRichard Tran Mills { 162*f3db62a7SRichard Tran Mills *ierr = PetscObjectSetFortranCallback((PetscObject)*dm,PETSC_FORTRAN_CALLBACK_SUBTYPE,&_cb.localtolocalbegin,(PetscVoidFunction)begin,NULL); 163*f3db62a7SRichard Tran Mills if (*ierr) return; 164*f3db62a7SRichard Tran Mills *ierr = PetscObjectSetFortranCallback((PetscObject)*dm,PETSC_FORTRAN_CALLBACK_SUBTYPE,&_cb.localtolocalend,(PetscVoidFunction)end,NULL); 165*f3db62a7SRichard Tran Mills if (*ierr) return; 166*f3db62a7SRichard Tran Mills *ierr = DMShellSetLocalToLocal(*dm,ourlocaltolocalbegin,ourlocaltolocalend); 167*f3db62a7SRichard Tran Mills } 168