how do you access the nonzero elements in SeqAIJ matrices

Ahmed El Zein ahmed at azein.com
Tue Aug 5 00:31:54 CDT 2008


I downloaded and recompiled the latest PETSc release and it is working
fine now. 

Thank you all for you time and your help.
Ahmed

On Mon, 2008-08-04 at 13:14 -0500, Barry Smith wrote:
> Looks fine to me. I removed the gratuitous C++ and changed
> #include <private/matimpl.h> to
> #include <src/mat/impls/aij/seq/aij.h>
> 
>    Do the PETSc examples work?
> 
>     Barry
> 
> 
> anlext2wls165:ksp/examples/tutorials] bsmith% ./ex1 -mat_view |& more
> row 0: (1, 0.1)  (5, 0.5)  (7, 0.7)
> row 1: (3, 1.1)  (4, 1.2)
> row 2: (1, 1.7)  (3, 1.9)  (6, 2.2)
> row 3: (2, 2.6)  (5, 2.9)  (7, 3.1)
> row 4: (3, 3.5)  (5, 3.7)
> row 5: (0, 4)  (4, 4.4)  (6, 4.6)
> row 6: (1, 4.9)  (5, 5.3)  (7, 5.5)
> row 7: (3, 5.9)  (5, 6.1)
> ptr[0] = 0
> ptr[1] = 3
> ptr[2] = 5
> ptr[3] = 8
> ptr[4] = 11
> ptr[5] = 13
> ptr[6] = 16
> ptr[7] = 19
> ind[0] = 1
> ind[1] = 5
> ind[2] = 7
> ind[3] = 3
> ind[4] = 4
> ind[5] = 1
> ind[6] = 3
> ind[7] = 6
> ind[8] = 2
> ind[9] = 5
> ind[10] = 7
> ind[11] = 3
> ind[12] = 5
> ind[13] = 0
> ind[14] = 4
> ind[15] = 6
> ind[16] = 1
> ind[17] = 5
> ind[18] = 7
> ind[19] = 3
> ind[20] = 5
> val[0]] = 0.100000
> val[1]] = 0.500000
> val[2]] = 0.700000
> val[3]] = 1.100000
> val[4]] = 1.200000
> val[5]] = 1.700000
> val[6]] = 1.900000
> val[7]] = 2.200000
> val[8]] = 2.600000
> val[9]] = 2.900000
> val[10]] = 3.100000
> val[11]] = 3.500000
> val[12]] = 3.700000
> val[13]] = 4.000000
> val[14]] = 4.400000
> val[15]] = 4.600000
> val[16]] = 4.900000
> val[17]] = 5.300000
> val[18]] = 5.500000
> val[19]] = 5.900000
> val[20]] = 6.100000
> 
> 
> On Aug 4, 2008, at 12:55 PM, Ahmed El Zein wrote:
> 
> > On Mon, 2008-08-04 at 11:14 -0500, Barry Smith wrote:
> >> Send us the code. This is suppose to be easy stuff.
> >>
> > I have attached the code.
> >
> > Ahmed
> >>    Barry
> >>
> >> On Aug 4, 2008, at 11:09 AM, Ahmed El Zein wrote:
> >>
> >>> On Mon, 2008-08-04 at 23:13 +0800, Zi-Hao Wei wrote:
> >>>> On Mon, Aug 4, 2008 at 10:53 PM, Ahmed El Zein <ahmed at azein.com>
> >>>> wrote:
> >>>>> my code looks like:
> >>>>>  ierr = MatCreate(PETSC_COMM_WORLD,&A); CHKERRQ(ierr);
> >>>>>  ierr = MatSetSizes(A,M,N,M,N); CHKERRQ(ierr);
> >>>>>  ierr = MatSetType(A, MATSEQAIJ); CHKERRQ(ierr);
> >>>>>  ierr =  MatAssemblyBegin(A, MAT_FINAL_ASSEMBLY); CHKERRQ(ierr);
> >>>>>  [...lots of MatSetValue() calls...]
> >>>>>  ierr = MatAssemblyEnd(A, MAT_FINAL_ASSEMBLY); CHKERRQ(ierr);
> >>>>
> >>>> I think that the code should be
> >>>> ierr = MatCreate(PETSC_COMM_WORLD,&A); CHKERRQ(ierr);
> >>>> ierr = MatSetSizes(A,M,N,M,N); CHKERRQ(ierr);
> >>>> ierr = MatSetType(A, MATSEQAIJ); CHKERRQ(ierr);
> >>>> [...lots of MatSetValue() calls...]
> >>>> ierr = MatAssemblyBegin(A, MAT_FINAL_ASSEMBLY); CHKERRQ(ierr);
> >>>> ierr = MatAssemblyEnd(A, MAT_FINAL_ASSEMBLY); CHKERRQ(ierr);
> >>>>
> >>>> The routines MatAssemblyBegin and MatAssemblyEnd should be called
> >>>> after completing all calls to MatSetValues().
> >>> You are right of course. But if these 2 calls are meant to be right
> >>> after each other, why isn't there just one MatAssembly() call  
> >>> versus a
> >>> Begin and End call?
> >>>
> >>> btw fixing this did not affect the problem I had.
> >>>
> >>> Ahmed
> >>>
> > <petsc.cpp>




More information about the petsc-dev mailing list