On Fri, Feb 28, 2020 at 2:12 PM Zane Charles Jakobs < zane.jak...@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/>