Sorry, I found the answer from the source code of Petsc.  All the MatZero 
things are not for unassembled matrix.

On Feb 23, 2013, at 2:43 PM, Hui Zhang wrote:

> Should MatZeroRowsColumnsLocalIS also be done before MatAssembly?
> 
> I used MatZeroRows one year ago.  At that time, petsc asked me the Mat must 
> have already been assembled. 
> 
> On Feb 23, 2013, at 2:37 PM, Jed Brown wrote:
> 
>> (You should really not use penalties, but if you insist on doing it, you 
>> should implement it the way I describe. There is no point assembling before 
>> imposing boundary conditions.)
>> 
>> On Feb 23, 2013 7:32 AM, "Jed Brown" <jedbrown at mcs.anl.gov> wrote:
>> You should really use MatSetValuesLocal with ADD_VALUES *before* assembling.
>> 
>> On Feb 23, 2013 7:28 AM, "Hui Zhang" <mike.hui.zhang at hotmail.com> wrote:
>> 
>> 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