PetscErrorCode MatGetOrdering_myordering(Mat mat,MatOrderingType type,IS *irow,IS *icol) { PetscErrorCode ierr; PetscInt n,i,*ii; PetscBool done; MPI_Comm comm; PetscFunctionBegin; ierr = PetscObjectGetComm((PetscObject)mat,&comm); CHKERRQ(ierr); ierr = MatGetRowIJ(mat,0,PETSC_FALSE,PETSC_TRUE,&n,NULL,NULL,&done); CHKERRQ(ierr); ierr = MatRestoreRowIJ(mat,0,PETSC_FALSE,PETSC_TRUE,NULL,NULL,NULL,&done); CHKERRQ(ierr); if (done) { /* matrix may be "compressed" in symbolic factorization, due to i-nodes or block storage */ ierr = PetscMalloc(n*sizeof(PetscInt),&ii); CHKERRQ(ierr); for (i=0; i<n; i++) ii[i] = n-i-1; /* replace your index here */ ierr = ISCreateGeneral(PETSC_COMM_SELF,n,ii,PETSC_COPY_VALUES,irow); CHKERRQ(ierr); ierr = ISCreateGeneral(PETSC_COMM_SELF,n,ii,PETSC_OWN_POINTER,icol); CHKERRQ(ierr); } else SETERRQ(PETSC_COMM_WORLD,PETSC_ERR_SUP,"MatRestoreRowIJ fails!"); ierr = ISSetIdentity(*irow); CHKERRQ(ierr); ierr = ISSetIdentity(*icol); CHKERRQ(ierr); ierr = ISSetPermutation(*irow); CHKERRQ(ierr); ierr = ISSetPermutation(*icol); CHKERRQ(ierr); PetscFunctionReturn(0); }
int main(int argc,char **argv) { PetscMPIInt rank,size; PetscInt i,n,*indices; const PetscInt *ii; IS is,newis; PetscBool flg; PetscErrorCode ierr; ierr = PetscInitialize(&argc,&argv,(char*)0,help);if (ierr) return ierr; ierr = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRQ(ierr); ierr = MPI_Comm_size(PETSC_COMM_WORLD,&size);CHKERRQ(ierr); /* Test IS of size 0 */ ierr = ISCreateGeneral(PETSC_COMM_SELF,0,&n,PETSC_COPY_VALUES,&is);CHKERRQ(ierr); ierr = ISGetSize(is,&n);CHKERRQ(ierr); if (n != 0) SETERRQ(PETSC_COMM_SELF,1,"ISGetSize"); ierr = ISDestroy(&is);CHKERRQ(ierr); /* Create large IS and test ISGetIndices() */ n = 10000 + rank; ierr = PetscMalloc1(n,&indices);CHKERRQ(ierr); for (i=0; i<n; i++) indices[i] = rank + i; ierr = ISCreateGeneral(PETSC_COMM_SELF,n,indices,PETSC_COPY_VALUES,&is);CHKERRQ(ierr); ierr = ISGetIndices(is,&ii);CHKERRQ(ierr); for (i=0; i<n; i++) { if (ii[i] != indices[i]) SETERRQ(PETSC_COMM_SELF,1,"ISGetIndices"); } ierr = ISRestoreIndices(is,&ii);CHKERRQ(ierr); /* Check identity and permutation */ ierr = ISPermutation(is,&flg);CHKERRQ(ierr); if (flg) SETERRQ(PETSC_COMM_SELF,1,"ISPermutation"); ierr = ISIdentity(is,&flg);CHKERRQ(ierr); if (!flg) SETERRQ(PETSC_COMM_SELF,1,"ISIdentity"); ierr = ISSetPermutation(is);CHKERRQ(ierr); ierr = ISSetIdentity(is);CHKERRQ(ierr); ierr = ISPermutation(is,&flg);CHKERRQ(ierr); if (!flg) SETERRQ(PETSC_COMM_SELF,1,"ISPermutation"); ierr = ISIdentity(is,&flg);CHKERRQ(ierr); if (!flg) SETERRQ(PETSC_COMM_SELF,1,"ISIdentity"); /* Check equality of index sets */ ierr = ISEqual(is,is,&flg);CHKERRQ(ierr); if (!flg) SETERRQ(PETSC_COMM_SELF,1,"ISEqual"); /* Sorting */ ierr = ISSort(is);CHKERRQ(ierr); ierr = ISSorted(is,&flg);CHKERRQ(ierr); if (!flg) SETERRQ(PETSC_COMM_SELF,1,"ISSort"); /* Thinks it is a different type? */ ierr = PetscObjectTypeCompare((PetscObject)is,ISSTRIDE,&flg);CHKERRQ(ierr); if (flg) SETERRQ(PETSC_COMM_SELF,1,"ISStride"); ierr = PetscObjectTypeCompare((PetscObject)is,ISBLOCK,&flg);CHKERRQ(ierr); if (flg) SETERRQ(PETSC_COMM_SELF,1,"ISBlock"); ierr = ISDestroy(&is);CHKERRQ(ierr); /* Inverting permutation */ for (i=0; i<n; i++) indices[i] = n - i - 1; ierr = ISCreateGeneral(PETSC_COMM_SELF,n,indices,PETSC_COPY_VALUES,&is);CHKERRQ(ierr); ierr = PetscFree(indices);CHKERRQ(ierr); ierr = ISSetPermutation(is);CHKERRQ(ierr); ierr = ISInvertPermutation(is,PETSC_DECIDE,&newis);CHKERRQ(ierr); ierr = ISGetIndices(newis,&ii);CHKERRQ(ierr); for (i=0; i<n; i++) { if (ii[i] != n - i - 1) SETERRQ(PETSC_COMM_SELF,1,"ISInvertPermutation"); } ierr = ISRestoreIndices(newis,&ii);CHKERRQ(ierr); ierr = ISDestroy(&newis);CHKERRQ(ierr); ierr = ISDestroy(&is);CHKERRQ(ierr); ierr = PetscFinalize(); return ierr; }
void PETSC_STDCALL issetidentity_(IS is, int *__ierr ){ *__ierr = ISSetIdentity( (IS)PetscToPointer((is) )); }