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

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


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