<div dir="ltr"><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Feb 13, 2013 at 7:31 AM, Barry Smith <span dir="ltr"><<a href="mailto:bsmith@mcs.anl.gov" target="_blank">bsmith@mcs.anl.gov</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div class="im">> 1) ISGetIndices(is,int group_number, &indices) gives the indices for a group or<br>

><br>
> So by convention, group 0 is "offset" and group 1 is "size"?<br>
<br>
</div>   No, group_number is the number of the clump. and indices are all the values in that clump</blockquote></div><br>Then you need to also access the size of the clump, but since the primary purpose is for indexing into another array, you have to copy out a buffer (thus requiring a matching Restore). When using (int) -> (offset, size), we get direct access. It makes this inner loop code a lot simpler and faster. Consider DMPlexPointLocalRef(), which is effectively</div>
<div class="gmail_extra"><br></div><div class="gmail_extra"><div class="gmail_extra">  ierr = PetscSectionGetOffset(dm->defaultGlobalSection,point,&offset);CHKERRQ(ierr);<br></div><div class="gmail_extra">  *(PetscScalar**)ptr = (start >= 0) ? array + start - dm->map->rstart : NULL;</div>
<div><br></div><div style>This gives read+write access to that piece of the array. If PetscSectionGetOffset instead returned discontiguous indices, we'd need a work buffer and copy-back semantics, or we'd need to push that unstructured indexing burden onto the user.</div>
</div></div>