[petsc-users] Setting Vec raw contiguous data pointer, VecPlaceArray

Mark Lohry mlohry at princeton.edu
Fri May 13 12:33:35 CDT 2016

Sorry, disregard that. A few more minutes of looking seems like 
VecCreateSeqWithArray is what I wanted and this should work:

void EigenToPetscVec(const Eigen::MatrixXd& emat,Vec& pvec){

On 05/13/2016 01:13 PM, Mark Lohry wrote:
> I'm trying to interface to petsc with code using the Eigen C++ matrix 
> library. I can get the raw data pointer for a petsc vec at have Eigen 
> "map" that data without moving it using VecGetArray like so (correct 
> me if anything is wrong here):
> void PetscVecToEigen(const Vec& pvec,unsigned int nrow,unsigned int 
> ncol,Eigen::MatrixXd& emat){
>   PetscScalar *pdata;
>   // Returns a pointer to a contiguous array containing this 
> processor's portion
>   // of the vector data. For standard vectors this doesn't use any 
> copies.
>   // If the the petsc vector is not in a contiguous array then it will 
> copy
>   // it to a contiguous array.
>   VecGetArray(pvec,&pdata);
>   // Make the Eigen type a map to the data. Need to be mindful of 
> anything that
>   // changes the underlying data location like re-allocations.
>   emat = Eigen::Map<Eigen::MatrixXd>(pdata,nrow,ncol);
>   VecRestoreArray(pvec,&pdata);
> }
> and then I can use the Eigen::Matrix as usual, directly modifying the 
> data in the petscvec.
> Is VecPlaceArray the inverse of this for setting the petsc vector data 
> pointer? e.g. this function:
> void PetscEigenToVec(const Eigen::MatrixXd& emat,Vec& pvec){
>   VecPlaceArray(pvec,emat.data());
> }
> How do I then set the corresponding petsc vec size? Would it just be 
> VecSetSizes(pvec, emat.rows() * emat.cols(), PETSC_DECIDE)?
> Does VecSetSizes do any reallocations?
> Thanks in advance,
> Mark Lohry

More information about the petsc-users mailing list