> On 21 Oct 2019, at 7:52 AM, Smith, Barry F. <bsm...@mcs.anl.gov> wrote: > > > >> On Oct 21, 2019, at 12:23 AM, Pierre Jolivet <pierre.joli...@enseeiht.fr> >> wrote: >> >> >> >>> On 21 Oct 2019, at 7:11 AM, Smith, Barry F. <bsm...@mcs.anl.gov> wrote: >>> >>> >>> >>>> On Oct 20, 2019, at 11:52 PM, Pierre Jolivet <pierre.joli...@enseeiht.fr> >>>> wrote: >>>> >>>> >>>> >>>>> On 21 Oct 2019, at 6:42 AM, Smith, Barry F. <bsm...@mcs.anl.gov> wrote: >>>>> >>>>> Could you provide a use case where you want to access/have a block size >>>>> of a IS that is not an ISBlock? >>>> >>>> In the end, all I really want is get access to the underlying >>>> is->data->idx without having to worry about the subclass of is. >>>> I don’t have such a use case, but I don’t think this is really related to >>>> what I want to achieve (or maybe it is…). >>> >>> ISGetIndices() >> >> Not true for ISBlock with bs > 1. > > Certainly suppose to be, is there a bug? > > static PetscErrorCode ISGetIndices_Block(IS in,const PetscInt *idx[]) > { > IS_Block *sub = (IS_Block*)in->data; > PetscErrorCode ierr; > PetscInt i,j,k,bs,n,*ii,*jj; > > PetscFunctionBegin; > ierr = PetscLayoutGetBlockSize(in->map, &bs);CHKERRQ(ierr); > > Dang, there is that stupid layout stuff again. Who put this crap in. > > ierr = PetscLayoutGetLocalSize(in->map, &n);CHKERRQ(ierr); > n /= bs; > if (bs == 1) *idx = sub->idx; > else {
There it is, I don’t want this if/else. ISGetBlockIndices would have been a function always returning sub->idx. Thanks, Pierre > ierr = PetscMalloc1(bs*n,&jj);CHKERRQ(ierr); > *idx = jj; > k = 0; > ii = sub->idx; > for (i=0; i<n; i++) > for (j=0; j<bs; j++) > jj[k++] = bs*ii[i] + j; > } > PetscFunctionReturn(0); > } > > >> >>>> Again, my goal is just to avoid having to write something like: >>>> https://www.mcs.anl.gov/petsc/petsc-dev/src/vec/is/utils/isltog.c.html#line322 >>>> If things were done as in ISLocalToGlobalMapping (which I know is not the >>>> same at all as IS/ISBlock), I think this could just read: >>>> ISGetBlockIndices(is,&indices) >>>> ISLocalToGlobalMappingCreate(comm,bs,n/bs,indices,PETSC_COPY_VALUES,mapping) >>> >>> If you want your code to take advantage of the underlying structure of the >>> IS (be it strided, blocked) for optimizations then you HAVE to go through >>> the subclasses by design and nature (for example VecScatterCreate() takes >>> advantage of the structure of the IS as does >>> ISLocalToGlobalMappingCreate()). There is no universal concept of a block >>> size in IS (despite the crap that other people put in using PetscLayout >>> which has nothing to do with ISBlock and is completely buggy.) nor should >>> there be or is there a need for. >> >> OK then. >> >> Thanks, >> Pierre >> >>> Barry >>> >>> >>> >>> >>>> >>>> Thanks, >>>> Pierre >>>> >>>>> >>>>>> On Oct 16, 2019, at 2:50 AM, Pierre Jolivet via petsc-dev >>>>>> <petsc-dev@mcs.anl.gov> wrote: >>>>>> >>>>>> Hello, >>>>>> I’m trying to understand what is the rationale for naming a function >>>>>> ISBlockGetIndices and another ISLocalToGlobalMappingGetBlockIndices >>>>>> (BlockGet vs. GetBlock). >>>>>> Also, it looks to me like the implementation of ISBlockGetIndices is >>>>>> somehow less versatile than ISLocalToGlobalMappingGetBlockIndices. >>>>>> Indeed, I may call ISLocalToGlobalMappingGetBlockIndices with an >>>>>> underlying non-block IS, while I can’t for ISBlockGetIndices, so a check >>>>>> must be performed by the user, e.g., >>>>>> https://www.mcs.anl.gov/petsc/petsc-current/src/vec/is/is/examples/tutorials/ex3.c.html#line58 >>>>>> or this (IMHO) ugly code duplication >>>>>> https://www.mcs.anl.gov/petsc/petsc-dev/src/vec/is/utils/isltog.c.html#line322. >>>>>> >>>>>> Thoughts and/or comments? Would it make sense to add an >>>>>> ISGetBlockIndices/ISRestoreBlockIndices or would that be too confusing >>>>>> for the user? >>>>>> >>>>>> Thanks, >>>>>> Pierre