[petsc-users] Correct use of VecGetArray with std::vector
Matthew Knepley
knepley at gmail.com
Fri Feb 28 13:21:59 CST 2020
On Fri, Feb 28, 2020 at 2:12 PM Zane Charles Jakobs <
Zane.Jakobs at colorado.edu> wrote:
> Hi PETSc devs,
>
> I'm writing some C++ code that calls PETSc, and I'd like to be able to
> place the result of VecGetArray into an std::vector and then later call
> VecRestoreArray on that data, or get the same effects. It seems like the
> correct way to do this would be something like:
>
Why are you calling Get/SetValues() instead Get/SetArray()? Shouldn't you
just get the pointer using GetArray() and stick it into
your std::vector?
Thanks,
Matt
> Vec x;
> std::vector<PetscScalar> vals, idx;
> int num_vals, global_offset;
> PetscErrorCode ierr;
> ...
> /* do some stuff to x and compute num_vals and global_offset*/
> ...
> vals.resize(num_vals);
> idx.resize(num_vals);
> std::iota(idx.begin(), idx.end(), global_offset);
> ierr = VecGetValues(x, num_vals, idx.data(), vals.data());CHKERRQ(ierr);
> /* do stuff to vals */
> ...
> ierr = VecSetValues(x, num_vals, idx.data(), vals.data(), [whatever insert
> mode]);CHKERRQ(ierr);
> idx.clear();
> vals.clear();
>
> Is that correct (in the sense that it does what you'd expect if you
> replaced the vectors with pointers to indices/data and used
> VecGet/RestoreArray() instead of VecGet/SetValues, and it doesn't violate
> any of std::vector's invariants, e.g. by reallocating its memory)? If not,
> is there a "normal" way to do this?
>
> Thanks!
>
> -Zane Jakobs
>
>
>
--
What most experimenters take for granted before they begin their
experiments is infinitely more interesting than any results to which their
experiments lead.
-- Norbert Wiener
https://www.cse.buffalo.edu/~knepley/ <http://www.cse.buffalo.edu/~knepley/>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.mcs.anl.gov/pipermail/petsc-users/attachments/20200228/8b911772/attachment.html>
More information about the petsc-users
mailing list