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)
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.
On 13-02-2018 16:46, Jed Brown wrote:
Ali Kahraman <aliberkkahra...@yahoo.com> writes:
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?