xref: /petsc/src/mat/interface/ftn-custom/zmatrixf.c (revision 4e8208cbcbc709572b8abe32f33c78b69c819375)
16dd63270SBarry Smith #include <petsc/private/ftnimpl.h>
2c6db04a5SJed Brown #include <petscmat.h>
3665c2dedSJed Brown #include <petscviewer.h>
4f4e70085SSatish Balay 
5f4e70085SSatish Balay #if defined(PETSC_HAVE_FORTRAN_CAPS)
67d6bfa3bSBarry Smith   #define matdestroymatrices_      MATDESTROYMATRICES
7df750dc8SHong Zhang   #define matdestroysubmatrices_   MATDESTROYSUBMATRICES
87dae84e0SHong Zhang   #define matcreatesubmatrices_    MATCREATESUBMATRICES
981ec7b92Smarius   #define matcreatesubmatricesmpi_ MATCREATESUBMATRICESMPI
10b22b330cSBarry Smith   #define matnullspacesetfunction_ MATNULLSPACESETFUNCTION
110905d9aaSJed Brown   #define matfindnonzerorows_      MATFINDNONZEROROWS
12f4e70085SSatish Balay #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE)
135928be6bSBarry Smith   #define matdestroymatrices_      matdestroymatrices
14df750dc8SHong Zhang   #define matdestroysubmatrices_   matdestroysubmatrices
157dae84e0SHong Zhang   #define matcreatesubmatrices_    matcreatesubmatrices
1681ec7b92Smarius   #define matcreatesubmatricesmpi_ matcreatesubmatricesmpi
17b22b330cSBarry Smith   #define matnullspacesetfunction_ matnullspacesetfunction
180905d9aaSJed Brown   #define matfindnonzerorows_      matfindnonzerorows
19f4e70085SSatish Balay #endif
20f4e70085SSatish Balay 
ournullfunction(MatNullSpace sp,Vec x,PetscCtx ctx)21*2a8381b2SBarry Smith static PetscErrorCode ournullfunction(MatNullSpace sp, Vec x, PetscCtx ctx)
22b22b330cSBarry Smith {
239566063dSJacob Faibussowitsch   PetscCallFortranVoidFunction((*(void (*)(MatNullSpace *, Vec *, void *, PetscErrorCode *))(((PetscObject)sp)->fortran_func_pointers[0]))(&sp, &x, ctx, &ierr));
243ba16761SJacob Faibussowitsch   return PETSC_SUCCESS;
25b22b330cSBarry Smith }
26b22b330cSBarry Smith 
matnullspacesetfunction_(MatNullSpace * sp,PetscErrorCode (* rem)(MatNullSpace,Vec,void *),PetscCtx ctx,PetscErrorCode * ierr)27*2a8381b2SBarry Smith PETSC_EXTERN void matnullspacesetfunction_(MatNullSpace *sp, PetscErrorCode (*rem)(MatNullSpace, Vec, void *), PetscCtx ctx, PetscErrorCode *ierr)
28b22b330cSBarry Smith {
29b22b330cSBarry Smith   PetscObjectAllocateFortranPointers(*sp, 1);
305ebfa9e9SBarry Smith   ((PetscObject)*sp)->fortran_func_pointers[0] = (PetscFortranCallbackFn *)rem;
3126fbe8dcSKarl Rupp 
32b22b330cSBarry Smith   *ierr = MatNullSpaceSetFunction(*sp, ournullfunction, ctx);
33b22b330cSBarry Smith }
34b22b330cSBarry Smith 
matcreatesubmatrices_(Mat * mat,PetscInt * n,IS * isrow,IS * iscol,MatReuse * scall,F90Array1d * ptr,PetscErrorCode * ierr PETSC_F90_2PTR_PROTO (ptrd))35ce78bad3SBarry Smith PETSC_EXTERN void matcreatesubmatrices_(Mat *mat, PetscInt *n, IS *isrow, IS *iscol, MatReuse *scall, F90Array1d *ptr, PetscErrorCode *ierr PETSC_F90_2PTR_PROTO(ptrd))
36f4e70085SSatish Balay {
37f4e70085SSatish Balay   Mat *lsmat;
38f4e70085SSatish Balay 
39f4e70085SSatish Balay   if (*scall == MAT_INITIAL_MATRIX) {
407dae84e0SHong Zhang     *ierr = MatCreateSubMatrices(*mat, *n, isrow, iscol, *scall, &lsmat);
41ce78bad3SBarry Smith     *ierr = F90Array1dCreate(lsmat, MPIU_FORTRANADDR, 1, *n + 1, ptr PETSC_F90_2PTR_PARAM(ptrd));
42f4e70085SSatish Balay   } else {
43ce78bad3SBarry Smith     *ierr = F90Array1dAccess(ptr, MPIU_FORTRANADDR, (void **)&lsmat PETSC_F90_2PTR_PARAM(ptrd));
44ce78bad3SBarry Smith     *ierr = MatCreateSubMatrices(*mat, *n, isrow, iscol, *scall, &lsmat);
45f4e70085SSatish Balay   }
46f4e70085SSatish Balay }
47f4e70085SSatish Balay 
matcreatesubmatricesmpi_(Mat * mat,PetscInt * n,IS * isrow,IS * iscol,MatReuse * scall,F90Array1d * ptr,PetscErrorCode * ierr PETSC_F90_2PTR_PROTO (ptrd))48ce78bad3SBarry Smith PETSC_EXTERN void matcreatesubmatricesmpi_(Mat *mat, PetscInt *n, IS *isrow, IS *iscol, MatReuse *scall, F90Array1d *ptr, PetscErrorCode *ierr PETSC_F90_2PTR_PROTO(ptrd))
4981ec7b92Smarius {
5081ec7b92Smarius   Mat *lsmat;
5181ec7b92Smarius 
5281ec7b92Smarius   if (*scall == MAT_INITIAL_MATRIX) {
5381ec7b92Smarius     *ierr = MatCreateSubMatricesMPI(*mat, *n, isrow, iscol, *scall, &lsmat);
54ce78bad3SBarry Smith     if (*ierr) return;
55ce78bad3SBarry Smith     *ierr = F90Array1dCreate(lsmat, MPIU_FORTRANADDR, 1, *n + 1, ptr PETSC_F90_2PTR_PARAM(ptrd));
5681ec7b92Smarius   } else {
57ce78bad3SBarry Smith     *ierr = F90Array1dAccess(ptr, MPIU_FORTRANADDR, (void **)&lsmat PETSC_F90_2PTR_PARAM(ptrd));
58ce78bad3SBarry Smith     if (*ierr) return;
59ce78bad3SBarry Smith     *ierr = MatCreateSubMatricesMPI(*mat, *n, isrow, iscol, *scall, &lsmat);
6081ec7b92Smarius   }
6181ec7b92Smarius }
6281ec7b92Smarius 
matdestroymatrices_(PetscInt * n,F90Array1d * ptr,PetscErrorCode * ierr PETSC_F90_2PTR_PROTO (ptrd))63ce78bad3SBarry Smith PETSC_EXTERN void matdestroymatrices_(PetscInt *n, F90Array1d *ptr, PetscErrorCode *ierr PETSC_F90_2PTR_PROTO(ptrd))
64de7ef04eSHong Zhang {
65de7ef04eSHong Zhang   PetscInt i;
66ce78bad3SBarry Smith   Mat     *lsmat;
67de7ef04eSHong Zhang 
68ce78bad3SBarry Smith   *ierr = F90Array1dAccess(ptr, MPIU_FORTRANADDR, (void **)&lsmat PETSC_F90_2PTR_PARAM(ptrd));
695975b3b6SBarry Smith   if (*ierr) return;
70ce78bad3SBarry Smith   for (i = 0; i < *n; i++) {
71ce78bad3SBarry Smith     PETSC_FORTRAN_OBJECT_F_DESTROYED_TO_C_NULL(&lsmat[i]);
72ce78bad3SBarry Smith     *ierr = MatDestroy(&lsmat[i]);
73ce78bad3SBarry Smith     if (*ierr) return;
74de7ef04eSHong Zhang   }
75ce78bad3SBarry Smith   *ierr = F90Array1dDestroy(ptr, MPIU_FORTRANADDR PETSC_F90_2PTR_PARAM(ptrd));
76ce78bad3SBarry Smith   if (*ierr) return;
77ce78bad3SBarry Smith   *ierr = PetscFree(lsmat);
78de7ef04eSHong Zhang }
79de7ef04eSHong Zhang 
matdestroysubmatrices_(PetscInt * n,F90Array1d * ptr,PetscErrorCode * ierr PETSC_F90_2PTR_PROTO (ptrd))80ce78bad3SBarry Smith PETSC_EXTERN void matdestroysubmatrices_(PetscInt *n, F90Array1d *ptr, PetscErrorCode *ierr PETSC_F90_2PTR_PROTO(ptrd))
817d6bfa3bSBarry Smith {
82de7ef04eSHong Zhang   Mat *lsmat;
837d6bfa3bSBarry Smith 
840764c050SBarry Smith   if (*n == 0) return;
85ce78bad3SBarry Smith   *ierr = F90Array1dAccess(ptr, MPIU_FORTRANADDR, (void **)&lsmat PETSC_F90_2PTR_PARAM(ptrd));
865d83a8b1SBarry Smith   if (*ierr) return;
87de7ef04eSHong Zhang   *ierr = MatDestroySubMatrices(*n, &lsmat);
885d83a8b1SBarry Smith   if (*ierr) return;
89ce78bad3SBarry Smith   *ierr = F90Array1dDestroy(ptr, MPIU_FORTRANADDR PETSC_F90_2PTR_PARAM(ptrd));
90ce78bad3SBarry Smith   if (*ierr) return;
91ce78bad3SBarry Smith   *ierr = PetscFree(lsmat);
921fb7b255SJunchao Zhang }
93