<div dir="ltr">On Wed, Oct 2, 2013 at 12:27 AM, Mohammad Mirzadeh <span dir="ltr"><<a href="mailto:mirzadeh@gmail.com" target="_blank">mirzadeh@gmail.com</a>></span> wrote:<br><div class="gmail_extra"><div class="gmail_quote">
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hi guys,<br>
<br>
I just did something by pure guessing which seems to work and I want<br>
to make sure its the right thing!<br>
<br>
I have a specific layout for my vectors that look like this<br>
<br>
 --------------------------------------------------------------<br>
| ghost values | local values | ghost values |<br>
 --------------------------------------------------------------<br>
0, 1, 2, ...        m, m+1, ...   m+n, m+n+1 ... N<br>
<br>
which means all nodes with index [0,m) and [m+n, N) are to be treated<br>
as ghost and all intermediate ones as local. Since PETSc stores the<br>
ghost values at the end of ghosted vec, so far I have been manually<br>
mapping back and forth between petsc and my application numbering.<br>
After profiling my code, it turned out that about 15% of run-time was<br>
just doing this mapping which is absolutely ridiculous!<br>
<br>
Anyway, to fix this now I set up an ISLocalToGlobalMapping object<br>
using my own application original local2global relation shown above.<br>
Then I create the petsc vec like this:<br>
<br>
// Create PetscVec<br>
// We do not care about the actual global index of ghost nodes at this point<br>
std::vector<PetscInt> ghost_nodes(N - n -1, 0);<br>
ierr = VecCreateGhost(mpicomm, n+1, num_global, ghost_nodes.size(),<br>
(const PetscInt*)&ghost_nodes[0], &v); CHKERRQ(ierr);<br>
<br>
<br>
// Apply mapping<br>
ierr = VecSetLocalToGlobalMapping(v, mapping); CHKERRQ(ierr);<br>
<br>
After this point I do the usual VecGetArray on the vec and set the<br>
values, but this time without any extra mapping ... my very simple<br>
test seems to be ok. Is this the correct way of using<br>
ISLocalToGlobalMapping?<br></blockquote><div><br></div><div>Yes, this is the intention. And at a higher level, PETSc now tends to use a DM to</div><div>organize this process. You tell the DM about your data layout (somewhat like giving</div>
<div>the L2G mapping) and then you can DMGetLocalVector(), DMGetGlobalVector(), and</div><div>DMLocalToGlobal().</div><div><br></div><div>  Thanks,</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">

I guess I'm suspicious because VecCreateGhost is supposed to<br>
internally set the mapping and it is supposed to position ghost nodes<br>
at the end of the array which I don't want it to do...<br>
<br>
Thanks and sorry about the long email!<br>
</blockquote></div><br><br clear="all"><div><br></div>-- <br>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>