NAG Library Routine Document

d03eef (dim2_ellip_discret)

1
Purpose

d03eef discretizes a second-order elliptic partial differential equation (PDE) on a rectangular region.

2
Specification

Fortran Interface
Subroutine d03eef ( xmin, xmax, ymin, ymax, pdef, bndy, ngx, ngy, lda, a, rhs, scheme, ifail)
Integer, Intent (In):: ngx, ngy, lda
Integer, Intent (Inout):: ifail
Real (Kind=nag_wp), Intent (In):: xmin, xmax, ymin, ymax
Real (Kind=nag_wp), Intent (Inout):: a(lda,7)
Real (Kind=nag_wp), Intent (Out):: rhs(lda)
Character (1), Intent (In):: scheme
External:: pdef, bndy
C Header Interface
#include <nagmk26.h>
void  d03eef_ (const double *xmin, const double *xmax, const double *ymin, const double *ymax,
void (NAG_CALL *pdef)(const double *x, const double *y, double *alpha, double *beta, double *gamma, double *delta, double *epslon, double *phi, double *psi),
void (NAG_CALL *bndy)(const double *x, const double *y, double *a, double *b, double *c, const Integer *ibnd),
const Integer *ngx, const Integer *ngy, const Integer *lda, double a[], double rhs[], const char *scheme, Integer *ifail, const Charlen length_scheme)

3
Description

d03eef discretizes a second-order linear elliptic partial differential equation of the form
αx,y 2U x2 + βx,y 2U x y + γx,y 2U y2 + δx,y U x +εx,y U y + ϕx,y U = ψx,y (1)
on a rectangular region
xAxxB yAyyB  
subject to boundary conditions of the form
ax,y U+ bx,y U n = cx,y  
where U n  denotes the outward pointing normal derivative on the boundary. Equation (1) is said to be elliptic if
4 αx,y γx,y β x,y 2  
for all points in the rectangular region. The linear equations produced are in a form suitable for passing directly to the multigrid routine d03edf.
The equation is discretized on a rectangular grid, with nx grid points in the x-direction and ny grid points in the y-direction. The grid spacing used is therefore
hx=xB-xA/nx-1 hy=yB-yA/ny-1  
and the coordinates of the grid points xi,yj are
xi=xA+i-1hx,  i=1,2,,nx, yj=yA+j-1hy,  j=1,2,,ny.  
At each grid point xi,yj six neighbouring grid points are used to approximate the partial differential equation, so that the equation is discretized on the seven-point stencil shown in Figure 1.
Figure 1
Figure 1
For convenience the approximation uij  to the exact solution Uxi,yj  is denoted by uO, and the neighbouring approximations are labelled according to points of the compass as shown. Where numerical labels for the seven points are required, these are also shown.
The following approximations are used for the second derivatives:
2U x2 1hx2 uE-2uO+uW 2U y2 1hy2 uN-2uO+uS 2U xy 12hxhy uN-uNW+uE-2uO+uW-uSE+uS.  
Two possible schemes may be used to approximate the first derivatives:
Central Differences
U x 12hx uE-uW U y 12hy uN-uS  
Upwind Differences
U x 1hxuO-uW if  δx,y>0 U x 1hxuE-uO if  δx,y<0 U y 1hyuN-uO if  εx,y>0 U y 1hyuO-uS if  εx,y<0.  
Central differences are more accurate than upwind differences, but upwind differences may lead to a more diagonally dominant matrix for those problems where the coefficients of the first derivatives are significantly larger than the coefficients of the second derivatives.
The approximations used for the first derivatives may be written in a more compact form as follows:
U x 12hx kx- 1uW- 2kxuO+kx+ 1uE U y 12hy ky- 1uS- 2kyuO+ky+ 1uN  
where kx=signδ and ky=signε for upwind differences, and kx=ky=0 for central differences.
At all points in the rectangular domain, including the boundary, the coefficients in the partial differential equation are evaluated by calling pdef, and applying the approximations. This leads to a seven-diagonal system of linear equations of the form:
Aij6ui-1,j+1 + Aij7ui,j+1 + Aij3ui-1,j + Aij4uij + Aij5ui+1,j + Aij1ui,j-1 + Aij2ui+1,j-1=fij,  i=1,2,,nx​ and ​j=1,2,,ny,  
where the coefficients are given by
Aij1 = β xi,yj12hxhy +γ xi,yj1hy2 +ε xi,yj12hy ky- 1 Aij2 = -β xi,yj12hxhy Aij3 = α xi,yj1hx2 +β xi,yj12hxhy +δ xi,yj12hx kx- 1 Aij4 = -α xi,yj2hx2 -β xi,yj1hxhy -γ xi,yj2hy2 -δ xi,yjkyhx-ε xi,yjkyhy-ϕ xi,yj Aij5 = α xi,yj1hx2 +β xi,yj12hxhy +δ xi,yj12hx kx+ 1 Aij6 = -β xi,yj12hxhy Aij7 = β xi,yj12hxhy +γ xi,yj1hy2 +ε xi,yj12hy ky+ 1 fij = ψ xi,yj  
These equations then have to be modified to take account of the boundary conditions. These may be Dirichlet (where the solution is given), Neumann (where the derivative of the solution is given), or mixed (where a linear combination of solution and derivative is given).
If the boundary conditions are Dirichlet, there are an infinity of possible equations which may be applied:
μuij = μfij , μ0 . (2)
If d03edf is used to solve the discretized equations, it turns out that the choice of μ can have a dramatic effect on the rate of convergence, and the obvious choice μ=1 is not the best. Some choices may even cause the multigrid method to fail altogether. In practice it has been found that a value of the same order as the other diagonal elements of the matrix is best, and the following value has been found to work well in practice:
μ=minij -2hx2 +2hy2 ,Aij4 .  
If the boundary conditions are either mixed or Neumann (i.e., B0 on return from bndy), then one of the points in the seven-point stencil lies outside the domain. In this case the normal derivative in the boundary conditions is used to eliminate the ‘fictitious’ point, uoutside:
U n 12h uoutside-uinside. (3)
It should be noted that if the boundary conditions are Neumann and ϕx,y0, then there is no unique solution. The routine returns with ifail=5 in this case, and the seven-diagonal matrix is singular.
The four corners are treated separately. bndy is called twice, once along each of the edges meeting at the corner. If both boundary conditions at this point are Dirichlet and the prescribed solution values agree, then this value is used in an equation of the form (2). If the prescribed solution is discontinuous at the corner, then the average of the two values is used. If one boundary condition is Dirichlet and the other is mixed, then the value prescribed by the Dirichlet condition is used in an equation of the form given above. Finally, if both conditions are mixed or Neumann, then two ‘fictitious’ points are eliminated using two equations of the form (3).
It is possible that equations for which the solution is known at all points on the boundary, have coefficients which are not defined on the boundary. Since this routine calls pdef at all points in the domain, including boundary points, arithmetic errors may occur in pdef which this routine cannot trap. If you have an equation with Dirichlet boundary conditions (i.e., B=0 at all points on the boundary), but with PDE coefficients which are singular on the boundary, then d03edf could be called directly only using interior grid points at your discretization.
After the equations have been set up as described above, they are checked for diagonal dominance. That is to say,
Aij4 > k4 Aijk ,   i=1,2,,nx ​ and ​ j=1,2,,ny .  
If this condition is not satisfied then the routine returns with ifail=6. The multigrid routined03edf may still converge in this case, but if the coefficients of the first derivatives in the partial differential equation are large compared with the coefficients of the second derivative, you should consider using upwind differences (scheme='U').
Since this routine is designed primarily for use with d03edf, this document should be read in conjunction with the document for that routine.

