<div dir="ltr"><br><div class="gmail_extra"><br><br><div class="gmail_quote">On 13 June 2014 14:59, 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:1px solid rgb(204,204,204);padding-left:1ex"><div><br>
On Jun 13, 2014, at 1:43 PM, Jed Brown <<a href="mailto:jed@jedbrown.org" target="_blank">jed@jedbrown.org</a>> wrote:<br>
<br>
> Anush Krishnan <<a href="mailto:anush@bu.edu" target="_blank">anush@bu.edu</a>> writes:<br>
><br>
>> Hello petsc-users,<br>
>><br>
>> I created a vector using DMDACreate with 3 degrees of freedom. Is it<br>
>> possible for me to access each vector corresponding to a degree of freedom?<br>
>> Seeing that I need to access the array as [k][j][i][dof], does it mean that<br>
>> the values of each component are not contiguous?<br>
><br>
> The values are interlaced.  This is generally better for memory<br>
> performance (cache reuse).  See, for example, the PETSc-FUN3D papers or<br>
> the various discretization frameworks that rediscover this every once in<br>
> a while.<br>
<br>
</div>     You can pull out a single set of DOF with VecStrideGather() and put it back with VecStrideScatter() see also VecStrideGatherAll(), VecStrideScatterAll() also see VecStrideNorm() etc.<br><br></blockquote><div><br>



</div><div>With regard to the interlaced memory performing better: If I used three vectors created from the same DMDA for each degree of freedom, how different would that be in performance compared to a fully interlaced vector? Wouldn't cache reuse be about the same for both cases?<br>



</div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<div><div><br>
><br>
>> Also, what is the difference between DMDAVecGetArray and DMDAVecGetArrayDOF?<br>
><br>
> With DMDAVecGetArray for multi-component problems, you usually write<br>
><br>
>  typedef struct {PetscScalar u,v,w;} Field;<br>
>  Field ***x;<br>
>  DMDAVecGetArray(dm,X,&x);<br>
>  ...<br>
>  x[k][j][i].u = 1;<br>
><br>
> With DMDAVecGetArrayDOF, you use an extra set of indices instead of the<br>
> struct.<br>
<br>
</div></div></blockquote></div><br></div></div>