int main(int argc,char **argv) { const PetscInt first[] = {0,2,3,5,8}, second[] = {1,3,4,8,10,11}; PetscInt *result,n; PetscErrorCode ierr; ierr = PetscInitialize(&argc,&argv,(char*)0,help);if (ierr) return ierr; ierr = PetscMergeIntArray(5,first,6,second,&n,&result);CHKERRQ(ierr); ierr = PetscIntView(n,result,PETSC_VIEWER_STDOUT_SELF);CHKERRQ(ierr); ierr = PetscFinalize(); return ierr; }
/* Produces a set of block column indices of the matrix block row, one for each block represented in the original set of rows ncollapsed - the number of block indices collapsed - the block indices (must be large enough to contain the indices) */ PETSC_STATIC_INLINE PetscErrorCode MatCollapseRows(Mat Amat,PetscInt start,PetscInt bs,PetscInt *w0,PetscInt *w1,PetscInt *w2,PetscInt *ncollapsed,PetscInt **collapsed) { PetscInt i,nprev,*cprev = w0,ncur = 0,*ccur = w1,*merged = w2,*cprevtmp; PetscErrorCode ierr; PetscFunctionBegin; ierr = MatCollapseRow(Amat,start,bs,&nprev,cprev);CHKERRQ(ierr); for (i=start+1; i<start+bs; i++) { ierr = MatCollapseRow(Amat,i,bs,&ncur,ccur);CHKERRQ(ierr); ierr = PetscMergeIntArray(nprev,cprev,ncur,ccur,&nprev,&merged);CHKERRQ(ierr); cprevtmp = cprev; cprev = merged; merged = cprevtmp; } *ncollapsed = nprev; if (collapsed) *collapsed = cprev; PetscFunctionReturn(0); }