[petsc-dev] Number of nonzeros after assembly?
Barry Smith
bsmith at mcs.anl.gov
Mon Aug 22 13:43:26 CDT 2011
> for (col=start; col<end; col++) {
You are missing all the matrix entries that are not in the "block diagonal" portion of the matrix on each process. This loop needs to start at 0 and go to M-1
Barry
On Aug 22, 2011, at 1:35 PM, Gabriele Jost wrote:
> Hello!
> I have a question about the number of nonzeros in a PETSc matrix (mpiaij format).
> The context is, that I am trying to debug a program which works fine for a certain type of problems, but gives incorrect results for a different type.
> Anyhow, the input matrix has 5222556 nonzeros, this is the smalles data set I can get from the user. However, if I look at the KSP info I get from PETSc, I see the message:
>
> KSP Object:
> type: preonly
> maximum iterations=5000, initial guess is zero
> tolerances: relative=1e-06, absolute=1e-50, divergence=10000
> left preconditioning
> PC Object:
> type: lu
> LU: out-of-place factorization
> matrix ordering: natural
> LU: tolerance for zero pivot 1e-12
> LU: factor fill ratio needed 0
> Factored matrix follows
> Matrix Object:
> type=mpiaij, rows=13608, cols=13608
> package used to perform factorization: superlu_dist
> total: nonzeros=0, allocated nonzeros=27216
> SuperLU_DIST run parameters:
> Process grid nprow 4 x npcol 4
> Equilibrate matrix TRUE
> Matrix input mode 1
> Replace tiny pivots TRUE
> Use iterative refinement FALSE
> Processors in row 4 col partition 4
> Row permutation LargeDiag
> Column permutation MMD_AT_PLUS_A
> Parallel symbolic factorization FALSE
> Repeated factorization SamePattern
> linear system matrix = precond matrix:
> Matrix Object:
> type=mpiaij, rows=13608, cols=13608
> total: nonzeros=5227411, allocated nonzeros=5308814
>
> So, there are more non-zeros than in my matrix. This discrepancy does not show up in the good cases.
> So, I was trying to count the number of non-zeros after the assembly stage. I do this by:
>
> ierr = MatAssemblyBegin(A,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
> ierr = MatAssemblyEnd(A,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
> if (ierr != 0) SETERRQ(1,"assembly error");
> {
> int p,row,col,start,end,icnt;
> icnt=0;
> ierr=MatGetOwnershipRangeColumn(A, &start, &end);
> for (row=Istarts[mytid]; row<Iends[mytid]; row++) {
> for (col=start; col<end; col++) {
> PetscScalar v=0.;
> ierr = MatGetValues(A,1,&row,1,&col,&v); CHKERRQ(ierr);
> if (v!=0.) {
> icnt++;
> PetscSynchronizedPrintf(PETSC_COMM_WORLD,"%d %d %lf\n",row, col, v);
> //PetscSynchronizedPrintf(PETSC_COMM_WORLD,"%d %d %lf\n",row, col,v);
> }
> }
> }
> PetscSynchronizedPrintf(PETSC_COMM_WORLD,"%s %d %d\n","Processor ",mytid,icnt);
> PetscSynchronizedFlush(PETSC_COMM_WORLD);
> }
>
> If I sum up the nonzeros for each processor, I get 591479... by far not enough.
> I would greatly appreciate if somebody could advise me on what is going on here. Many thanks in advance for any hints!
>
> Kind regards,
> Gabriele Jost
More information about the petsc-dev
mailing list