4
References

Wesseling P (1982) MGD1 – a robust and efficient multigrid method Multigrid Methods. Lecture Notes in Mathematics 960 614–630 Springer–Verlag

5
Arguments

1:     xmin – Real (Kind=nag_wp)Input
2:     xmax – Real (Kind=nag_wp)Input
On entry: the lower and upper x coordinates of the rectangular region respectively, xA and xB.
Constraint: xmin<xmax.
3:     ymin – Real (Kind=nag_wp)Input
4:     ymax – Real (Kind=nag_wp)Input
On entry: the lower and upper y coordinates of the rectangular region respectively, yA and yB.
Constraint: ymin<ymax.
5:     pdef – Subroutine, supplied by the user.External Procedure
pdef must evaluate the functions αx,y, βx,y, γx,y, δx,y, εx,y, ϕx,y and ψx,y which define the equation at a general point x,y.
The specification of pdef is:
Fortran Interface
Subroutine pdef ( x, y, alpha, beta, gamma, delta, epslon, phi, psi)
Real (Kind=nag_wp), Intent (In):: x, y
Real (Kind=nag_wp), Intent (Out):: alpha, beta, gamma, delta, epslon, phi, psi
C Header Interface
#include <nagmk26.h>
void  pdef (const double *x, const double *y, double *alpha, double *beta, double *gamma, double *delta, double *epslon, double *phi, double *psi)
1:     x – Real (Kind=nag_wp)Input
2:     y – Real (Kind=nag_wp)Input
On entry: the x and y coordinates of the point at which the coefficients of the partial differential equation are to be evaluated.
3:     alpha – Real (Kind=nag_wp)Output
4:     beta – Real (Kind=nag_wp)Output
5:     gamma – Real (Kind=nag_wp)Output
6:     delta – Real (Kind=nag_wp)Output
7:     epslon – Real (Kind=nag_wp)Output
8:     phi – Real (Kind=nag_wp)Output
9:     psi – Real (Kind=nag_wp)Output
On exit: alpha, beta, gamma, delta, epslon, phi and psi must be set to the values of αx,y, βx,y, γx,y, δx,y, εx,y, ϕx,y and ψx,y respectively at the point specified by x and y.
pdef must either be a module subprogram USEd by, or declared as EXTERNAL in, the (sub)program from which d03eef is called. Arguments denoted as Input must not be changed by this procedure.
Note: pdef should not return floating-point NaN (Not a Number) or infinity values, since these are not handled by d03eef. If your code inadvertently does return any NaNs or infinities, d03eef is likely to produce unexpected results.
6:     bndy – Subroutine, supplied by the user.External Procedure
bndy must evaluate the functions ax,y, bx,y, and cx,y involved in the boundary conditions.
The specification of bndy is:
Fortran Interface
Subroutine bndy ( x, y, a, b, c, ibnd)
Integer, Intent (In):: ibnd
Real (Kind=nag_wp), Intent (In):: x, y
Real (Kind=nag_wp), Intent (Out):: a, b, c
C Header Interface
#include <nagmk26.h>
void  bndy (const double *x, const double *y, double *a, double *b, double *c, const Integer *ibnd)
1:     x – Real (Kind=nag_wp)Input
2:     y – Real (Kind=nag_wp)Input
On entry: the x and y coordinates of the point at which the boundary conditions are to be evaluated.
3:     a – Real (Kind=nag_wp)Output
4:     b – Real (Kind=nag_wp)Output
5:     c – Real (Kind=nag_wp)Output
On exit: a, b and c must be set to the values of the functions appearing in the boundary conditions.
6:     ibnd – IntegerInput
On entry: specifies on which boundary the point x,y lies. ibnd=0, 1, 2 or 3 according as the point lies on the bottom, right, top or left boundary.
bndy must either be a module subprogram USEd by, or declared as EXTERNAL in, the (sub)program from which d03eef is called. Arguments denoted as Input must not be changed by this procedure.
Note: bndy should not return floating-point NaN (Not a Number) or infinity values, since these are not handled by d03eef. If your code inadvertently does return any NaNs or infinities, d03eef is likely to produce unexpected results.
7:     ngx – IntegerInput
8:     ngy – IntegerInput
On entry: the number of interior grid points in the x- and y-directions respectively, nx and ny. If the seven-diagonal equations are to be solved by d03edf, ngx-1 and ngy-1 should preferably be divisible by as high a power of 2 as possible.
Constraints:
  • ngx3;
  • ngy3.
