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

Reply via email to