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_ 70ec63f53SRichard Tran Mills #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE) 80ec63f53SRichard Tran Mills #define dmshellsetcreatematrix_ dmshellsetcreatematrix 90ec63f53SRichard Tran Mills #define dmshellsetcreateglobalvector_ dmshellsetcreateglobalvector 100ec63f53SRichard Tran Mills #endif 110ec63f53SRichard Tran Mills 120ec63f53SRichard Tran Mills /* 130ec63f53SRichard Tran Mills C routines are required for matrix and global vector creation. 140ec63f53SRichard Tran Mills We define C routines here that call the corresponding Fortran routine (stashed 150ec63f53SRichard Tran Mills in dm->fortran_func_pointers) that was set by the user. 160ec63f53SRichard Tran Mills 170ec63f53SRichard Tran Mills dm->fortran_func_pointers usage: 180ec63f53SRichard Tran Mills 190ec63f53SRichard Tran Mills 0: ourcreatematrix 200ec63f53SRichard Tran Mills 1: ourcreateglobalvector 210ec63f53SRichard Tran Mills */ 220ec63f53SRichard Tran Mills 230ec63f53SRichard Tran Mills static PetscErrorCode ourcreatematrix(DM dm,MatType type,Mat *A) 240ec63f53SRichard Tran Mills { 250ec63f53SRichard Tran Mills PetscErrorCode ierr = 0; 260ec63f53SRichard Tran Mills (*(PetscErrorCode (PETSC_STDCALL *)(DM*,MatType*,Mat*,PetscErrorCode*))(((PetscObject)dm)->fortran_func_pointers[0]))(&dm,&type,A,&ierr); 270ec63f53SRichard Tran Mills return ierr; 280ec63f53SRichard Tran Mills } 290ec63f53SRichard Tran Mills 300ec63f53SRichard Tran Mills static PetscErrorCode ourcreateglobalvector(DM dm,Vec *v) 310ec63f53SRichard Tran Mills { 320ec63f53SRichard Tran Mills PetscErrorCode ierr = 0; 330ec63f53SRichard Tran Mills (*(PetscErrorCode (PETSC_STDCALL *)(DM*,Vec*,PetscErrorCode*))(((PetscObject)dm)->fortran_func_pointers[1]))(&dm,v,&ierr); 340ec63f53SRichard Tran Mills return ierr; 350ec63f53SRichard Tran Mills } 360ec63f53SRichard Tran Mills 370ec63f53SRichard Tran Mills EXTERN_C_BEGIN 380ec63f53SRichard Tran Mills 390ec63f53SRichard Tran Mills void PETSC_STDCALL dmshellsetcreatematrix_(DM *dm,void (PETSC_STDCALL *func)(DM*,MatType*,Mat*,PetscErrorCode*),PetscErrorCode *ierr) 400ec63f53SRichard Tran Mills { 410ec63f53SRichard Tran Mills PetscObjectAllocateFortranPointers(*dm,2); 420ec63f53SRichard Tran Mills ((PetscObject)*dm)->fortran_func_pointers[0] = (PetscVoidFunction) func; 430ec63f53SRichard Tran Mills *ierr = DMShellSetCreateMatrix(*dm,ourcreatematrix); 440ec63f53SRichard Tran Mills } 450ec63f53SRichard Tran Mills 460ec63f53SRichard Tran Mills void PETSC_STDCALL dmshellsetcreateglobalvector_(DM *dm,void (PETSC_STDCALL *func)(DM*,Vec*,PetscErrorCode*),PetscErrorCode *ierr) 470ec63f53SRichard Tran Mills { 480ec63f53SRichard Tran Mills PetscObjectAllocateFortranPointers(*dm,2); 490ec63f53SRichard Tran Mills ((PetscObject)*dm)->fortran_func_pointers[1] = (PetscVoidFunction) func; 500ec63f53SRichard Tran Mills *ierr = DMShellSetCreateGlobalVector(*dm,ourcreateglobalvector); 510ec63f53SRichard Tran Mills } 52*fa59e805SSatish Balay 53*fa59e805SSatish Balay EXTERN_C_END 54