9:     lda – IntegerInput
On entry: the first dimension of the array a and the dimension of the array rhs as declared in the (sub)program from which d03eef is called.
Constraint: if only the seven-diagonal equations are required, ldangx×ngy. If a call to this routine is to be followed by a call to d03edf to solve the seven-diagonal linear equations, lda4×ngx+1×ngy+1/3.
Note: this routine only checks the former condition. d03edf, if called, will check the latter condition.
10:   alda7 – Real (Kind=nag_wp) arrayOutput
On exit: aij, for i=1,2,,ngx×ngy and j=1,2,,7, contains the seven-diagonal linear equations produced by the discretization described above. If lda>ngx×ngy, the remaining elements are not referenced by the routine, but if lda4×ngx+1×ngy+1/3 then the array a can be passed directly to d03edf, where these elements are used as workspace.
11:   rhslda – Real (Kind=nag_wp) arrayOutput
On exit: the first ngx×ngy elements contain the right-hand sides of the seven-diagonal linear equations produced by the discretization described above. If lda>ngx×ngy, the remaining elements are not referenced by the routine, but if lda4×ngy+1×ngy+1/3 then the array rhs can be passed directly to d03edf, where these elements are used as workspace.
12:   scheme – Character(1)Input
On entry: the type of approximation to be used for the first derivatives which occur in the partial differential equation.
scheme='C'
Central differences are used.
scheme='U'
Upwind differences are used.
Constraint: scheme='C' or 'U'.
Note: generally speaking, if at least one of the coefficients multiplying the first derivatives (delta or epslon as returned by pdef) are large compared with the coefficients multiplying the second derivatives, then upwind differences may be more appropriate. Upwind differences are less accurate than central differences, but may result in more rapid convergence for strongly convective equations. The easiest test is to try both schemes.
13:   ifail – IntegerInput/Output
On entry: ifail must be set to 0, -1 or 1. If you are unfamiliar with this argument you should refer to Section 3.4 in How to Use the NAG Library and its Documentation for details.
For environments where it might be inappropriate to halt program execution when an error is detected, the value -1 or 1 is recommended. If the output of error messages is undesirable, then the value 1 is recommended. Otherwise, because for this routine the values of the output arguments may be useful even if ifail0 on exit, the recommended value is -1. When the value -1 or 1 is used it is essential to test the value of ifail on exit.
On exit: ifail=0 unless the routine detects an error or a warning has been flagged (see Section 6).

