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