Hello,

I am trying to compute the local row ranges allocated to the processes i.e. 
rstart and rend of each process, needed as a  prerequisite for 
MatMPIAIJSetPreallocation using d_nnz and o_nnz.

I tried the following:

...

    PetscInitialize(0,0,PETSC_NULL,PETSC_NULL);

    MPI_Comm_size(PETSC_COMM_WORLD,&size);
    MPI_Comm_rank(PETSC_COMM_WORLD,&rank);

    MatCreate(PETSC_COMM_WORLD,&A);
    MatSetType(A,MATMPIAIJ);
    PetscInt local_size = PETSC_DECIDE;
    PetscSplitOwnership(PETSC_COMM_WORLD, &local_size, &N);
    MPI_Scan(&local_size, &rend, 1, MPIU_INT, MPI_SUM, PETSC_COMM_WORLD);
    rstart = rend - local_size;
    PetscInt d_nnz[local_size], o_nnz[local_size];
/*

compute d_nnz and o_nnz here

    MatMPIAIJSetPreallocation(A,0,d_nnz,0,o_nnz);
*/

    for (rank = 0; rank < size; rank++) {
    PetscPrintf(PETSC_COMM_WORLD,"local_size   =  %d, on process %d\n", 
local_size, rank);
    PetscPrintf(PETSC_COMM_WORLD,"rstart =  %d, on process %d\n", rstart, rank);
    PetscPrintf(PETSC_COMM_WORLD,"rend =  %d, on process %d\n", rend, rank);
    }

    PetscFinalize();

The local size is 25 rows on each process but rstart and rend are 0 and 25 on 
all processes, I expected 0 and 25, 25 and 50, 50 and 75 and 75 and 101. N = 100

I can't spot the error. Any ideas, what's the problem?

Klaus

Reply via email to