[petsc-users] better way of setting dirichlet boundary conditions

Bishesh Khanal bisheshkh at gmail.com
Wed Aug 21 07:12:56 CDT 2013


On Wed, Aug 21, 2013 at 1:57 PM, Matthew Knepley <knepley at gmail.com> wrote:

> On Wed, Aug 21, 2013 at 4:59 AM, Bishesh Khanal <bisheshkh at gmail.com>wrote:
>
>>
>>
>>
>> On Tue, Aug 20, 2013 at 3:06 PM, Matthew Knepley <knepley at gmail.com>wrote:
>>
>>> On Tue, Aug 20, 2013 at 7:19 AM, Bishesh Khanal <bisheshkh at gmail.com>wrote:
>>>
>>>> Hi all,
>>>> In solving problems such as laplacian/poisson equations with dirichlet
>>>> boundary conditions with finite difference methods, I set explicity the
>>>> required values to the diagonal of the boundary rows of the system matrix,
>>>> and the corresponding rhs vector.
>>>> i.e.  typically my matrix building loop would be like:
>>>>
>>>> e.g. in 2d problems, using DMDA:
>>>>
>>>> FOR (i=0 to xn-1, j = 0 to yn-1)
>>>>      set row.i = i, row. j = j
>>>>      IF (i = 0 or xn-1) or (j = 0 or yn-1)
>>>>             set diagonal value of matrix A to 1 in current row.
>>>>      ELSE
>>>>             normal interior points: set the values accordingly
>>>>      ENDIF
>>>> ENDFOR
>>>>
>>>> Is there another preferred method instead of doing this ? I saw
>>>> functions such as MatZeroRows()
>>>> when following the answer in the FAQ regarding this at:
>>>> http://www.mcs.anl.gov/petsc/documentation/faq.html#redistribute
>>>>
>>>> but I did not understand what it is trying to say in the last sentence
>>>> of the answer "An alternative approach is ... into the load"
>>>>
>>>
>>> Since those values are fixed, you do not really have to solve for them.
>>> You can eliminate them from your
>>> system entirely. Imagine you take the matrix you produce, plug in the
>>> values to X, act with the part of the
>>> matrix  that hits them A_ID X, and move that to the RHS, then eliminate
>>> the row for Dirichlet values.
>>>
>>
>> Now I understand the concept, thanks! So how do I efficiently do this
>> with petsc functions when I am using DMDA which contains the boundary
>> points too? Conceptually the steps would be the following, I think, but
>> which petsc functions would enable me to do this efficiently, for example,
>> without explicitly creating the new matrix A1 in the following and instead
>> informing KSP about it ?
>> 1) First create the big system matrix (from DM da) including the identity
>> rows for Dirichlet points and corresponding rhs, Lets say Ax = b.
>> 2) Initialize x with zero, then set the desired Dirichlet values on
>> corresponding boundary points of x.
>> 3) Create a new matrix, A1 with zeros everywhere except the row,col
>> positions corresponding to Dirchlet points where put -1.
>> 4) Get b1 by multiplying A1 with x.
>> 5) Update rhs with b = b + b1.
>> 6) Now update A by removing its rows and columns that correspond to the
>> Dirichlet points, and remove corresponding rows of b and x.
>> 7) Solve Ax=b
>>
>
> This is generally not a good thing to do with FD.
>

Do you mean that with FD, it is better to solve the bigger matrix with the
identity row for Dirichlet points instead of excluding them (That is the
way I illustrated in the pseudocode in the very first email above)?
And why is it not a good thing ? (I thought by excluding the rows-cols of
Dirichlet points would enable us to preserve the symmetry for symmetrical
problems ?

>
>    Matt
>
>
>>>    Matt
>>>
>>> Thanks,
>>>> Bishesh
>>>>
>>>
>>>
>>>
>>> --
>>> 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
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.mcs.anl.gov/pipermail/petsc-users/attachments/20130821/7d984208/attachment-0001.html>


More information about the petsc-users mailing list