On Wed, Aug 21, 2013 at 1:57 PM, Matthew Knepley <[email protected]> wrote:
> On Wed, Aug 21, 2013 at 4:59 AM, Bishesh Khanal <[email protected]>wrote: > >> >> >> >> On Tue, Aug 20, 2013 at 3:06 PM, Matthew Knepley <[email protected]>wrote: >> >>> On Tue, Aug 20, 2013 at 7:19 AM, Bishesh Khanal <[email protected]>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 >
