How to zero all values on a particular row?

Barry Smith bsmith at mcs.anl.gov
Wed Jun 20 10:38:42 CDT 2007


  Ben,

   You'll want to use MatZeroRows() (even if it is just one row)
Also take a look at MatSetOption() and the option 
MAT_KEEP_ZEROED_ROWS.

   Barry


On Wed, 20 Jun 2007, Ben Tay wrote:

> Hi,
> 
> I tried to do it in 2 ways:
> 
> A:
> 
> 1.Do initial sweep:
> 
> do j=1,size_y
> 
> do i=1,size_x
> 
>  matsetvalue ....
> 
> end do
> 
> end do"
> 
> 2.matssemblybegin/end
> 
> 3 do a loop using matzerorows to zeros the particular rows
> 
> 4. do loop and use matsetvalues to insert values into those rows which I had
> zeroed previously
> 
> 5 matssemblybegin/end
> 
> 6 solve
> 
> 
> 
> B:
> 
> 1. Same as A
> 
> 2 use matsetvalues to put zeros into those location where I earlier insert
> in the 1st full i,j sweep
> 3. insert correct value using matsetvalues
> 
> 4. finally matassemblybegin/end - just once.
> 
> 5. solve
> 
> l realised that B is about  3 times faster than A. May I know why this is
> so? In A, I only call matssemblybegin/end once more. Is it so serious to the
> performance?
> 
> 
> 
> Thanks
> 
> On 6/11/07, Barry Smith <bsmith at mcs.anl.gov> wrote:
> 
> > 
> > 
> > On Mon, 11 Jun 2007, Ben Tay wrote:
> > 
> > > Thanks Barry,
> > >
> > > I managed to get it working. I realise that I had to call
> > > matssemblybegin/end each time after I zero a particular row. I also
> > tried
> > > MatSetOption(mat,MAT_KEEP_ZEROED_ROWS) as what you 've suggested.
> > >
> > > So do I have to callMatSetOption(mat,MAT_KEEP_ZEROED_ROWS) everytime
> > just
> > > before I need to zero it or just once ie after the 1st
> > matassemblybegin/end?
> > 
> > Call it once when  the matrix is created is fine.
> > >
> > > Calling matassemblybegin/end each time before matzerorows gives me the
> > > impression that it is very inefficient. Is that so?
> > 
> > Yes, if you do this a bunch of imes
> > 
> > >
> > > In that case, I wonder if it is better for me to :
> > >
> > > 1 use matsetvalues to put zeros into those location where I earlier
> > insert
> > > in the 1st full i,j sweep
> > > 2. insert correct value using matsetvalues
> > > 3. finally matassemblybegin/end - just once.
> > 
> > You can do this
> > 
> > >
> > > Lastly, is MatZeroRowsIS exactly the same as matzerorows, except that it
> > is
> > > meant for just 1 row instead of consecutive no. of rows?
> > 
> > They are the same but one takes an array of integers while the other
> > takes an IS. Neither require "consecutive no. of rows" you can zero
> > whatever rows you want together.
> > 
> >   Barry
> > 
> > >
> > > Thanks again
> > >
> > >
> > > On 6/11/07, Barry Smith <bsmith at mcs.anl.gov> wrote:
> > > >
> > > >
> > > >
> > > > On Sun, 10 Jun 2007, Ben Tay wrote:
> > > >
> > > > > Hi,
> > > > >
> > > > > I need to insert values into a matrix and then solve this poisson
> > eqn as
> > > > > part of my cfd code. For efficiency sake, I  simply use
> > > > >
> > > > > "do j=1,size_y
> > > > >
> > > > > do i=1,size_x
> > > > >
> > > > >  matsetvalue ....
> > > > >
> > > > > end do
> > > > >
> > > > > end do"
> > > > >
> > > > > to insert values into all the cells
> > > > >
> > > > > Then for specific cells, I need to enter some other values. In other
> > > > words,
> > > > > for specific rows of the matrix, I need to zero the whole row and
> > insert
> > > > new
> > > > > values. How can I do that?
> > > > >
> > > > > I tried to use MatZeroRows but it says it's not for unassembled
> > matrix.
> > > > But
> > > > > I need to zero the particular row, insert values, and then finally
> > > > assembly
> > > > > it. Is there a command to do this?
> > > >
> > > >   matassemblybegin/end
> > > >   matzerorows
> > > >   matsetvalues, matsetvalues, matsetvalue
> > > >   matssemblybegin/end
> > > >
> > > >   For improved efficiency you will want to call
> > > >   MatSetOption(mat,MAT_KEEP_ZEROED_ROWS); before the matzerorows()
> > > >
> > > > >
> > > > > Thanks
> > > > >
> > > >
> > > >
> > >
> > 
> > 
> 




More information about the petsc-users mailing list