static PetscErrorCode VecSetUp_NestIS_Private(Vec V,PetscInt nb,IS is[]) { Vec_Nest *ctx = (Vec_Nest*)V->data; PetscInt i,offset,m,n,M,N; PetscErrorCode ierr; PetscFunctionBegin; if (is) { /* Do some consistency checks and reference the is */ offset = V->map->rstart; for (i=0; i<ctx->nb; i++) { ierr = ISGetSize(is[i],&M);CHKERRQ(ierr); ierr = VecGetSize(ctx->v[i],&N);CHKERRQ(ierr); if (M != N) SETERRQ3(PetscObjectComm((PetscObject)V),PETSC_ERR_ARG_INCOMP,"In slot %D, IS of size %D is not compatible with Vec of size %D",i,M,N); ierr = ISGetLocalSize(is[i],&m);CHKERRQ(ierr); ierr = VecGetLocalSize(ctx->v[i],&n);CHKERRQ(ierr); if (m != n) SETERRQ3(PETSC_COMM_SELF,PETSC_ERR_ARG_INCOMP,"In slot %D, IS of local size %D is not compatible with Vec of local size %D",i,m,n); #if defined(PETSC_USE_DEBUG) { /* This test can be expensive */ PetscInt start; PetscBool contiguous; ierr = ISContiguousLocal(is[i],offset,offset+n,&start,&contiguous);CHKERRQ(ierr); if (!contiguous) SETERRQ1(PetscObjectComm((PetscObject)V),PETSC_ERR_SUP,"Index set %D is not contiguous with layout of matching vector",i); if (start != 0) SETERRQ1(PetscObjectComm((PetscObject)V),PETSC_ERR_SUP,"Index set %D introduces overlap or a hole",i); } #endif ierr = PetscObjectReference((PetscObject)is[i]);CHKERRQ(ierr); ctx->is[i] = is[i]; offset += n; } } else { /* Create a contiguous ISStride for each entry */ offset = V->map->rstart; for (i=0; i<ctx->nb; i++) { PetscInt bs; ierr = VecGetLocalSize(ctx->v[i],&n);CHKERRQ(ierr); ierr = VecGetBlockSize(ctx->v[i],&bs);CHKERRQ(ierr); ierr = ISCreateStride(((PetscObject)ctx->v[i])->comm,n,offset,1,&ctx->is[i]);CHKERRQ(ierr); ierr = ISSetBlockSize(ctx->is[i],bs);CHKERRQ(ierr); offset += n; } } PetscFunctionReturn(0); }
void PETSC_STDCALL iscontiguouslocal_(IS is,PetscInt *gstart,PetscInt *gend,PetscInt *start,PetscBool *contig, int *__ierr ){ *__ierr = ISContiguousLocal( (IS)PetscToPointer((is) ),*gstart,*gend,start,contig); }