1af0996ceSBarry Smith #include <petsc/private/fortranimpl.h> 2cee688dbSBarry Smith #include <petsc/private/f90impl.h> 3c6db04a5SJed Brown #include <petscmat.h> 4665c2dedSJed Brown #include <petscviewer.h> 5f4e70085SSatish Balay 6f4e70085SSatish Balay #if defined(PETSC_HAVE_FORTRAN_CAPS) 77d6bfa3bSBarry Smith #define matdestroymatrices_ MATDESTROYMATRICES 8df750dc8SHong Zhang #define matdestroysubmatrices_ MATDESTROYSUBMATRICES 97dae84e0SHong Zhang #define matcreatesubmatrices_ MATCREATESUBMATRICES 1081ec7b92Smarius #define matcreatesubmatricesmpi_ MATCREATESUBMATRICESMPI 11b22b330cSBarry Smith #define matnullspacesetfunction_ MATNULLSPACESETFUNCTION 120905d9aaSJed Brown #define matfindnonzerorows_ MATFINDNONZEROROWS 13f4e70085SSatish Balay #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE) 145928be6bSBarry Smith #define matdestroymatrices_ matdestroymatrices 15df750dc8SHong Zhang #define matdestroysubmatrices_ matdestroysubmatrices 167dae84e0SHong Zhang #define matcreatesubmatrices_ matcreatesubmatrices 1781ec7b92Smarius #define matcreatesubmatricesmpi_ matcreatesubmatricesmpi 18b22b330cSBarry Smith #define matnullspacesetfunction_ matnullspacesetfunction 190905d9aaSJed Brown #define matfindnonzerorows_ matfindnonzerorows 20f4e70085SSatish Balay #endif 21f4e70085SSatish Balay 22b22b330cSBarry Smith static PetscErrorCode ournullfunction(MatNullSpace sp, Vec x, void *ctx) 23b22b330cSBarry Smith { 249566063dSJacob Faibussowitsch PetscCallFortranVoidFunction((*(void (*)(MatNullSpace *, Vec *, void *, PetscErrorCode *))(((PetscObject)sp)->fortran_func_pointers[0]))(&sp, &x, ctx, &ierr)); 253ba16761SJacob Faibussowitsch return PETSC_SUCCESS; 26b22b330cSBarry Smith } 27b22b330cSBarry Smith 2819caf8f3SSatish Balay PETSC_EXTERN void matnullspacesetfunction_(MatNullSpace *sp, PetscErrorCode (*rem)(MatNullSpace, Vec, void *), void *ctx, PetscErrorCode *ierr) 29b22b330cSBarry Smith { 30b22b330cSBarry Smith PetscObjectAllocateFortranPointers(*sp, 1); 318434afd1SBarry Smith ((PetscObject)*sp)->fortran_func_pointers[0] = (PetscVoidFn *)rem; 3226fbe8dcSKarl Rupp 33b22b330cSBarry Smith *ierr = MatNullSpaceSetFunction(*sp, ournullfunction, ctx); 34b22b330cSBarry Smith } 35b22b330cSBarry Smith 36*ce78bad3SBarry Smith PETSC_EXTERN void matcreatesubmatrices_(Mat *mat, PetscInt *n, IS *isrow, IS *iscol, MatReuse *scall, F90Array1d *ptr, PetscErrorCode *ierr PETSC_F90_2PTR_PROTO(ptrd)) 37f4e70085SSatish Balay { 38f4e70085SSatish Balay Mat *lsmat; 39f4e70085SSatish Balay 40f4e70085SSatish Balay if (*scall == MAT_INITIAL_MATRIX) { 417dae84e0SHong Zhang *ierr = MatCreateSubMatrices(*mat, *n, isrow, iscol, *scall, &lsmat); 42*ce78bad3SBarry Smith *ierr = F90Array1dCreate(lsmat, MPIU_FORTRANADDR, 1, *n + 1, ptr PETSC_F90_2PTR_PARAM(ptrd)); 43f4e70085SSatish Balay } else { 44*ce78bad3SBarry Smith *ierr = F90Array1dAccess(ptr, MPIU_FORTRANADDR, (void **)&lsmat PETSC_F90_2PTR_PARAM(ptrd)); 45*ce78bad3SBarry Smith *ierr = MatCreateSubMatrices(*mat, *n, isrow, iscol, *scall, &lsmat); 46f4e70085SSatish Balay } 47f4e70085SSatish Balay } 48f4e70085SSatish Balay 49*ce78bad3SBarry Smith PETSC_EXTERN void matcreatesubmatricesmpi_(Mat *mat, PetscInt *n, IS *isrow, IS *iscol, MatReuse *scall, F90Array1d *ptr, PetscErrorCode *ierr PETSC_F90_2PTR_PROTO(ptrd)) 5081ec7b92Smarius { 5181ec7b92Smarius Mat *lsmat; 5281ec7b92Smarius 5381ec7b92Smarius if (*scall == MAT_INITIAL_MATRIX) { 5481ec7b92Smarius *ierr = MatCreateSubMatricesMPI(*mat, *n, isrow, iscol, *scall, &lsmat); 55*ce78bad3SBarry Smith if (*ierr) return; 56*ce78bad3SBarry Smith *ierr = F90Array1dCreate(lsmat, MPIU_FORTRANADDR, 1, *n + 1, ptr PETSC_F90_2PTR_PARAM(ptrd)); 5781ec7b92Smarius } else { 58*ce78bad3SBarry Smith *ierr = F90Array1dAccess(ptr, MPIU_FORTRANADDR, (void **)&lsmat PETSC_F90_2PTR_PARAM(ptrd)); 59*ce78bad3SBarry Smith if (*ierr) return; 60*ce78bad3SBarry Smith *ierr = MatCreateSubMatricesMPI(*mat, *n, isrow, iscol, *scall, &lsmat); 6181ec7b92Smarius } 6281ec7b92Smarius } 6381ec7b92Smarius 64*ce78bad3SBarry Smith PETSC_EXTERN void matdestroymatrices_(PetscInt *n, F90Array1d *ptr, PetscErrorCode *ierr PETSC_F90_2PTR_PROTO(ptrd)) 65de7ef04eSHong Zhang { 66de7ef04eSHong Zhang PetscInt i; 67*ce78bad3SBarry Smith Mat *lsmat; 68de7ef04eSHong Zhang 69*ce78bad3SBarry Smith *ierr = F90Array1dAccess(ptr, MPIU_FORTRANADDR, (void **)&lsmat PETSC_F90_2PTR_PARAM(ptrd)); 705975b3b6SBarry Smith if (*ierr) return; 71*ce78bad3SBarry Smith for (i = 0; i < *n; i++) { 72*ce78bad3SBarry Smith PETSC_FORTRAN_OBJECT_F_DESTROYED_TO_C_NULL(&lsmat[i]); 73*ce78bad3SBarry Smith *ierr = MatDestroy(&lsmat[i]); 74*ce78bad3SBarry Smith if (*ierr) return; 75de7ef04eSHong Zhang } 76*ce78bad3SBarry Smith *ierr = F90Array1dDestroy(ptr, MPIU_FORTRANADDR PETSC_F90_2PTR_PARAM(ptrd)); 77*ce78bad3SBarry Smith if (*ierr) return; 78*ce78bad3SBarry Smith *ierr = PetscFree(lsmat); 79de7ef04eSHong Zhang } 80de7ef04eSHong Zhang 81*ce78bad3SBarry Smith PETSC_EXTERN void matdestroysubmatrices_(PetscInt *n, F90Array1d *ptr, PetscErrorCode *ierr PETSC_F90_2PTR_PROTO(ptrd)) 827d6bfa3bSBarry Smith { 83de7ef04eSHong Zhang Mat *lsmat; 847d6bfa3bSBarry Smith 850764c050SBarry Smith if (*n == 0) return; 86*ce78bad3SBarry Smith *ierr = F90Array1dAccess(ptr, MPIU_FORTRANADDR, (void **)&lsmat PETSC_F90_2PTR_PARAM(ptrd)); 875d83a8b1SBarry Smith if (*ierr) return; 88de7ef04eSHong Zhang *ierr = MatDestroySubMatrices(*n, &lsmat); 895d83a8b1SBarry Smith if (*ierr) return; 90*ce78bad3SBarry Smith *ierr = F90Array1dDestroy(ptr, MPIU_FORTRANADDR PETSC_F90_2PTR_PARAM(ptrd)); 91*ce78bad3SBarry Smith if (*ierr) return; 92*ce78bad3SBarry Smith *ierr = PetscFree(lsmat); 931fb7b255SJunchao Zhang } 94