xref: /petsc/src/mat/impls/nest/ftn-custom/zmatnestf.c (revision f4f49eeac7efa77fffa46b7ff95a3ed169f659ed)
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 
1419caf8f3SSatish Balay PETSC_EXTERN void matcreatenest_(MPI_Fint *comm, PetscInt *nr, IS is_row[], PetscInt *nc, IS is_col[], Mat a[], Mat *B, int *ierr)
1545c38901SJed Brown {
162f6eced2SAlex Fikl   Mat     *m, *tmp;
172f6eced2SAlex Fikl   PetscInt i;
182f6eced2SAlex Fikl 
1945c38901SJed Brown   CHKFORTRANNULLOBJECT(is_row);
2045c38901SJed Brown   CHKFORTRANNULLOBJECT(is_col);
212f6eced2SAlex Fikl 
225975b3b6SBarry Smith   *ierr = PetscMalloc1((*nr) * (*nc), &m);
235975b3b6SBarry Smith   if (*ierr) return;
242f6eced2SAlex Fikl   for (i = 0; i < (*nr) * (*nc); i++) {
25*f4f49eeaSPierre Jolivet     tmp = &a[i];
262f6eced2SAlex Fikl     CHKFORTRANNULLOBJECT(tmp);
272f6eced2SAlex Fikl     m[i] = (tmp == NULL ? NULL : a[i]);
282f6eced2SAlex Fikl   }
295975b3b6SBarry Smith   *ierr = MatCreateNest(MPI_Comm_f2c(*comm), *nr, is_row, *nc, is_col, m, B);
305975b3b6SBarry Smith   if (*ierr) return;
312f6eced2SAlex Fikl   *ierr = PetscFree(m);
3245c38901SJed Brown }
333a4d7b9aSSatish Balay 
3419caf8f3SSatish Balay PETSC_EXTERN void matnestgetiss_(Mat *A, IS rows[], IS cols[], int *ierr)
353a4d7b9aSSatish Balay {
363a4d7b9aSSatish Balay   CHKFORTRANNULLOBJECT(rows);
373a4d7b9aSSatish Balay   CHKFORTRANNULLOBJECT(cols);
383a4d7b9aSSatish Balay   *ierr = MatNestGetISs(*A, rows, cols);
393a4d7b9aSSatish Balay }
40ffa9b3b1SVincent Le Chenadec 
4119caf8f3SSatish Balay PETSC_EXTERN void matnestgetsubmats_(Mat *A, PetscInt *M, PetscInt *N, Mat *sub, int *ierr)
42ffa9b3b1SVincent Le Chenadec {
43351962e3SVincent Le Chenadec   PetscInt i, j, m, n;
44ffa9b3b1SVincent Le Chenadec   Mat    **mat;
45351962e3SVincent Le Chenadec 
46351962e3SVincent Le Chenadec   CHKFORTRANNULLINTEGER(M);
47351962e3SVincent Le Chenadec   CHKFORTRANNULLINTEGER(N);
48351962e3SVincent Le Chenadec   CHKFORTRANNULLOBJECT(sub);
49351962e3SVincent Le Chenadec 
50351962e3SVincent Le Chenadec   *ierr = MatNestGetSubMats(*A, &m, &n, &mat);
51351962e3SVincent Le Chenadec 
525975b3b6SBarry Smith   if (M) { *M = m; }
535975b3b6SBarry Smith   if (N) { *N = n; }
54351962e3SVincent Le Chenadec   if (sub) {
55351962e3SVincent Le Chenadec     for (i = 0; i < m; i++) {
56351962e3SVincent Le Chenadec       for (j = 0; j < n; j++) {
572f6eced2SAlex Fikl         if (mat[i][j]) {
58351962e3SVincent Le Chenadec           sub[j + n * i] = mat[i][j];
592f6eced2SAlex Fikl         } else {
601c8b34f3SBarry Smith           sub[j + n * i] = (Mat)-1;
612f6eced2SAlex Fikl         }
62351962e3SVincent Le Chenadec       }
63ffa9b3b1SVincent Le Chenadec     }
64ffa9b3b1SVincent Le Chenadec   }
65ffa9b3b1SVincent Le Chenadec }
66