xref: /petsc/src/mat/impls/nest/ftn-custom/zmatnestf.c (revision 351962e3a215c49532d878705c18fe99ed16b8fc)
1af0996ceSBarry Smith #include <petsc/private/fortranimpl.h>
245c38901SJed Brown #include <petscmat.h>
345c38901SJed Brown 
445c38901SJed Brown #if defined(PETSC_HAVE_FORTRAN_CAPS)
545c38901SJed Brown #define matcreatenest_                   MATCREATENEST
63a4d7b9aSSatish Balay #define matnestgetiss_                   MATNESTGETISS
7ffa9b3b1SVincent Le Chenadec #define matnestgetsubmats_               MATNESTGETSUBMATS
845c38901SJed Brown #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE)
945c38901SJed Brown #define matcreatenest_                   matcreatenest
103a4d7b9aSSatish Balay #define matnestgetiss_                   matnestgetiss
11ffa9b3b1SVincent Le Chenadec #define matnestgetsubmats_               matnestgetsubmats
1245c38901SJed Brown #endif
1345c38901SJed Brown 
148cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matcreatenest_(MPI_Fint *comm,PetscInt *nr,IS is_row[],PetscInt *nc,IS is_col[],Mat a[],Mat *B,int *ierr)
1545c38901SJed Brown {
1645c38901SJed Brown   CHKFORTRANNULLOBJECT(is_row);
1745c38901SJed Brown   CHKFORTRANNULLOBJECT(is_col);
1845c38901SJed Brown   *ierr = MatCreateNest(MPI_Comm_f2c(*comm),*nr,is_row,*nc,is_col,a,B);
1945c38901SJed Brown }
203a4d7b9aSSatish Balay 
213a4d7b9aSSatish Balay PETSC_EXTERN void PETSC_STDCALL  matnestgetiss_(Mat *A,IS rows[],IS cols[], int *ierr )
223a4d7b9aSSatish Balay {
233a4d7b9aSSatish Balay   CHKFORTRANNULLOBJECT(rows);
243a4d7b9aSSatish Balay   CHKFORTRANNULLOBJECT(cols);
253a4d7b9aSSatish Balay   *ierr = MatNestGetISs(*A,rows,cols);
263a4d7b9aSSatish Balay }
27ffa9b3b1SVincent Le Chenadec 
28ffa9b3b1SVincent Le Chenadec PETSC_EXTERN void PETSC_STDCALL matnestgetsubmats_(Mat *A,PetscInt *M,PetscInt *N,Mat *sub,int *ierr)
29ffa9b3b1SVincent Le Chenadec {
30*351962e3SVincent Le Chenadec   PetscInt i,j,m,n;
31ffa9b3b1SVincent Le Chenadec   Mat **mat;
32*351962e3SVincent Le Chenadec 
33*351962e3SVincent Le Chenadec   CHKFORTRANNULLINTEGER(M);
34*351962e3SVincent Le Chenadec   CHKFORTRANNULLINTEGER(N);
35*351962e3SVincent Le Chenadec   CHKFORTRANNULLOBJECT(sub);
36*351962e3SVincent Le Chenadec 
37*351962e3SVincent Le Chenadec   *ierr = MatNestGetSubMats(*A,&m,&n,&mat);
38*351962e3SVincent Le Chenadec 
39*351962e3SVincent Le Chenadec   if (M) {
40*351962e3SVincent Le Chenadec     *M = m;
41*351962e3SVincent Le Chenadec   }
42*351962e3SVincent Le Chenadec   if (N) {
43*351962e3SVincent Le Chenadec     *N = n;
44*351962e3SVincent Le Chenadec   }
45*351962e3SVincent Le Chenadec   if (sub) {
46*351962e3SVincent Le Chenadec     for (i=0; i<m; i++) {
47*351962e3SVincent Le Chenadec       for (j=0; j<n; j++) {
48*351962e3SVincent Le Chenadec         sub[j + n * i] = mat[i][j];
49*351962e3SVincent Le Chenadec       }
50ffa9b3b1SVincent Le Chenadec     }
51ffa9b3b1SVincent Le Chenadec   }
52ffa9b3b1SVincent Le Chenadec }
53