[petsc-users] Scale the diagonal entries of a Mat

Hui Zhang mike.hui.zhang at hotmail.com
Sat Feb 23 07:28:06 CST 2013


On Feb 23, 2013, at 1:37 PM, Matthew Knepley wrote:

> On Sat, Feb 23, 2013 at 7:35 AM, Hui Zhang <mike.hui.zhang at hotmail.com> wrote:
> 
> On Feb 23, 2013, at 1:32 PM, Matthew Knepley wrote:
> 
> > On Sat, Feb 23, 2013 at 7:29 AM, Hui Zhang <mike.hui.zhang at hotmail.com> wrote:
> > I want to implement diagonal penalty method for enforcing the Dirichlet boundary conditions.  That is, the diagonal entries corresponding to Dirichlet boundary are going to be scaled by a large number.
> >
> > What is the easiest way to do this?  Thanks!
> >
> > http://www.mcs.anl.gov/petsc/petsc-dev/docs/manualpages/Mat/MatDiagonalScale.html
> 
> But it seems not what I want.  That routine scales all the entries of a mat.  I want to scale only the diagonal entries.
> 
> Then use http://www.mcs.anl.gov/petsc/petsc-dev/docs/manualpages/Mat/MatDiagonalSet.html

I want to do the following on an already assembled matrix (FINAL_ASSEMBLY).

MatGetLocalSubMatrix .. to get 'submat',
MatGetDiagonal .. to get diagonal vector 'diag',
VecScale .. to scale 'diag'
MatDiagonalSet .. to set scaled 'diag' to 'submat'
MatRestoreLocalSubMatrix .. to restore 'submat'

After the above process, do I need MatAssemblyBegin/End again?  I do not know why the penalty method is bad.  Maybe because the bad conditioning?  I just want to try out and compare with MatZeroRowsColumns (lift and remove) method.

> 
> As Jed says, you really really do not want to do this.
> 
>   Matt
>  
> >
> >   Matt
> >
> > --
> > What most experimenters take for granted before they begin their experiments is infinitely more interesting than any results to which their experiments lead.
> > -- Norbert Wiener
> 
> 
> 
> 
> -- 
> What most experimenters take for granted before they begin their experiments is infinitely more interesting than any results to which their experiments lead.
> -- Norbert Wiener



More information about the petsc-users mailing list