On Tue, Feb 13, 2018 at 10:12 AM, Ali Berk Kahraman < aliberkkahra...@yahoo.com> wrote:

> OK, here is the thing. I have a 2D cartesian regular grid. I am working on > wavelet method collocation method, which creates an irregular adaptive grid > by turning grid points on an off on the previously mentioned cartesian > grid. I store the grid and the values as sparse Mat objects, where each > entry to the matrix denotes the x and y location of the value (x:row, > y:column). However, to feed the values into PETSc's solver contexts, I have > to turn them into vectors. > > > By the way, I believe I have solved the problem. For future reference who > looks for this, the algorithm is as follows; > > For each processor, > > 1.)Get the local number of nonzero entries on the matrix using MatGetInfo > > 2.)Call MPI_Allgather so that every process will know exactly how many > nonzero entries each other has > > 3.)Create the Vector and set its size using the data from MPI_Allgather > from step 2 (sum of all local nonzero sizes) > You do not need 2) since you can just give the local size and PETSC_DETERMINE to VecSetSizes(). Thanks, Matt > 4.)Call MatMPIAIJGetLocalMat to get the local portion of the matrix, then > call MatSeqAIJGetArray on the local portion to extract its nonzero values > as an array > > 5.)Using the info from step 2 and 4, set the according values on the > vector (e.g. if process 0 has 4 nonzeros, process 1 will set the values on > Vector's row 4 onwards) > > > I am always open to ideas for improvements. > > > Ali > > > On 13-02-2018 16:46, Jed Brown wrote: > >> Ali Kahraman <aliberkkahra...@yahoo.com> writes: >> >> Dear All, >>> My problem definition is as follows, >>> I have an MPI matrix with a random sparsity pattern i.e. I do not >>> know how many nonzeros there are on any row unless I call MatGetRow to >>> learn it. There are possibly unequal numbers of nonzeros on every row. I >>> want to write all the nonzero values of this matrix onto a parallel vector. >>> An example can be as follows. >>> Imagine I have a 4x4 matrix (; denotes next row, . denotes sparse >>> "zeros") [3 . 2 . ; . 1 . . ; 4 5 3 2; . . . .]. I want to obtain the >>> vector [3 2 1 4 5 3 2]. I could not find any function that does this. Any >>> idea is appreciated. >>> >> This seems like an odd thing to want. What are you trying to do? >> > > -- 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.caam.rice.edu/~mk51/>