<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Wed, Aug 24, 2016 at 5:01 PM, Randall Mackie <span dir="ltr"><<a href="mailto:rlmackie862@gmail.com" target="_blank">rlmackie862@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div style="word-wrap:break-word"><div>I already create my own matrix with the appropriate size and layout. The problem seems to be the local to global mapping from DMGetLocalToGlobalMapping, which I suspect does not allow for these non-local entries outside the stencil width.</div><div><br></div><div>How is one suppose to determine the local to global mapping without a call to this?</div><div><br></div><div>@Matthew: I had tried MatSetValuesStencil with the same result, and in fact the web page says this: <span style="font-family:-webkit-standard;font-size:medium;background-color:rgb(255,255,255)">The columns and rows in the stencil passed in MUST be contained within the ghost region of the given process as set with DMDACreateXXX() or </span><a href="http://www.mcs.anl.gov/petsc/petsc-current/docs/manualpages/Mat/MatSetStencil.html#MatSetStencil" style="font-family:-webkit-standard" target="_blank">MatSetStencil</a><span style="font-family:-webkit-standard;font-size:medium;background-color:rgb(255,255,255)">(). </span></div></div></blockquote><div><br></div><div>You are right. In the deep past, we determined this directly using the dimensions. Now we use the map.</div><div><br></div><div>You will have to calculate the global indices you want by hand in the PETSc ordering, which means</div><div>knowing what process you want owns your (i,j,k). This is of course tedious, which is why we prefer to</div><div>use the maps, but its not possible to store every global index in the local map.</div><div><br></div><div>   Matt</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div style="word-wrap:break-word"><div>Randy</div><div><br><div><blockquote type="cite"><div>On Aug 24, 2016, at 2:52 PM, Barry Smith <<a href="mailto:bsmith@mcs.anl.gov" target="_blank">bsmith@mcs.anl.gov</a>> wrote:</div><br><div><div><br><blockquote type="cite">On Aug 24, 2016, at 4:45 PM, Randall Mackie <<a href="mailto:rlmackie862@gmail.com" target="_blank">rlmackie862@gmail.com</a>> wrote:<br><br>Well, I only need this particular matrix to multiply a vector (ordering based on the DMDA grid), so I don’t need to do any ghost communication (like residual calculations). I just need to be able to set a few non-local entries. Is there no way to do that without increasing the stencil width of the DMDA?<br></blockquote><br>   Create your own matrix of the appropriate size and layout to match the DMDA vector and then put your values in it with MatSetValues(); don't use the matrix from DMCreateMatrix()<br><br>  Barry<br><br><blockquote type="cite"><br>Randy<br><br><br><blockquote type="cite">On Aug 24, 2016, at 2:39 PM, Barry Smith <<a href="mailto:bsmith@mcs.anl.gov" target="_blank">bsmith@mcs.anl.gov</a>> wrote:<br><br><br><blockquote type="cite">On Aug 24, 2016, at 4:27 PM, Randall Mackie <<a href="mailto:rlmackie862@gmail.com" target="_blank">rlmackie862@gmail.com</a>> wrote:<br><br>I’ve run into a situation where MatSetValues seems to be dropping non-local entries. Most of the entries that are set are local, but a few are possibly non-local, and are only maximum a few grid points off the local part of the grid.<br><br>Specifically, I get the local to global mapping, and the indices like so:<br><br>call DMGetLocalToGlobalMapping(da,<wbr>ltogm,ierr)<br>call ISLocalToGlobalMappingGetIndic<wbr>es(ltogm,ltog,idltog,ierr)<br><br>then set the row using ltog(idltog + row +1) etc<br><br>When run on 1 process, everything worked fine, but for > 1 I was not getting the right result (I know what the right answer should be for a simple case).<br><br>I found that when I increased the stencil width on the DA (in the call to DACreate3d) that was used in the DMGetLocalToGlobalMapping to be large enough that the non-local points would be in the ghost region, everything was fine even for > 1 process.<br><br><br>So, in conclusion, it seems like if I use a local to global mapping from DMGetLocalToGlobalMapping, then MatSetValues will drop any non-local entries that are not included in the ghost region.<br><br><br>Is this the correct behavior and if so, is there another way to set these non-local values so they don’t get dropped?<br></blockquote><br>Yes, this is the expected behavior. Note also that DMDA only allocates space in the matrix for these locations and if it did stick in your "extra" locations it would be very very slow because it would have to reallocate the matrix data structures. <br><br>Why would you want to put in matrix entries that are not represented in the ghosting? The whole point of the ghosting is to indicate what values need to be communicated so you putting additional values in that do not fit the ghosting does not match the paradigm.<br><br>Barry<br><br><blockquote type="cite"><br><br>Thanks, <br><br>Randy<br></blockquote><br></blockquote><br></blockquote><br></div></div></blockquote></div><br></div></div></blockquote></div><br><br clear="all"><div><br></div>-- <br><div class="gmail_signature" data-smartmail="gmail_signature">What most experimenters take for granted before they begin their experiments is infinitely more interesting than any results to which their experiments lead.<br>-- Norbert Wiener</div>
</div></div>