On 14-05-2014 17:34, Barry Smith wrote:
See the manual page for MatMPIAIJSetPreallocationCSR() it gives an
explicit simple example
The format which is used for the sparse matrix input, is equivalent to a
   row-major ordering.. i.e for the following matrix, the input data
expected is
   as shown:
       1 0 0
       2 0 3     P0
      -------
       4 5 6     P1
    Process0 [P0]: rows_owned=[0,1]
       i =  {0,1,3}  [size = nrow+1  = 2+1]
       j =  {0,0,2}  [size = nz = 6]
       v =  {1,2,3}  [size = nz = 6]
    Process1 [P1]: rows_owned=[2]
       i =  {0,3}    [size = nrow+1  = 1+1]
       j =  {0,1,2}  [size = nz = 6]
       v =  {4,5,6}  [size = nz = 6]
  The column indices are global, the numerical values are just
numerical values and do not need to be adjusted. On each process the i
indices start with 0 because they just point into the local part of
the j indices.
   Are you saying each process of yours HAS the entire matrix?

I am not entirely sure about this and what it means. Each processor has a portion of the matrix.


If so
you just need to adjust the local portion of the i vales and pass that
plus the appropriate location in j and v to the routine as in the
example above.

So this MatMPIAIJSetPreallocationCSR call should be in some sort of loop;

Do counter =  1, No of Processors

calculate local numbering for i and isolate parts of j and v needed

Call MatMPIAIJSetPreallocationCSR(A,i,j,v)

END DO

Is this correct?

   Oh boy, oh boy.  No absolutely not. Each process is calling
MatMPIAIJSetPreallocationCSR() once with its part of the data.

  Barry


so using the above example

I should

 CALL MatMPIAIJSetPreallocationCSR(A,i,j,v)

where

i = [0, 1, 3, 6]
j = [0, 0, 2, 0 , 1 , 2]
v = [1,2,3,4,5,6]

Ollie




Ollie

  Barry
On May 14, 2014, at 8:36 AM, Oliver Browne <[email protected]> wrote:
On 14-05-2014 15:27, Barry Smith wrote:
On May 14, 2014, at 7:42 AM, Oliver Browne <[email protected]> wrote:
Hi,
I am using MatMPIAIJSetPreallocationCSR to preallocate the rows, columns and values for my matrix (efficiency). I have my 3 vectors in CSR format. If I run on a single processor, with my test case, everything works fine. I also worked without MatMPIAIJSetPreallocationCSR, and individually input each value with the call MatSetValues in MPI and this also works fine. If I want to use MatMPIAIJSetPreallocationCSR, do I need to separate the vectors for each processor as they have done here;
 What do you mean by “separate” the vectors? Each processor
needs to provide ITS rows to the function call. You cannot have
processor zero deliver all the rows.
I mean split them so they change from global numbering to local numbering.
At the moment I just have
CALL MatMPIAIJSetPreallocationCSR(A,NVPN,NNVI,CONT,ierr) - 3 vectors have global numbering
How can submit this to a specific processor?
Ollie
 Barry
http://www.mcs.anl.gov/petsc/petsc-current/docs/manualpages/Mat/MatMPIAIJSetPreallocationCSR.html#MatMPIAIJSetPreallocationCSR
Thanks in advance,
Ollie

Reply via email to