<div dir="ltr">Second derivative is not a boundary condition for Poisson; that is the equation satisfied in the interior. Unless you are intentionally attempting to apply a certain kind of outflow boundary condition (i.e., you're NOT solving Laplace) then there is a problem with your formulation. I suggest you revisit the continuum problem and establish that it is well-posed before concerning yourself with implementation details.</div>
<div class="gmail_extra"><br><br><div class="gmail_quote">On Thu, Jan 10, 2013 at 9:03 AM, David Scott <span dir="ltr"><<a href="mailto:d.scott@ed.ac.uk" target="_blank">d.scott@ed.ac.uk</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Hello,<br>
<br>
I am solving Poisson's equation (actually Laplace's equation in this simple test case) on a 3D structured grid. The boundary condition in the first dimension is periodic. In the others there are Von Neumann conditions except for one surface where the second derivative is zero. I have specified DMDA_BOUNDARY_NONE in these two dimensions and deal with the boundary conditions by constructing an appropriate matrix. Here is an extract from the Fortran code:<br>

<br>
              if (j==0) then<br>
                ! Von Neumann boundary conditions on y=0 boundary.<br>
                v(1) = 1<br>
                  col(MatStencil_i, 1) = i<br>
                  col(MatStencil_j, 1) = j<br>
                  col(MatStencil_k, 1) = k<br>
                v(2) = -1<br>
                  col(MatStencil_i, 2) = i<br>
                  col(MatStencil_j, 2) = j+1<br>
                  col(MatStencil_k, 2) = k<br>
                call MatSetValuesStencil(B, 1, row, 2, col, v, INSERT_VALUES, ierr)<br>
              else if (j==maxl) then<br>
                ! Boundary condition on y=maxl boundary.<br>
                v(1) = 1<br>
                  col(MatStencil_i, 1) = i<br>
                  col(MatStencil_j, 1) = j<br>
                  col(MatStencil_k, 1) = k<br>
                v(2) = -2<br>
                  col(MatStencil_i, 2) = i<br>
                  col(MatStencil_j, 2) = j-1<br>
                  col(MatStencil_k, 2) = k<br>
                v(3) = 1<br>
                  col(MatStencil_i, 3) = i<br>
                  col(MatStencil_j, 3) = j-2<br>
                  col(MatStencil_k, 3) = k<br>
                call MatSetValuesStencil(B, 1, row, 3, col, v, INSERT_VALUES, ierr)<br>
              else if (k==0) then<br>
<br>
<br>
Here the second clause deals with the second derivative on the boundary.<br>
<br>
In order for this code to work I have to set the stencil width to 2 even though 'j-2' refers to an interior, non-halo<br>
point in the grid. This leads to larger halo swaps than would be required if a stencil width of 1 could be used.<br>
<br>
Is there a better way to encode the problem?<span class="HOEnZb"><font color="#888888"><br>
<br>
David<br>
<br>
-- <br>
The University of Edinburgh is a charitable body, registered in<br>
Scotland, with registration number SC005336.<br>
<br>
</font></span></blockquote></div><br></div>