[petsc-users] Dealing with 2nd Derivatives on Boundaries

David Scott d.scott at ed.ac.uk
Thu Jan 10 09:44:35 CST 2013


All right, I'll say it differently. I wish to solve
   div.grad phi = 0
with the boundary conditions that I have described.

On 10/01/2013 15:28, Jed Brown wrote:
> 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.
>
>
> On Thu, Jan 10, 2013 at 9:03 AM, David Scott <d.scott at ed.ac.uk
> <mailto:d.scott at ed.ac.uk>> wrote:
>
>     Hello,
>
>     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:
>
>                    if (j==0) then
>                      ! Von Neumann boundary conditions on y=0 boundary.
>                      v(1) = 1
>                        col(MatStencil_i, 1) = i
>                        col(MatStencil_j, 1) = j
>                        col(MatStencil_k, 1) = k
>                      v(2) = -1
>                        col(MatStencil_i, 2) = i
>                        col(MatStencil_j, 2) = j+1
>                        col(MatStencil_k, 2) = k
>                      call MatSetValuesStencil(B, 1, row, 2, col, v,
>     INSERT_VALUES, ierr)
>                    else if (j==maxl) then
>                      ! Boundary condition on y=maxl boundary.
>                      v(1) = 1
>                        col(MatStencil_i, 1) = i
>                        col(MatStencil_j, 1) = j
>                        col(MatStencil_k, 1) = k
>                      v(2) = -2
>                        col(MatStencil_i, 2) = i
>                        col(MatStencil_j, 2) = j-1
>                        col(MatStencil_k, 2) = k
>                      v(3) = 1
>                        col(MatStencil_i, 3) = i
>                        col(MatStencil_j, 3) = j-2
>                        col(MatStencil_k, 3) = k
>                      call MatSetValuesStencil(B, 1, row, 3, col, v,
>     INSERT_VALUES, ierr)
>                    else if (k==0) then
>
>
>     Here the second clause deals with the second derivative on the boundary.
>
>     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
>     point in the grid. This leads to larger halo swaps than would be
>     required if a stencil width of 1 could be used.
>
>     Is there a better way to encode the problem?
>
>     David
>
>     --
>     The University of Edinburgh is a charitable body, registered in
>     Scotland, with registration number SC005336.
>
>


-- 
Dr. D. M. Scott
Applications Consultant
Edinburgh Parallel Computing Centre
Tel. 0131 650 5921

The University of Edinburgh is a charitable body, registered in
Scotland, with registration number SC005336.


More information about the petsc-users mailing list