xref: /petsc/src/mat/interface/ftn-custom/zmatrixf.c (revision ce78bad369055609e946c9d2c25ea67a45873e27)
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