glad to hear that :) On Thu, Feb 23, 2012 at 3:38 PM, Bojan Niceno <bojan.niceno at psi.ch> wrote:
> Yeeee-ha! > > VecGhostUpdateBegin() / VecGhostUpdateEnd() was indeed what I was missing. > > Thank you Mohammad, thank you all who helped me today! > > > Cheers > > > Bojan > > > > > On 2/24/2012 12:27 AM, Mohammad Mirzadeh wrote: > > You also need calls to VecGhostUpdateBegin()/VecGhostUpdateEnd() functions > to update the ghost values if you change them in the global representation. > See Petsc Manual 3.2 pp 55-56 > > Mohammad > > On Thu, Feb 23, 2012 at 3:18 PM, Bojan Niceno <bojan.niceno at psi.ch> wrote: > >> On 2/23/2012 11:49 PM, Mohammad Mirzadeh wrote: >> >> based on, >> >> VecCreateGhost(PETSC_COMM_WORLD, n, PETSC_DECIDE, nghost, &ghosts[0], >> &x); >> >> >> it seems to me that x is your actual ghosted vector. If this is true, >> then you need to get its "local" form via >> VecGhostGetLocalForm<http://www.mcs.anl.gov/petsc/petsc-current/docs/manualpages/Vec/VecGhostGetLocalForm.html#VecGhostGetLocalForm>(). >> Once you have done, you should be able to access the ghosted nodes. Are you >> calling this function anywhere? >> >> >> I tried that before. I did: >> >> Vec lx; >> VecGhostGetLocalForm(x, &lx) >> >> then I copied "lx" to my variable, like >> >> for(Int i=1; i<N; i++) /* N includes buffer cells */ >> unk[i] = lx[i] >> >> but ghost values were also zero. I am thinking that PETSc somehow >> clears the ghost values after a call to KSP. Is it the case? >> >> >> Kind regards, >> >> >> Bojan >> >> >> >> On Thu, Feb 23, 2012 at 2:32 PM, Bojan Niceno <bojan.niceno at psi.ch>wrote: >> >>> Dear Mohammad, >>> >>> >>> it doesn't help me, or I did not understand your explanation. >>> >>> If I do this: >>> >>> /* copy internal values (THIS WORKS, BUT COPIES NO BUFFER VALUES) */ >>> >>> for(Int i=0; i<n; i++) { >>> Int gi = mesh.nodes[i].global_number; >>> VecGetValues(x, 1, &gi, &unk[i]); >>> } >>> >>> /* copy ghost values (CREATES MANY WARNINGS */ >>> >>> for(Int i=n; i<N; i++) { >>> VecGetValues(x, 1, &i, &unk[i]); >>> } >>> >>> I get arnings are like this. >>> >>> [0]PETSC ERROR: --------------------- Error Message >>> ------------------------------------ >>> [0]PETSC ERROR: Argument out of range! >>> [0]PETSC ERROR: Can only get local values, trying 3518! >>> [3]PETSC ERROR: --------------------- Error Message >>> ------------------------------------ >>> [3]PETSC ERROR: Argument out of range! >>> [3]PETSC ERROR: Can only get local values, trying 3511! >>> [3]PETSC ERROR: >>> ------------------------------------------------------------------------ >>> >>> What am I doing wrong here? >>> >>> >>> Cheers, >>> >>> >>> Bojan >>> >>> >>> >>> On 2/23/2012 11:23 PM, Mohammad Mirzadeh wrote: >>> >>> just index x with the local numberings. if you have 'n' local nodes and >>> 'g' ghost nodes in x, ghost nodes indecies run from 'n' to 'n+g-1' >>> On Feb 23, 2012 1:16 PM, "Bojan Niceno" <bojan.niceno at psi.ch> wrote: >>> >>>> Dear Jed, >>>> >>>> thanks. >>>> >>>> Now I have the following: >>>> >>>> - Array unk, which should hold values inside the partition and in ghost >>>> cells. It is big enough to hold both >>>> - Vec x, created by command VecCreateGhost, with proper padding for >>>> ghost cells >>>> - Successful call to linear solver in parallel. >>>> >>>> But I need to copy ghost values from x to my array unk. >>>> >>>> How can I do it? >>>> >>>> >>>> Kind regards, >>>> >>>> >>>> Bojan >>>> >>>> On 2/23/2012 10:10 PM, Jed Brown wrote: >>>> >>>> On Thu, Feb 23, 2012 at 15:05, Bojan Niceno <bojan.niceno at psi.ch>wrote: >>>> >>>>> No, I use global. >>>>> >>>> >>>> The local form is just a local vector. It doesn't even know that a >>>> global problem exists. You can't index into it using global indices. (In >>>> general, there is no efficient way to look up information in the local >>>> vector (includes ghost points) using global indices.) >>>> >>>> >>>>> >>>>> for(Int i=0; i<n; i++) { >>>>> Int gi = mesh.nodes[i].global_number; >>>>> VecGetValues(x, 1, &gi, &unk[i]); >>>>> } >>>>> >>>>> "n" is defined as the number of cells inside, i.e. without buffers. >>>>> "unk" is my external array. If I try to access buffer values, I use: >>>>> >>>>> for(Int i=0; i<N; i++) { >>>>> Int gi = mesh.nodes[i].global_number; >>>>> VecGetValues(x, 1, &gi, &unk[i]); >>>>> } >>>>> >>>>> But then I end up with tons of warnings, presumably because I am going >>>>> beyond "n". Vector x was created with VecCreateGhost. >>>>> >>>> >>>> >>>> >>>> -- >>>> >>> >>> >>> -- >>> >> >> >> >> -- >> > > > > -- > -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.mcs.anl.gov/pipermail/petsc-users/attachments/20120223/41bf10f5/attachment-0001.htm> -------------- next part -------------- A non-text attachment was scrubbed... Name: not available Type: image/png Size: 6515 bytes Desc: not available URL: <http://lists.mcs.anl.gov/pipermail/petsc-users/attachments/20120223/41bf10f5/attachment-0004.png> -------------- next part -------------- A non-text attachment was scrubbed... Name: not available Type: image/png Size: 6515 bytes Desc: not available URL: <http://lists.mcs.anl.gov/pipermail/petsc-users/attachments/20120223/41bf10f5/attachment-0005.png> -------------- next part -------------- A non-text attachment was scrubbed... Name: not available Type: image/png Size: 6515 bytes Desc: not available URL: <http://lists.mcs.anl.gov/pipermail/petsc-users/attachments/20120223/41bf10f5/attachment-0006.png> -------------- next part -------------- A non-text attachment was scrubbed... Name: not available Type: image/png Size: 6515 bytes Desc: not available URL: <http://lists.mcs.anl.gov/pipermail/petsc-users/attachments/20120223/41bf10f5/attachment-0007.png>
