1*6dd63270SBarry Smith #include <petsc/private/ftnimpl.h> 245c38901SJed Brown #include <petscmat.h> 345c38901SJed Brown 445c38901SJed Brown #if defined(PETSC_HAVE_FORTRAN_CAPS) 545c38901SJed Brown #define matcreatenest_ MATCREATENEST 6ffa9b3b1SVincent Le Chenadec #define matnestgetsubmats_ MATNESTGETSUBMATS 745c38901SJed Brown #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE) 845c38901SJed Brown #define matcreatenest_ matcreatenest 9ffa9b3b1SVincent Le Chenadec #define matnestgetsubmats_ matnestgetsubmats 1045c38901SJed Brown #endif 1145c38901SJed Brown 12ce78bad3SBarry Smith PETSC_EXTERN void matcreatenestNOTTODAY_(MPI_Fint *comm, PetscInt *nr, IS is_row[], PetscInt *nc, IS is_col[], Mat a[], Mat *B, int *ierr) 1345c38901SJed Brown { 142f6eced2SAlex Fikl Mat *m, *tmp; 152f6eced2SAlex Fikl PetscInt i; 162f6eced2SAlex Fikl 1745c38901SJed Brown CHKFORTRANNULLOBJECT(is_row); 1845c38901SJed Brown CHKFORTRANNULLOBJECT(is_col); 192f6eced2SAlex Fikl 205975b3b6SBarry Smith *ierr = PetscMalloc1((*nr) * (*nc), &m); 215975b3b6SBarry Smith if (*ierr) return; 222f6eced2SAlex Fikl for (i = 0; i < (*nr) * (*nc); i++) { 23f4f49eeaSPierre Jolivet tmp = &a[i]; 242f6eced2SAlex Fikl CHKFORTRANNULLOBJECT(tmp); 252f6eced2SAlex Fikl m[i] = (tmp == NULL ? NULL : a[i]); 262f6eced2SAlex Fikl } 275975b3b6SBarry Smith *ierr = MatCreateNest(MPI_Comm_f2c(*comm), *nr, is_row, *nc, is_col, m, B); 285975b3b6SBarry Smith if (*ierr) return; 292f6eced2SAlex Fikl *ierr = PetscFree(m); 3045c38901SJed Brown } 313a4d7b9aSSatish Balay 3219caf8f3SSatish Balay PETSC_EXTERN void matnestgetsubmats_(Mat *A, PetscInt *M, PetscInt *N, Mat *sub, int *ierr) 33ffa9b3b1SVincent Le Chenadec { 34351962e3SVincent Le Chenadec PetscInt i, j, m, n; 35ffa9b3b1SVincent Le Chenadec Mat **mat; 36351962e3SVincent Le Chenadec 37351962e3SVincent Le Chenadec CHKFORTRANNULLINTEGER(M); 38351962e3SVincent Le Chenadec CHKFORTRANNULLINTEGER(N); 39351962e3SVincent Le Chenadec CHKFORTRANNULLOBJECT(sub); 40351962e3SVincent Le Chenadec 41351962e3SVincent Le Chenadec *ierr = MatNestGetSubMats(*A, &m, &n, &mat); 42351962e3SVincent Le Chenadec 435975b3b6SBarry Smith if (M) { *M = m; } 445975b3b6SBarry Smith if (N) { *N = n; } 45351962e3SVincent Le Chenadec if (sub) { 46351962e3SVincent Le Chenadec for (i = 0; i < m; i++) { 47351962e3SVincent Le Chenadec for (j = 0; j < n; j++) { 482f6eced2SAlex Fikl if (mat[i][j]) { 49351962e3SVincent Le Chenadec sub[j + n * i] = mat[i][j]; 502f6eced2SAlex Fikl } else { 511c8b34f3SBarry Smith sub[j + n * i] = (Mat)-1; 522f6eced2SAlex Fikl } 53351962e3SVincent Le Chenadec } 54ffa9b3b1SVincent Le Chenadec } 55ffa9b3b1SVincent Le Chenadec } 56ffa9b3b1SVincent Le Chenadec } 57