6
Error Indicators and Warnings

If on entry ifail=0 or -1, explanatory error messages are output on the current error message unit (as defined by x04aaf).
Note: d03eef may return useful information for one or more of the following detected errors or warnings.
Errors or warnings detected by the routine:
ifail=1
On entry, ngx=value.
Constraint: ngx3.
On entry, ngx×ngy=value and lda=value.
Constraint: lda must be at least ngx×ngy.
On entry, ngy=value.
Constraint: ngy3.
On entry, scheme=value.
Constraint: scheme='C' or 'U'.
On entry, xmin=value and xmax=value.
Constraint: xmin<xmax.
On entry, ymin=value and ymax=value.
Constraint: ymin<ymax.
ifail=2
Mixed derivative in equation and derivative in boundary condition at bottom boundary. x,y=value, ​value.
Mixed derivative in equation and derivative in boundary condition at bottom left boundary. x,y=value, ​value.
Mixed derivative in equation and derivative in boundary condition at bottom right boundary. x,y=value, ​value.
Mixed derivative in equation and derivative in boundary condition at left boundary. x,y=value, ​value.
Mixed derivative in equation and derivative in boundary condition at right boundary. x,y=value, ​value.
Mixed derivative in equation and derivative in boundary condition at top boundary. x,y=value, ​value.
Mixed derivative in equation and derivative in boundary condition at top left boundary. x,y=value, ​value.
Mixed derivative in equation and derivative in boundary condition at top right boundary. x,y=value, ​value.
ifail=3
Null boundary condition at bottom boundary, left end. x,y=value, ​value.
Null boundary condition at bottom boundary, right end. x,y=value, ​value.
Null boundary condition at bottom boundary. x,y=value, ​value.
Null boundary condition at left boundary, bottom end. x,y=value, ​value.
Null boundary condition at left boundary, top end. x,y=value, ​value.
Null boundary condition at left boundary. x,y=value, ​value.
Null boundary condition at right boundary, bottom end. x,y=value, ​value.
Null boundary condition at right boundary, top end. x,y=value, ​value.
Null boundary condition at right boundary. x,y=value, ​value.
Null boundary condition at top boundary, left end. x,y=value, ​value.
Null boundary condition at top boundary, right end. x,y=value, ​value.
Null boundary condition at top boundary. x,y=value, ​value.
ifail=4
Equation not elliptic at some point.
ifail=5
There is no unique solution with Neumann Boundary conditions.
ifail=6
The linear equations were not diagonally dominant.
ifail=-99
An unexpected error has been triggered by this routine. Please contact NAG.
See Section 3.9 in How to Use the NAG Library and its Documentation for further information.
ifail=-399
Your licence key may have expired or may not have been installed correctly.
See Section 3.8 in How to Use the NAG Library and its Documentation for further information.
ifail=-999
Dynamic memory allocation failed.
See Section 3.7 in How to Use the NAG Library and its Documentation for further information.

7
Accuracy

Not applicable.

8
Parallelism and Performance

d03eef is not threaded in any implementation.

9
Further Comments

If this routine is used as a preprocessor to the multigrid routine d03edf it should be noted that the rate of convergence of that routine is strongly dependent upon the number of levels in the multigrid scheme, and thus the choice of ngx and ngy is very important.

10
Example

The program solves the elliptic partial differential equation
2U x2 + 2 U y2 +50 U x + U y =fx,y  
on the unit square 0x, y1, with boundary conditions
The function fx,y and the exact form of the boundary conditions are derived from the exact solution Ux,y=sinxsiny.
The equation is first solved using central differences. Since the coefficients of the first derivatives are large, the linear equations are not diagonally dominated, and convergence is slow. The equation is solved a second time with upwind differences, showing that convergence is more rapid, but the solution is less accurate.

10.1
Program Text

Program Text (d03eefe.f90)

10.2
Program Data

Program Data (d03eefe.d)

10.3
Program Results

Program Results (d03eefe.r)

GnuplotProduced by GNUPLOT 4.6 patchlevel 3 Example Program Solution of Elliptic PDE using Central Differences gnuplot_plot_1 gnuplot_plot_2 0 0.2 0.4 0.6 0.8 1 x 0 0.2 0.4 0.6 0.8 1 y −0.1 0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 U