# FISHPACK
Efficient FORTRAN Subprograms for the Solution of Separable Elliptic Partial Differential Equations

by John Adams (retired) Paul Swarztrauber (deceased, August 2011) Roland Sweet (retired) | (figure provided by Jacque Marshall)

## Abstract

FISHPACK contains a collection of Fortran77 subroutines that solve second- and fourth-order finite difference approximations to separable elliptic Partial Differential Equations (PDEs). These include Helmholtz equations in cartesian, polar, cylindrical, and spherical coordinates, as well as more general separable elliptic equations. The solvers use the cyclic reduction algorithm. When the problem is singular, a least-squares solution is computed. Singularities induced by the coordinate system are handled, including at the origin r=0 in cylindrical coordinates, and at the poles in spherical coordinates.

Test programs are provided for the 19 solvers. Each serves two purposes: as a template to guide you in writing your own codes utilizing the FISHPACK solvers, and as a demonstration on your computer that you can correctly produce FISHPACK executables.

The FISHPACK library and programs are intended to be installed on your computer using the Makefile provided when you download the files in this distribution. The Makefile builds the library and driver executables under the compiler you specify when you run "make".

If your application requires solution of nonseparable elliptic PDEs, or a mix of separable and nonseparable ones, consider using the MUDPACK library instead of FISHPACK. MUDPACK uses multigrid iteration to approximate separable and nonseparable elliptic PDEs. The software is available on NCAR's web pages. If you are solving separable elliptic PDEs only, and prefer Fortran90 syntax, then you may want to use FISHPACK90, also available on NCAR's web pages. Both FISHPACK and FISHPACK90 have the same functionality.

CAVEAT: FISHPACK source code is known to break the Fortran77 Standard in various ways. In particular, some of the routines pass arguments of one type and use them as another. We have not compiled a comprehensive list of FISHPACK infractions. Prospective users who require complete adherence to the standard for their applications are advised that this package is not compliant.

## Documentation Notes

The most complete source of documentation for FISHPACK is this present document.

Also viewable is older document Efficient FORTRAN Subprograms for the Solution of Elliptic Partial Differential Equations by Paul Swarztrauber and Roland Sweet, NCAR Technical Note-TN/IA-109,July 1975. Readers will notice certain name changes e.g. PWSCRT instead of HWSCRT, and the fact that only 7 of the 19 solvers are discussed in the document. However, it contains technical discussion not available elsewhere.

Document Partial.pdf for solvers HWSCRT and HWSPLR is available when you download from the NCAR FISHPACK home page. It is also viewable from the tabs at the top of the NCAR FISHPACK homepage.

## Obtaining the Software and Documentation

Programs, solvers and support files including some documentation are available at the download tab on the top of the NCAR FISHPACK home page. This distribution favors users running Linux, Mac, or Unix systems with a Fortran compiler, because it uses a Unix-based build system.

available on those systems.

## Overview

The following table summarizes the contents of FISHPACK. Descriptions can be obtained by clicking on the solver name. Descriptions of the PDEs solved are also included after the table.

An Overview of FISHPACK Solvers
computation | subprogram | test program
--- | --- | ---
2D Helmholtz in Cartesian coordinates (centered grid) | hwscrt | thwscrt
2D Helmholtz in polar coordinates (centered grid) | hwsplr | thwsplr
2D Helmholtz in cylindrical coordinates (centered grid) | hwscyl | thwscyl
2D Helmholtz in spherical coordinates (centered grid) | hwsssp | thwsssp
2D Helmholtz in spherical coordinates (centered grid, axisymmetric) | hwscsp | thwscsp
2D Helmholtz in Cartesian coordinates (staggered grid) | hstcrt | thstcrt
2D Helmholtz in polar coordinates (staggered grid) | hstplr | thstplr
2D Helmholtz in cylindrical coordinates (staggered grid) | hstcyl | thstcyl
2D Helmholtz in spherical coordinates (staggered grid) | hstssp | thstssp
2D Helmholtz in spherical coordinates (staggered grid, axisymmetric) | hstcsp | thstcsp
3D Helmholtz in Cartesian coordinates (centered grid) | hw3crt | thw3crt
2D General Separable PDE (second or fourth order, centered grid) | sepeli | tsepeli
2D Separable PDE (second or fourth order, centered grid) | sepx4 | tsepx4
real linear systems solver (centered grid, sepx4) | genbun | tgenbun
real block tridiagonal linear systems solver (centered grid, sepeli) | blktri | tblktri
real linear systems solver (staggered grid) | poistg | tpoistg
real linear systems solver (3D, centered grid) | pois3d | tpois3d
complex linear systems solver (centered grid) | cmgnbn | tcmgnbn
complex block tridiagonal linear systems solver (centered grid) | cblktri | tcblktri
real and complex fft package | fftpack | use with 3D solvers

## Description

The form of the elliptic equations approximated are outlined below. The solvers allow periodic, specified, or derivative boundary conditions.

hwscrt

Subroutine for solving the standard five-point finite difference approximation to the Helmholtz equation in cartesian coordinates using a centered finite difference grid.

(d/dx)(du/dx) + (d/dy)(du/dy) + lambda*u = f(x,y)

Additional files required: genbun, gnbnaux, comf
Sample program file: thwscrt

hwsplr

Subroutine for solving a five-point finite difference approximation to the Helmholtz equation in polar coordinates using a centered finite difference grid.

(1/r)(d/dr)(r(du/dr)) + (1/r**2)(d/dtheta)(du/dtheta) + lambda*u = f(r,theta)

Additional files required: genbun, gnbnaux, comf
Sample program file: thwsplr

hwscyl

Subroutine for solving a five-point finite difference approximation to the modified Helmholtz equation in cylindrical coordinates using a centered finite difference grid.

(1/r)(d/dr)(r(du/dr)) + (d/dz)(du/dz) + (lambda/r**2)*u = f(r,z)

Additional files required: genbun, gnbnaux, comf
Sample program file: thwscyl

hwsssp

Subroutine for solving a five-point finite difference approximation to the Helmholtz equation in spherical coordinates and on the surface of the unit sphere using a centered finite difference grid

(1/sin(theta))(d/dtheta)(sin(theta)(du/dtheta)) +
(1/sin(theta)**2)(d/dphi)(du/dphi) + lambda*u = f(theta,phi)

Additional files required: genbun, gnbnaux, comf
Sample program file: thwsssp

hwscsp

Subroutine for solving a five-point finite difference approximation to the modified Helmholtz equation in spherical coordinates assuming axisymmetry (no dependence on longitude) using a centered finite difference grid.

(1/r**2)(d/dr)(r**2(du/dr)) +
1/(r**2*sin(theta))(d/dtheta)(sin(theta)(du/dtheta)) +
(lambda/(r*sin(theta)**2))*u = f(theta,r)

Additional files required: blktri, comf
Sample program file: thwscsp

hstcrt

Subroutine for solving the standard five-point finite difference approximation to the Helmholtz equation in cartesian coordinates using a staggered finite difference grid

(d/dx)(du/dx) + (d/dy)(du/dy) + lambda*u = f(x,y)

Additional files required: genbun, poistg, gnbnaux, comf
Sample program file: thstcrt

hstplr

Subroutine for solving a five-point finite difference approximation to the Helmholtz equation in polar coordinates using a staggered finite difference grid

(1/r)(d/dr)(r(du/dr)) + (1/r**2)(d/dtheta)(du/dtheta) + lambda*u = f(r,theta)

Additional files required: genbun, poistg, gnbnaux, comf
Sample program file: thstplr

hstcyl

Subroutine for solving a five-point finite difference approximation to the modified Helmholtz equation in cylindrical coordinates using a staggered finite difference grid.

(1/r)(d/dr)(r(du/dr)) + (d/dz)(du/dz) + (lambda/r**2)*u = f(r,z)

Additional files required: genbun, poistg, gnbnaux, comf
Sample program file: thstcyl

hwsssp

Subroutine for solving a five-point finite difference approximation to the Helmholtz equation in spherical coordinates and on the surface of the unit sphere using a staggered finite difference grid

(1/sin(theta))(d/dtheta)(sin(theta)(du/dtheta)) +
(1/sin(theta)**2)(d/dphi)(du/dphi) + lambda*u = f(theta,phi)

Additional files required: genbun, poistg, gnbnaux, comf
Sample program file: thstssp

hstcsp

Subroutine for solving a five-point finite difference approximation to the modified Helmholtz equation in spherical coordinates assuming axisymmetry (no dependence on longitude) using a staggered finite difference grid.

(1/r**2)(d/dr)(r**2(du/dr)) +
1/(r**2*sin(theta))(d/dtheta)(sin(theta)(du/dtheta)) +
(lambda/(r*sin(theta)**2))*u = f(theta,r)

Additional files required: blktri, comf
Sample program file: thwscsp

hw3crt

Subroutine for solving the standard seven-point finite difference approximation to the Helmholtz equation in cartesian coordinates using a centered finite difference grid.

(d/dx)(du/dx) + (d/dy)(du/dy) + (d/dz)(du/dz) + lambda*u = f(x,y,z)

Additional files required: pois3d, comf, fftpack
Sample program file: thw3crt

sepx4

Subroutine for automatically discretizing and solving second and (optionally) fourth order finite difference approximations on a uniform grid to certain separable elliptic partial differential equations with constant coefficients in one direction on a rectangle.

a(x)(d/dx)(du/dx) + b(x)du/dx + c(x)u + (d/dy)(du/dy) = g(x,y)

Additional files required: genbun, gnbnaux, comf
Sample program file: tsepx4

sepeli

Subroutine for automatically discretizing and solving second and (optionally) fourth order finite difference approximations on a uniform grid to the general separable elliptic partial differential equation on a rectangle.

a(x)(d/dx)(du/dx) + b(x)du/dx + c(x)u + d(y)(d/dy)(du/dy) + e(y)du/dy + f(y)u = g(x,y)

Additional files required: blktri, comf
Sample program file: tsepeli

genbun

Subroutine for solving the real linear system of equations that results from a finite difference approximation on a centered grid to certain two-dimensional elliptic partial differential equations (e.g., see sepx4) with constant coefficients in one direction.

Additional files required: gnbnaux, comf
Sample program file: tgenbun

blktri

Subroutine for solving block tridiagonal linear systems that arise from finite difference approximations to separable two-dimensional elliptic partial differential equations (see sepeli).

Additional files required: comf
Sample program file: tblktri

poistg

Subroutine for solving a block tridiagonal linear system of equations that arises from finite difference approximations on a staggered grid to two-dimensional elliptic partial differential equations with constant coefficients in one direction.

Additional files required: gnbnaux, comf
Sample program file: tpoistg

pois3d

Subroutine for solving a block tridiagonal linear system of equations that arises from finite difference approximations to three-dimensional elliptic partial differential equations in a box.

Additional files required: comf, fftpack
Sample program file: tpois3d

cmgnbn

Subroutine for solving a complex block tridiagonal linear system arising from finite difference approximations to separable complex two-dimensional elliptic partial differential equations in a box.

Additional files required: comf
Sample program file: tcmgnbn

cblktri

Subroutine for solving a complex block tridiagonal linear system of equations arising from finite difference approximation to separable complex two-dimensional elliptic partial differential equations.

Additional files required: comf
Sample program file: tcblktri

## Return to beginning of this document

## Text Below Contains Internal Files Referenced by Above Links

BLKTRI

          SUBROUTINE BLKTRI (IFLG,NP,N,AN,BN,CN,MP,M,AM,BM,CM,IDIMY,Y,
         1                   IERROR,W)
    C
    C     * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
    C     *                                                               *
    C     *                  copyright (c) 1999 by UCAR                   *
    C     *                                                               *
    C     *       UNIVERSITY CORPORATION for ATMOSPHERIC RESEARCH         *
    C     *                                                               *
    C     *                      all rights reserved                      *
    C     *                                                               *
    C     *                      FISHPACK version 4.1                     *
    C     *                                                               *
    C     *     A PACKAGE OF FORTRAN SUBPROGRAMS FOR THE SOLUTION OF      *
    C     *                                                               *
    C     *      SEPARABLE ELLIPTIC PARTIAL DIFFERENTIAL EQUATIONS        *
    C     *                                                               *
    C     *                             BY                                *
    C     *                                                               *
    C     *        JOHN ADAMS, PAUL SWARZTRAUBER AND ROLAND SWEET         *
    C     *                                                               *
    C     *                             OF                                *
    C     *                                                               *
    C     *         THE NATIONAL CENTER FOR ATMOSPHERIC RESEARCH          *
    C     *                                                               *
    C     *                BOULDER, COLORADO  (80307)  U.S.A.             *
    C     *                                                               *
    C     *                   WHICH IS SPONSORED BY                       *
    C     *                                                               *
    C     *              THE NATIONAL SCIENCE FOUNDATION                  *
    C     *                                                               *
    C     * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
    C
    C
    C
    C
    C DIMENSION OF           AN(N),BN(N),CN(N),AM(M),BM(M),CM(M),Y(IDIMY,N),
    C ARGUMENTS              W(SEE ARGUMENT LIST)
    C
    C LATEST REVISION        NOVEMBER 1988
    C
    C USAGE                  CALL BLKTRI (IFLG,NP,N,AN,BN,CN,MP,M,AM,BM,
    C                                     CM,IDIMY,Y,IERROR,W)
    C
    C PURPOSE                BLKTRI SOLVES A SYSTEM OF LINEAR EQUATIONS
    C                        OF THE FORM
    C
    C                        AN(J)*X(I,J-1) + AM(I)*X(I-1,J) +
    C                        (BN(J)+BM(I))*X(I,J) + CN(J)*X(I,J+1) +
    C                        CM(I)*X(I+1,J) = Y(I,J)
    C
    C                        FOR I = 1,2,...,M  AND  J = 1,2,...,N.
    C
    C                        I+1 AND I-1 ARE EVALUATED MODULO M AND
    C                        J+1 AND J-1 MODULO N, I.E.,
    C
    C                        X(I,0) = X(I,N),  X(I,N+1) = X(I,1),
    C                        X(0,J) = X(M,J),  X(M+1,J) = X(1,J).
    C
    C                        THESE EQUATIONS USUALLY RESULT FROM THE
    C                        DISCRETIZATION OF SEPARABLE ELLIPTIC
    C                        EQUATIONS.  BOUNDARY CONDITIONS MAY BE
    C                        DIRICHLET, NEUMANN, OR PERIODIC.
    C
    C ARGUMENTS
    C
    C ON INPUT               IFLG
    C
    C                          = 0  INITIALIZATION ONLY.
    C                               CERTAIN QUANTITIES THAT DEPEND ON NP,
    C                               N, AN, BN, AND CN ARE COMPUTED AND
    C                               STORED IN THE WORK ARRAY W.
    C
    C                          = 1  THE QUANTITIES THAT WERE COMPUTED
    C                               IN THE INITIALIZATION ARE USED
    C                               TO OBTAIN THE SOLUTION X(I,J).
    C
    C                               NOTE:
    C                               A CALL WITH IFLG=0 TAKES
    C                               APPROXIMATELY ONE HALF THE TIME
    C                               AS A CALL WITH IFLG = 1.
    C                               HOWEVER, THE INITIALIZATION DOES
    C                               NOT HAVE TO BE REPEATED UNLESS NP,
    C                               N, AN, BN, OR CN CHANGE.
    C
    C                        NP
    C                          = 0  IF AN(1) AND CN(N) ARE NOT ZERO,
    C                               WHICH CORRESPONDS TO PERIODIC
    C                               BOUNARY CONDITIONS.
    C
    C                          = 1  IF AN(1) AND CN(N) ARE ZERO.
    C
    C                        N
    C                          THE NUMBER OF UNKNOWNS IN THE J-DIRECTION.
    C                          N MUST BE GREATER THAN 4.
    C                          THE OPERATION COUNT IS PROPORTIONAL TO
    C                          MNLOG2(N), HENCE N SHOULD BE SELECTED
    C                          LESS THAN OR EQUAL TO M.
    C
    C                        AN,BN,CN
    C                          ONE-DIMENSIONAL ARRAYS OF LENGTH N
    C                          THAT SPECIFY THE COEFFICIENTS IN THE
    C                          LINEAR EQUATIONS GIVEN ABOVE.
    C
    C                        MP
    C                          = 0  IF AM(1) AND CM(M) ARE NOT ZERO,
    C                               WHICH CORRESPONDS TO PERIODIC
    C                               BOUNDARY CONDITIONS.
    C
    C                          = 1  IF AM(1) = CM(M) = 0  .
    C
    C                        M
    C                          THE NUMBER OF UNKNOWNS IN THE I-DIRECTION.
    C                           M MUST BE GREATER THAN 4.
    C
    C                        AM,BM,CM
    C                          ONE-DIMENSIONAL ARRAYS OF LENGTH M THAT
    C                          SPECIFY THE COEFFICIENTS IN THE LINEAR
    C                          EQUATIONS GIVEN ABOVE.
    C
    C                        IDIMY
    C                          THE ROW (OR FIRST) DIMENSION OF THE
    C                          TWO-DIMENSIONAL ARRAY Y AS IT APPEARS
    C                          IN THE PROGRAM CALLING BLKTRI.
    C                          THIS PARAMETER IS USED TO SPECIFY THE
    C                          VARIABLE DIMENSION OF Y.
    C                          IDIMY MUST BE AT LEAST M.
    C
    C                        Y
    C                          A TWO-DIMENSIONAL ARRAY THAT SPECIFIES
    C                          THE VALUES OF THE RIGHT SIDE OF THE LINEAR
    C                          SYSTEM OF EQUATIONS GIVEN ABOVE.
    C                          Y MUST BE DIMENSIONED AT LEAST M*N.
    C
    C                        W
    C                          A ONE-DIMENSIONAL ARRAY THAT MUST BE
    C                          PROVIDED BY THE USER FOR WORK SPACE.
    C                          IF NP=1 DEFINE K=INT(LOG2(N))+1 AND
    C                          SET L=2**(K+1) THEN W MUST HAVE DIMENSION
    C                          (K-2)*L+K+5+MAX(2N,6M)
    C
    C                          IF NP=0 DEFINE K=INT(LOG2(N-1))+1 AND
    C                          SET L=2**(K+1) THEN W MUST HAVE DIMENSION
    C                          (K-2)*L+K+5+2N+MAX(2N,6M)
    C
    C                          **IMPORTANT**
    C                          FOR PURPOSES OF CHECKING, THE REQUIRED
    C                          DIMENSION OF W IS COMPUTED BY BLKTRI AND
    C                          STORED IN W(1) IN FLOATING POINT FORMAT.
    C
    C ARGUMENTS
    C
    C ON OUTPUT              Y
    C                          CONTAINS THE SOLUTION X.
    C
    C                        IERROR
    C                          AN ERROR FLAG THAT INDICATES INVALID
    C                          INPUT PARAMETERS.  EXCEPT FOR NUMBER ZER0,
    C                          A SOLUTION IS NOT ATTEMPTED.
    C
    C                        = 0  NO ERROR.
    C                        = 1  M IS LESS THAN 5
    C                        = 2  N IS LESS THAN 5
    C                        = 3  IDIMY IS LESS THAN M.
    C                        = 4  BLKTRI FAILED WHILE COMPUTING RESULTS
    C                             THAT DEPEND ON THE COEFFICIENT ARRAYS
    C                             AN, BN, CN.  CHECK THESE ARRAYS.
    C                        = 5  AN(J)*CN(J-1) IS LESS THAN 0 FOR SOME J.
    C
    C                             POSSIBLE REASONS FOR THIS CONDITION ARE
    C                             1. THE ARRAYS AN AND CN ARE NOT CORRECT
    C                             2. TOO LARGE A GRID SPACING WAS USED
    C                                IN THE DISCRETIZATION OF THE ELLIPTIC
    C                                EQUATION.
    C                             3. THE LINEAR EQUATIONS RESULTED FROM A
    C                                PARTIAL DIFFERENTIAL EQUATION WHICH
    C                                WAS NOT ELLIPTIC.
    C
    C                        W
    C                           CONTAINS INTERMEDIATE VALUES THAT MUST
    C                           NOT BE DESTROYED IF BLKTRI WILL BE CALLED
    C                           AGAIN WITH IFLG=1. W(1) CONTAINS THE
    C                           NUMBER OF LOCATIONS REQUIRED BY W IN
    C                           FLOATING POINT FORMAT.
    C
    C
    C SPECIAL CONDITIONS     THE ALGORITHM MAY FAIL IF ABS(BM(I)+BN(J))
    C                        IS LESS THAN ABS(AM(I))+ABS(AN(J))+
    C                        ABS(CM(I))+ABS(CN(J))
    C                        FOR SOME I AND J. THE ALGORITHM WILL ALSO
    C                        FAIL IF AN(J)*CN(J-1) IS LESS THAN ZERO FOR
    C                        SOME J.
    C                        SEE THE DESCRIPTION OF THE OUTPUT PARAMETER
    C                        IERROR.
    C
    C I/O                    NONE
    C
    C PRECISION              SINGLE
    C
    C REQUIRED LIBRARY       COMF FROM FISHPAK
    C FILES
    C
    C LANGUAGE               FORTRAN
    C
    C HISTORY                WRITTEN BY PAUL SWARZTRAUBER AT NCAR IN THE
    C                        EARLY 1970'S.  REWRITTEN AND RELEASED IN
    C                        JANUARY, 1980.
    C
    C ALGORITHM              GENERALIZED CYCLIC REDUCTION
    C
    C PORTABILITY            FORTRAN 77.  APPROXIMATE MACHINE ACCURACY
    C                        IS COMPUTED IN FUNCTION EPMACH.
    C
    C REFERENCES             SWARZTRAUBER,P. AND R. SWEET, 'EFFICIENT
    C                        FORTRAN SUBPROGRAMS FOR THE SOLUTION OF
    C                        ELLIPTIC EQUATIONS'
    C                        NCAR TN/IA-109, JULY, 1975, 138 PP.
    C
    C                        SWARZTRAUBER P. N.,A DIRECT METHOD FOR
    C                        THE DISCRETE SOLUTION OF SEPARABLE
    C                        ELLIPTIC EQUATIONS, S.I.A.M.
    C                        J. NUMER. ANAL.,11(1974) PP. 1136-1150.
    C***********************************************************************

CBLKTRI

          SUBROUTINE CBLKTR (IFLG,NP,N,AN,BN,CN,MP,M,AM,BM,CM,IDIMY,Y,
         1                   IERROR,W)
    C
    C     * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
    C     *                                                               *
    C     *                  copyright (c) 1999 by UCAR                   *
    C     *                                                               *
    C     *       UNIVERSITY CORPORATION for ATMOSPHERIC RESEARCH         *
    C     *                                                               *
    C     *                      all rights reserved                      *
    C     *                                                               *
    C     *                      FISHPACK version 4.1                     *
    C     *                                                               *
    C     *     A PACKAGE OF FORTRAN SUBPROGRAMS FOR THE SOLUTION OF      *
    C     *                                                               *
    C     *      SEPARABLE ELLIPTIC PARTIAL DIFFERENTIAL EQUATIONS        *
    C     *                                                               *
    C     *                             BY                                *
    C     *                                                               *
    C     *        JOHN ADAMS, PAUL SWARZTRAUBER AND ROLAND SWEET         *
    C     *                                                               *
    C     *                             OF                                *
    C     *                                                               *
    C     *         THE NATIONAL CENTER FOR ATMOSPHERIC RESEARCH          *
    C     *                                                               *
    C     *                BOULDER, COLORADO  (80307)  U.S.A.             *
    C     *                                                               *
    C     *                   WHICH IS SPONSORED BY                       *
    C     *                                                               *
    C     *              THE NATIONAL SCIENCE FOUNDATION                  *
    C     *                                                               *
    C     * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
    C
    C
    C
    C DIMENSION OF           AN(N),BN(N),CN(N),AM(M),BM(M),CM(M),Y(IDIMY,N),
    C ARGUMENTS              W(SEE ARGUMENT LIST)
    C
    C LATEST REVISION        NOVEMBER 1988
    C
    C PURPOSE                CBLKTR SOLVES A SYSTEM OF LINEAR EQUATIONS
    C                        OF THE FORM
    C
    C                        AN(J)*X(I,J-1) + AM(I)*X(I-1,J) +
    C                        (BN(J)+BM(I))*X(I,J) + CN(J)*X(I,J+1) +
    C                        CM(I)*X(I+1,J) = Y(I,J)
    C
    C                        FOR I = 1,2,...,M  AND  J = 1,2,...,N.
    C
    C                        I+1 AND I-1 ARE EVALUATED MODULO M AND
    C                        J+1 AND J-1 MODULO N, I.E.,
    C
    C                        X(I,0) = X(I,N),  X(I,N+1) = X(I,1),
    C                        X(0,J) = X(M,J),  X(M+1,J) = X(1,J).
    C
    C                        THESE EQUATIONS USUALLY RESULT FROM THE
    C                        DISCRETIZATION OF SEPARABLE ELLIPTIC
    C                        EQUATIONS.  BOUNDARY CONDITIONS MAY BE
    C                        DIRICHLET, NEUMANN, OR PERIODIC.
    C
    C                        CBLKTRI IS A COMPLEX VERSION OF PACKAGE
    C                        BLKTRI ON ULIB.
    C
    C USAGE                  CALL CBLKTR (IFLG,NP,N,AN,BN,CN,MP,M,AM,BM,
    C                                     CM,IDIMY,Y,IERROR,W)
    C
    C ARGUMENTS
    C
    C ON INPUT               IFLG
    C
    C                          = 0  INITIALIZATION ONLY.
    C                               CERTAIN QUANTITIES THAT DEPEND ON NP,
    C                               N, AN, BN, AND CN ARE COMPUTED AND
    C                               STORED IN THE WORK ARRAY W.
    C
    C                          = 1  THE QUANTITIES THAT WERE COMPUTED
    C                               IN THE INITIALIZATION ARE USED
    C                               TO OBTAIN THE SOLUTION X(I,J).
    C
    C                               NOTE:
    C                               A CALL WITH IFLG=0 TAKES
    C                               APPROXIMATELY ONE HALF THE TIME
    C                               AS A CALL WITH IFLG = 1.
    C                               HOWEVER, THE INITIALIZATION DOES
    C                               NOT HAVE TO BE REPEATED UNLESS NP,
    C                               N, AN, BN, OR CN CHANGE.
    C
    C                        NP
    C                          = 0  IF AN(1) AND CN(N) ARE NOT ZERO,
    C                               WHICH CORRESPONDS TO PERIODIC
    C                               BOUNARY CONDITIONS.
    C
    C                          = 1  IF AN(1) AND CN(N) ARE ZERO.
    C
    C                        N
    C                          THE NUMBER OF UNKNOWNS IN THE J-DIRECTION.
    C                          N MUST BE GREATER THAN 4.
    C                          THE OPERATION COUNT IS PROPORTIONAL TO
    C                          MNLOG2(N), HENCE N SHOULD BE SELECTED
    C                          LESS THAN OR EQUAL TO M.
    C
    C                        AN,BN,CN
    C                          ONE-DIMENSIONAL ARRAYS OF LENGTH N
    C                          THAT SPECIFY THE COEFFICIENTS IN THE
    C                          LINEAR EQUATIONS GIVEN ABOVE.
    C
    C                        MP
    C                          = 0  IF AM(1) AND CM(M) ARE NOT ZERO,
    C                               WHICH CORRESPONDS TO PERIODIC
    C                               BOUNDARY CONDITIONS.
    C
    C                          = 1  IF AM(1) = CM(M) = 0  .
    C
    C                        M
    C                          THE NUMBER OF UNKNOWNS IN THE I-DIRECTION.
    C                           M MUST BE GREATER THAN 4.
    C
    C                        AM,BM,CM
    C                          COMPLEX ONE-DIMENSIONAL ARRAYS OF LENGTH M
    C                          THAT SPECIFY THE COEFFICIENTS IN THE LINEAR
    C                          EQUATIONS GIVEN ABOVE.
    C
    C                        IDIMY
    C                          THE ROW (OR FIRST) DIMENSION OF THE
    C                          TWO-DIMENSIONAL ARRAY Y AS IT APPEARS
    C                          IN THE PROGRAM CALLING CBLKTR.
    C                          THIS PARAMETER IS USED TO SPECIFY THE
    C                          VARIABLE DIMENSION OF Y.
    C                          IDIMY MUST BE AT LEAST M.
    C
    C                        Y
    C                          A COMPLEX TWO-DIMENSIONAL ARRAY THAT
    C                          SPECIFIES THE VALUES OF THE RIGHT SIDE OF
    C                          THE LINEAR SYSTEM OF EQUATIONS GIVEN ABOVE.
    C                          Y MUST BE DIMENSIONED Y(IDIMY,N) WITH
    C                          IDIMY .GE. M.
    C
    C                        W
    C                          A ONE-DIMENSIONAL ARRAY THAT MUST BE
    C                          PROVIDED BY THE USER FOR WORK SPACE.
    C
    C                          IF NP=1 DEFINE K=INT(LOG2(N))+1 AND
    C                          SET L=2**(K+1) THEN W MUST HAVE DIMENSION
    C                          (K-2)*L+K+5+MAX(2N,12M)
    C
    C                          IF NP=0 DEFINE K=INT(LOG2(N-1))+1 AND
    C                          SET L=2**(K+1) THEN W MUST HAVE DIMENSION
    C                          (K-2)*L+K+5+2N+MAX(2N,12M)
    C
    C                          **IMPORTANT**
    C                          FOR PURPOSES OF CHECKING, THE REQUIRED
    C                          DIMENSION OF W IS COMPUTED BY CBLKTR AND
    C                          STORED IN W(1) IN FLOATING POINT FORMAT.
    C
    C ARGUMENTS
    C
    C ON OUTPUT              Y
    C                          CONTAINS THE SOLUTION X.
    C
    C                        IERROR
    C                          AN ERROR FLAG THAT INDICATES INVALID
    C                          INPUT PARAMETERS.  EXCEPT FOR NUMBER ZER0,
    C                          A SOLUTION IS NOT ATTEMPTED.
    C
    C                        = 0  NO ERROR.
    C                        = 1  M IS LESS THAN 5
    C                        = 2  N IS LESS THAN 5
    C                        = 3  IDIMY IS LESS THAN M.
    C                        = 4  CBLKTR FAILED WHILE COMPUTING RESULTS
    C                             THAT DEPEND ON THE COEFFICIENT ARRAYS
    C                             AN, BN, CN.  CHECK THESE ARRAYS.
    C                        = 5  AN(J)*CN(J-1) IS LESS THAN 0 FOR SOME J.
    C
    C                             POSSIBLE REASONS FOR THIS CONDITION ARE
    C                             1. THE ARRAYS AN AND CN ARE NOT CORRECT
    C                             2. TOO LARGE A GRID SPACING WAS USED
    C                                IN THE DISCRETIZATION OF THE ELLIPTIC
    C                                EQUATION.
    C                             3. THE LINEAR EQUATIONS RESULTED FROM A
    C                                PARTIAL DIFFERENTIAL EQUATION WHICH
    C                                WAS NOT ELLIPTIC.
    C
    C                        W
    C                           CONTAINS INTERMEDIATE VALUES THAT MUST
    C                           NOT BE DESTROYED IF CBLKTR WILL BE CALLED
    C                           AGAIN WITH IFLG=1. W(1) CONTAINS THE
    C                           NUMBER OF LOCATIONS REQUIRED BY W IN
    C                           FLOATING POINT FORMAT.
    C
    C
    C SPECIAL CONDITIONS     THE ALGORITHM MAY FAIL IF ABS(BM(I)+BN(J))
    C                        IS LESS THAN ABS(AM(I))+ABS(AN(J))+
    C                        ABS(CM(I))+ABS(CN(J))
    C                        FOR SOME I AND J. THE ALGORITHM WILL ALSO
    C                        FAIL IF AN(J)*CN(J-1) IS LESS THAN ZERO FOR
    C                        SOME J.
    C                        SEE THE DESCRIPTION OF THE OUTPUT PARAMETER
    C                        IERROR.
    C
    C
    C I/O                    NONE
    C
    C PRECISION              SINGLE
    C
    C REQUIRED LIBRARY       COMF FROM FISHPAK
    C FILES
    C
    C LANGUAGE               FORTRAN
    C
    C HISTORY                WRITTEN BY PAUL SWARZTRAUBER AT NCAR IN
    C                        THE EARLY 1970'S.  REWRITTEN AN RELEASED
    C                        ON NCAR'S PUBLIC SOFTWARE LIBRARIES IN
    C                        JANUARY, 1980.
    C
    C ALGORITHM              GENERALIZED CYCLIC REDUCTION
    C                        (SEE REFERENCE BELOW)
    C
    C PORTABILITY            FORTRAN 77
    C                        THE APPROXIMATE MACHINE ACCURACY IS COMPUTED
    C                        IN FUNCTION EPMACH
    C
    C REFERENCES             SWARZTRAUBER,P. AND R. SWEET, 'EFFICIENT
    C                        FORTRAN SUBPROGRAMS FOR THE SOLUTION OF
    C                        ELLIPTIC EQUATIONS'
    C                        NCAR TN/IA-109, JULY, 1975, 138 PP.
    C
    C                        SWARZTRAUBER P. N.,A DIRECT METHOD FOR
    C                        THE DISCRETE SOLUTION OF SEPARABLE
    C                        ELLIPTIC EQUATIONS, S.I.A.M.
    C                        J. NUMER. ANAL.,11(1974) PP. 1136-1150.
    C
    C***********************************************************************

CMGNBN

          SUBROUTINE CMGNBN (NPEROD,N,MPEROD,M,A,B,C,IDIMY,Y,IERROR,W)
    C
    C     * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
    C     *                                                               *
    C     *                  copyright (c) 1999 by UCAR                   *
    C     *                                                               *
    C     *       UNIVERSITY CORPORATION for ATMOSPHERIC RESEARCH         *
    C     *                                                               *
    C     *                      all rights reserved                      *
    C     *                                                               *
    C     *                      FISHPACK version 4.1                     *
    C     *                                                               *
    C     *     A PACKAGE OF FORTRAN SUBPROGRAMS FOR THE SOLUTION OF      *
    C     *                                                               *
    C     *      SEPARABLE ELLIPTIC PARTIAL DIFFERENTIAL EQUATIONS        *
    C     *                                                               *
    C     *                             BY                                *
    C     *                                                               *
    C     *        JOHN ADAMS, PAUL SWARZTRAUBER AND ROLAND SWEET         *
    C     *                                                               *
    C     *                             OF                                *
    C     *                                                               *
    C     *         THE NATIONAL CENTER FOR ATMOSPHERIC RESEARCH          *
    C     *                                                               *
    C     *                BOULDER, COLORADO  (80307)  U.S.A.             *
    C     *                                                               *
    C     *                   WHICH IS SPONSORED BY                       *
    C     *                                                               *
    C     *              THE NATIONAL SCIENCE FOUNDATION                  *
    C     *                                                               *
    C     * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
    C
    C
    C
    C DIMENSION OF           A(M),B(M),C(M),Y(IDIMY,N),
    C                        W(SEE PARAMETER LIST)
    C ARGUMENTS
    C
    C LATEST REVISION        NOVEMBER 1988
    C
    C PURPOSE                THE NAME OF THIS PACKAGE IS A MNEMONIC FOR THE
    C                        COMPLEX GENERALIZED BUNEMAN ALGORITHM.
    C                        IT SOLVES THE COMPLEX LINEAR SYSTEM OF EQUATION
    C
    C                        A(I)*X(I-1,J) + B(I)*X(I,J) + C(I)*X(I+1,J)
    C                        + X(I,J-1) - 2.*X(I,J) + X(I,J+1) = Y(I,J)
    C
    C                        FOR I = 1,2,...,M  AND  J = 1,2,...,N.
    C
    C                        INDICES I+1 AND I-1 ARE EVALUATED MODULO M,
    C                        I.E., X(0,J) = X(M,J) AND X(M+1,J) = X(1,J),
    C                        AND X(I,0) MAY EQUAL 0, X(I,2), OR X(I,N),
    C                        AND X(I,N+1) MAY EQUAL 0, X(I,N-1), OR X(I,1)
    C                        DEPENDING ON AN INPUT PARAMETER.
    C
    C USAGE                  CALL CMGNBN (NPEROD,N,MPEROD,M,A,B,C,IDIMY,Y,
    C                                     IERROR,W)
    C
    C ARGUMENTS
    C
    C ON INPUT               NPEROD
    C
    C                          INDICATES THE VALUES THAT X(I,0) AND
    C                          X(I,N+1) ARE ASSUMED TO HAVE.
    C
    C                          = 0  IF X(I,0) = X(I,N) AND X(I,N+1) =
    C                               X(I,1).
    C                          = 1  IF X(I,0) = X(I,N+1) = 0  .
    C                          = 2  IF X(I,0) = 0 AND X(I,N+1) = X(I,N-1).
    C                          = 3  IF X(I,0) = X(I,2) AND X(I,N+1) =
    C                               X(I,N-1).
    C                          = 4  IF X(I,0) = X(I,2) AND X(I,N+1) = 0.
    C
    C                        N
    C                          THE NUMBER OF UNKNOWNS IN THE J-DIRECTION.
    C                          N MUST BE GREATER THAN 2.
    C
    C                        MPEROD
    C                          = 0 IF A(1) AND C(M) ARE NOT ZERO
    C                          = 1 IF A(1) = C(M) = 0
    C
    C                        M
    C                          THE NUMBER OF UNKNOWNS IN THE I-DIRECTION.
    C                          N MUST BE GREATER THAN 2.
    C
    C                        A,B,C
    C                          ONE-DIMENSIONAL COMPLEX ARRAYS OF LENGTH M
    C                          THAT SPECIFY THE COEFFICIENTS IN THE LINEAR
    C                          EQUATIONS GIVEN ABOVE.  IF MPEROD = 0
    C                          THE ARRAY ELEMENTS MUST NOT DEPEND UPON
    C                          THE INDEX I, BUT MUST BE CONSTANT.
    C                          SPECIFICALLY, THE SUBROUTINE CHECKS THE
    C                          FOLLOWING CONDITION .
    C
    C                            A(I) = C(1)
    C                            C(I) = C(1)
    C                            B(I) = B(1)
    C
    C                          FOR I=1,2,...,M.
    C
    C                        IDIMY
    C                          THE ROW (OR FIRST) DIMENSION OF THE
    C                          TWO-DIMENSIONAL ARRAY Y AS IT APPEARS
    C                          IN THE PROGRAM CALLING CMGNBN.
    C                          THIS PARAMETER IS USED TO SPECIFY THE
    C                          VARIABLE DIMENSION OF Y.
    C                          IDIMY MUST BE AT LEAST M.
    C
    C                        Y
    C                          A TWO-DIMENSIONAL COMPLEX ARRAY THAT
    C                          SPECIFIES THE VALUES OF THE RIGHT SIDE
    C                          OF THE LINEAR SYSTEM OF EQUATIONS GIVEN
    C                          ABOVE.
    C                          Y MUST BE DIMENSIONED AT LEAST M*N.
    C
    C                        W
    C                          A ONE-DIMENSIONAL COMPLEX ARRAY THAT
    C                          MUST BE PROVIDED BY THE USER FOR WORK
    C                          SPACE.  W MAY REQUIRE UP TO 4*N +
    C                          (10 + INT(LOG2(N)))*M LOCATIONS.
    C                          THE ACTUAL NUMBER OF LOCATIONS USED IS
    C                          COMPUTED BY CMGNBN AND IS RETURNED IN
    C                          LOCATION W(1).
    C
    C
    C  ON OUTPUT             Y
    C
    C                          CONTAINS THE SOLUTION X.
    C
    C                        IERROR
    C                          AN ERROR FLAG WHICH INDICATES INVALID
    C                          INPUT PARAMETERS  EXCEPT FOR NUMBER
    C                          ZERO, A SOLUTION IS NOT ATTEMPTED.
    C
    C                          = 0  NO ERROR.
    C                          = 1  M .LE. 2  .
    C                          = 2  N .LE. 2
    C                          = 3  IDIMY .LT. M
    C                          = 4  NPEROD .LT. 0 OR NPEROD .GT. 4
    C                          = 5  MPEROD .LT. 0 OR MPEROD .GT. 1
    C                          = 6  A(I) .NE. C(1) OR C(I) .NE. C(1) OR
    C                               B(I) .NE. B(1) FOR
    C                               SOME I=1,2,...,M.
    C                          = 7  A(1) .NE. 0 OR C(M) .NE. 0 AND
    C                                 MPEROD = 1
    C
    C                        W
    C                          W(1) CONTAINS THE REQUIRED LENGTH OF W.
    C
    C SPECIAL CONDITONS      NONE
    C
    C I/O                    NONE
    C
    C PRECISION              SINGLE
    C
    C REQUIRED LIBRARY       COMF AND ULIBER, WHICH ARE LOADED BY DEFAULT
    C FILES                  ON NCAR'S CRAY MACHINES.
    C
    C LANGUAGE               FORTRAN
    C
    C HISTORY                WRITTEN IN 1979 BY ROLAND SWEET OF NCAR'S
    C                        SCIENTIFIC COMPUTING DIVISION.  MADE AVAILABLE
    C                        ON NCAR'S PUBLIC LIBRARIES IN JANUARY, 1980.
    C
    C ALGORITHM              THE LINEAR SYSTEM IS SOLVED BY A CYCLIC
    C                        REDUCTION ALGORITHM DESCRIBED IN THE
    C                        REFERENCE BELOW.
    C
    C PORTABILITY            FORTRAN 77.  ALL MACHINE DEPENDENT CONSTANTS
    C                        ARE DEFINED IN FUNCTION P1MACH.
    C
    C REFERENCES             SWEET, R., 'A CYCLIC REDUCTION ALGORITHM FOR
    C                        SOLVING BLOCK TRIDIAGONAL SYSTEMS OF ARBITRARY
    C                        DIMENSIONS,' SIAM J. ON NUMER. ANAL.,
    C                          14(SEPT., 1977), PP. 706-720.
    C
    C ACCURACY               THIS TEST WAS PERFORMED ON A CDC 7600:
    C
    C                        A UNIFORM RANDOM NUMBER GENERATOR WAS USED
    C                        TO CREATE A SOLUTION ARRAY X FOR THE SYSTEM
    C                        GIVEN IN THE 'PURPOSE' DESCRIPTION ABOVE
    C                        WITH
    C                          A(I) = C(I) = -0.5*B(I) = 1, I=1,2,...,M
    C
    C                        AND, WHEN MPEROD = 1
    C
    C                          A(1) = C(M) = 0
    C                          A(M) = C(1) = 2.
    C
    C                        THE SOLUTION X WAS SUBSTITUTED INTO THE
    C                        GIVEN SYSTEM  AND A RIGHT SIDE Y WAS
    C                        COMPUTED.  USING THIS ARRAY Y, SUBROUTINE
    C                        CMGNBN WAS CALLED TO PRODUCE APPROXIMATE
    C                        SOLUTION Z.  THEN RELATIVE ERROR
    C                          E = MAX(CABS(Z(I,J)-X(I,J)))/
    C                              MAX(CABS(X(I,J)))
    C                        WAS COMPUTED, WHERE THE TWO MAXIMA ARE TAKEN
    C                        OVER I=1,2,...,M AND J=1,...,N.
    C
    C                        THE VALUE OF E IS GIVEN IN THE TABLE
    C                        BELOW FOR SOME TYPICAL VALUES OF M AND N.
    C
    C                   M (=N)    MPEROD    NPEROD    T(MSECS)    E
    C                   ------    ------    ------    --------  ------
    C
    C                     31        0         0          77     1.E-12
    C                     31        1         1          45     4.E-13
    C                     31        1         3          91     2.E-12
    C                     32        0         0          59     7.E-14
    C                     32        1         1          65     5.E-13
    C                     32        1         3          97     2.E-13
    C                     33        0         0          80     6.E-13
    C                     33        1         1          67     5.E-13
    C                     33        1         3          76     3.E-12
    C                     63        0         0         350     5.E-12
    C                     63        1         1         215     6.E-13
    C                     63        1         3         412     1.E-11
    C                     64        0         0         264     1.E-13
    C                     64        1         1         287     3.E-12
    C                     64        1         3         421     3.E-13
    C                     65        0         0         338     2.E-12
    C                     65        1         1         292     5.E-13
    C                     65        1         3         329     1.E-11
    C
    C***********************************************************************

FFTPACK

    C
    C     * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
    C     *                                                               *
    C     *                  copyright (c) 1999 by UCAR                   *
    C     *                                                               *
    C     *       UNIVERSITY CORPORATION for ATMOSPHERIC RESEARCH         *
    C     *                                                               *
    C     *                      all rights reserved                      *
    C     *                                                               *
    C     *                      FISHPACK version 4.1                     *
    C     *                                                               *
    C     *     A PACKAGE OF FORTRAN SUBPROGRAMS FOR THE SOLUTION OF      *
    C     *                                                               *
    C     *      SEPARABLE ELLIPTIC PARTIAL DIFFERENTIAL EQUATIONS        *
    C     *                                                               *
    C     *                             BY                                *
    C     *                                                               *
    C     *        JOHN ADAMS, PAUL SWARZTRAUBER AND ROLAND SWEET         *
    C     *                                                               *
    C     *                             OF                                *
    C     *                                                               *
    C     *         THE NATIONAL CENTER FOR ATMOSPHERIC RESEARCH          *
    C     *                                                               *
    C     *                BOULDER, COLORADO  (80307)  U.S.A.             *
    C     *                                                               *
    C     *                   WHICH IS SPONSORED BY                       *
    C     *                                                               *
    C     *              THE NATIONAL SCIENCE FOUNDATION                  *
    C     *                                                               *
    C     * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
    C
    C
    C LATEST REVISION
    C ---------------
    C     NOVEMBER 1988  (VERSION 4.1)
    C
    C PURPOSE
    C -------
    C     THIS PACKAGE CONSISTS OF PROGRAMS WHICH PERFORM FAST FOURIER
    C     TRANSFORMS FOR BOTH COMPLEX AND REAL PERIODIC SEQUENCES AND
    C     CERTAIN OTHER SYMMETRIC SEQUENCES THAT ARE LISTED BELOW.
    C
    C USAGE
    C -----
    C     1.   RFFTI     INITIALIZE  RFFTF AND RFFTB
    C     2.   RFFTF     FORWARD TRANSFORM OF A REAL PERIODIC SEQUENCE
    C     3.   RFFTB     BACKWARD TRANSFORM OF A REAL COEFFICIENT ARRAY
    C
    C     4.   EZFFTI    INITIALIZE EZFFTF AND EZFFTB
    C     5.   EZFFTF    A SIMPLIFIED REAL PERIODIC FORWARD TRANSFORM
    C     6.   EZFFTB    A SIMPLIFIED REAL PERIODIC BACKWARD TRANSFORM
    C
    C     7.   SINTI     INITIALIZE SINT
    C     8.   SINT      SINE TRANSFORM OF A REAL ODD SEQUENCE
    C
    C     9.   COSTI     INITIALIZE COST
    C     10.  COST      COSINE TRANSFORM OF A REAL EVEN SEQUENCE
    C
    C     11.  SINQI     INITIALIZE SINQF AND SINQB
    C     12.  SINQF     FORWARD SINE TRANSFORM WITH ODD WAVE NUMBERS
    C     13.  SINQB     UNNORMALIZED INVERSE OF SINQF
    C
    C     14.  COSQI     INITIALIZE COSQF AND COSQB
    C     15.  COSQF     FORWARD COSINE TRANSFORM WITH ODD WAVE NUMBERS
    C     16.  COSQB     UNNORMALIZED INVERSE OF COSQF
    C
    C     17.  CFFTI     INITIALIZE CFFTF AND CFFTB
    C     18.  CFFTF     FORWARD TRANSFORM OF A COMPLEX PERIODIC SEQUENCE
    C     19.  CFFTB     UNNORMALIZED INVERSE OF CFFTF
    C
    C SPECIAL CONDITIONS
    C ------------------
    C     BEFORE CALLING ROUTINES EZFFTB AND EZFFTF FOR THE FIRST TIME,
    C     OR BEFORE CALLING EZFFTB AND EZFFTF WITH A DIFFERENT LENGTH,
    C     USERS MUST INITIALIZE BY CALLING ROUTINE EZFFTI.
    C
    C I/O
    C ---
    C     NONE
    C
    C PRECISION
    C ---------
    C     NONE
    C
    C REQUIRED LIBRARY FILES
    C ----------------------
    C     NONE
    C
    C LANGUAGE
    C --------
    C     FORTRAN
    C
    C HISTORY
    C -------
    C     DEVELOPED AT NCAR IN BOULDER, COLORADO BY PAUL N. SWARZTRAUBER
    C     OF THE SCIENTIFIC COMPUTING DIVISION.  RELEASED ON NCAR'S PUBLIC
    C     SOFTWARE LIBRARIES IN JANUARY 1980.  MODIFIED MAY 29, 1985 TO
    C     INCREASE EFFICIENCY.
    C
    C PORTABILITY
    C -----------
    C     FORTRAN 77
    C
    C **********************************************************************
    C
    C     SUBROUTINE RFFTI(N,WSAVE)
    C
    C     SUBROUTINE RFFTI INITIALIZES THE ARRAY WSAVE WHICH IS USED IN
    C     BOTH RFFTF AND RFFTB. THE PRIME FACTORIZATION OF N TOGETHER WITH
    C     A TABULATION OF THE TRIGONOMETRIC FUNCTIONS ARE COMPUTED AND
    C     STORED IN WSAVE.
    C
    C     INPUT PARAMETER
    C
    C     N       THE LENGTH OF THE SEQUENCE TO BE TRANSFORMED.
    C
    C     OUTPUT PARAMETER
    C
    C     WSAVE   A WORK ARRAY WHICH MUST BE DIMENSIONED AT LEAST 2*N+15.
    C             THE SAME WORK ARRAY CAN BE USED FOR BOTH RFFTF AND RFFTB
    C             AS LONG AS N REMAINS UNCHANGED. DIFFERENT WSAVE ARRAYS
    C             ARE REQUIRED FOR DIFFERENT VALUES OF N. THE CONTENTS OF
    C             WSAVE MUST NOT BE CHANGED BETWEEN CALLS OF RFFTF OR RFFTB.
    C
    C **********************************************************************
    C
    C     SUBROUTINE RFFTF(N,R,WSAVE)
    C
    C     SUBROUTINE RFFTF COMPUTES THE FOURIER COEFFICIENTS OF A REAL
    C     PERODIC SEQUENCE (FOURIER ANALYSIS). THE TRANSFORM IS DEFINED
    C     BELOW AT OUTPUT PARAMETER R.
    C
    C     INPUT PARAMETERS
    C
    C     N       THE LENGTH OF THE ARRAY R TO BE TRANSFORMED.  THE METHOD
    C             IS MOST EFFICIENT WHEN N IS A PRODUCT OF SMALL PRIMES.
    C             N MAY CHANGE SO LONG AS DIFFERENT WORK ARRAYS ARE PROVIDED
    C
    C     R       A REAL ARRAY OF LENGTH N WHICH CONTAINS THE SEQUENCE
    C             TO BE TRANSFORMED
    C
    C     WSAVE   A WORK ARRAY WHICH MUST BE DIMENSIONED AT LEAST 2*N+15.
    C             IN THE PROGRAM THAT CALLS RFFTF. THE WSAVE ARRAY MUST BE
    C             INITIALIZED BY CALLING SUBROUTINE RFFTI(N,WSAVE) AND A
    C             DIFFERENT WSAVE ARRAY MUST BE USED FOR EACH DIFFERENT
    C             VALUE OF N. THIS INITIALIZATION DOES NOT HAVE TO BE
    C             REPEATED SO LONG AS N REMAINS UNCHANGED THUS SUBSEQUENT
    C             TRANSFORMS CAN BE OBTAINED FASTER THAN THE FIRST.
    C             THE SAME WSAVE ARRAY CAN BE USED BY RFFTF AND RFFTB.
    C
    C
    C     OUTPUT PARAMETERS
    C
    C     R       R(1) = THE SUM FROM I=1 TO I=N OF R(I)
    C
    C             IF N IS EVEN SET L =N/2   , IF N IS ODD SET L = (N+1)/2
    C
    C               THEN FOR K = 2,...,L
    C
    C                  R(2*K-2) = THE SUM FROM I = 1 TO I = N OF
    C
    C                       R(I)*COS((K-1)*(I-1)*2*PI/N)
    C
    C                  R(2*K-1) = THE SUM FROM I = 1 TO I = N OF
    C
    C                      -R(I)*SIN((K-1)*(I-1)*2*PI/N)
    C
    C             IF N IS EVEN
    C
    C                  R(N) = THE SUM FROM I = 1 TO I = N OF
    C
    C                       (-1)**(I-1)*R(I)
    C
    C      *****  NOTE
    C                  THIS TRANSFORM IS UNNORMALIZED SINCE A CALL OF RFFTF
    C                  FOLLOWED BY A CALL OF RFFTB WILL MULTIPLY THE INPUT
    C                  SEQUENCE BY N.
    C
    C     WSAVE   CONTAINS RESULTS WHICH MUST NOT BE DESTROYED BETWEEN
    C             CALLS OF RFFTF OR RFFTB.
    C
    C
    C **********************************************************************
    C
    C     SUBROUTINE RFFTB(N,R,WSAVE)
    C
    C     SUBROUTINE RFFTB COMPUTES THE REAL PERODIC SEQUENCE FROM ITS
    C     FOURIER COEFFICIENTS (FOURIER SYNTHESIS). THE TRANSFORM IS DEFINED
    C     BELOW AT OUTPUT PARAMETER R.
    C
    C     INPUT PARAMETERS
    C
    C     N       THE LENGTH OF THE ARRAY R TO BE TRANSFORMED.  THE METHOD
    C             IS MOST EFFICIENT WHEN N IS A PRODUCT OF SMALL PRIMES.
    C             N MAY CHANGE SO LONG AS DIFFERENT WORK ARRAYS ARE PROVIDED
    C
    C     R       A REAL ARRAY OF LENGTH N WHICH CONTAINS THE SEQUENCE
    C             TO BE TRANSFORMED
    C
    C     WSAVE   A WORK ARRAY WHICH MUST BE DIMENSIONED AT LEAST 2*N+15.
    C             IN THE PROGRAM THAT CALLS RFFTB. THE WSAVE ARRAY MUST BE
    C             INITIALIZED BY CALLING SUBROUTINE RFFTI(N,WSAVE) AND A
    C             DIFFERENT WSAVE ARRAY MUST BE USED FOR EACH DIFFERENT
    C             VALUE OF N. THIS INITIALIZATION DOES NOT HAVE TO BE
    C             REPEATED SO LONG AS N REMAINS UNCHANGED THUS SUBSEQUENT
    C             TRANSFORMS CAN BE OBTAINED FASTER THAN THE FIRST.
    C             THE SAME WSAVE ARRAY CAN BE USED BY RFFTF AND RFFTB.
    C
    C
    C     OUTPUT PARAMETERS
    C
    C     R       FOR N EVEN AND FOR I = 1,...,N
    C
    C                  R(I) = R(1)+(-1)**(I-1)*R(N)
    C
    C                       PLUS THE SUM FROM K=2 TO K=N/2 OF
    C
    C                        2.*R(2*K-2)*COS((K-1)*(I-1)*2*PI/N)
    C
    C                       -2.*R(2*K-1)*SIN((K-1)*(I-1)*2*PI/N)
    C
    C             FOR N ODD AND FOR I = 1,...,N
    C
    C                  R(I) = R(1) PLUS THE SUM FROM K=2 TO K=(N+1)/2 OF
    C
    C                       2.*R(2*K-2)*COS((K-1)*(I-1)*2*PI/N)
    C
    C                      -2.*R(2*K-1)*SIN((K-1)*(I-1)*2*PI/N)
    C
    C      *****  NOTE
    C                  THIS TRANSFORM IS UNNORMALIZED SINCE A CALL OF RFFTF
    C                  FOLLOWED BY A CALL OF RFFTB WILL MULTIPLY THE INPUT
    C                  SEQUENCE BY N.
    C
    C     WSAVE   CONTAINS RESULTS WHICH MUST NOT BE DESTROYED BETWEEN
    C             CALLS OF RFFTB OR RFFTF.
    C
    C
    C **********************************************************************
    C
    C     SUBROUTINE EZFFTI(N,WSAVE)
    C
    C     SUBROUTINE EZFFTI INITIALIZES THE ARRAY WSAVE WHICH IS USED IN
    C     BOTH EZFFTF AND EZFFTB. THE PRIME FACTORIZATION OF N TOGETHER WITH
    C     A TABULATION OF THE TRIGONOMETRIC FUNCTIONS ARE COMPUTED AND
    C     STORED IN WSAVE.
    C
    C     INPUT PARAMETER
    C
    C     N       THE LENGTH OF THE SEQUENCE TO BE TRANSFORMED.
    C
    C     OUTPUT PARAMETER
    C
    C     WSAVE   A WORK ARRAY WHICH MUST BE DIMENSIONED AT LEAST 3*N+15.
    C             THE SAME WORK ARRAY CAN BE USED FOR BOTH EZFFTF AND EZFFTB
    C             AS LONG AS N REMAINS UNCHANGED. DIFFERENT WSAVE ARRAYS
    C             ARE REQUIRED FOR DIFFERENT VALUES OF N.
    C
    C
    C **********************************************************************
    C
    C     SUBROUTINE EZFFTF(N,R,AZERO,A,B,WSAVE)
    C
    C     SUBROUTINE EZFFTF COMPUTES THE FOURIER COEFFICIENTS OF A REAL
    C     PERODIC SEQUENCE (FOURIER ANALYSIS). THE TRANSFORM IS DEFINED
    C     BELOW AT OUTPUT PARAMETERS AZERO,A AND B. EZFFTF IS A SIMPLIFIED
    C     BUT SLOWER VERSION OF RFFTF.
    C
    C     INPUT PARAMETERS
    C
    C     N       THE LENGTH OF THE ARRAY R TO BE TRANSFORMED.  THE METHOD
    C             IS MUST EFFICIENT WHEN N IS THE PRODUCT OF SMALL PRIMES.
    C
    C     R       A REAL ARRAY OF LENGTH N WHICH CONTAINS THE SEQUENCE
    C             TO BE TRANSFORMED. R IS NOT DESTROYED.
    C
    C
    C     WSAVE   A WORK ARRAY WHICH MUST BE DIMENSIONED AT LEAST 3*N+15.
    C             IN THE PROGRAM THAT CALLS EZFFTF. THE WSAVE ARRAY MUST BE
    C             INITIALIZED BY CALLING SUBROUTINE EZFFTI(N,WSAVE) AND A
    C             DIFFERENT WSAVE ARRAY MUST BE USED FOR EACH DIFFERENT
    C             VALUE OF N. THIS INITIALIZATION DOES NOT HAVE TO BE
    C             REPEATED SO LONG AS N REMAINS UNCHANGED THUS SUBSEQUENT
    C             TRANSFORMS CAN BE OBTAINED FASTER THAN THE FIRST.
    C             THE SAME WSAVE ARRAY CAN BE USED BY EZFFTF AND EZFFTB.
    C
    C     OUTPUT PARAMETERS
    C
    C     AZERO   THE SUM FROM I=1 TO I=N OF R(I)/N
    C
    C     A,B     FOR N EVEN B(N/2)=0. AND A(N/2) IS THE SUM FROM I=1 TO
    C             I=N OF (-1)**(I-1)*R(I)/N
    C
    C             FOR N EVEN DEFINE KMAX=N/2-1
    C             FOR N ODD  DEFINE KMAX=(N-1)/2
    C
    C             THEN FOR  K=1,...,KMAX
    C
    C                  A(K) EQUALS THE SUM FROM I=1 TO I=N OF
    C
    C                       2./N*R(I)*COS(K*(I-1)*2*PI/N)
    C
    C                  B(K) EQUALS THE SUM FROM I=1 TO I=N OF
    C
    C                       2./N*R(I)*SIN(K*(I-1)*2*PI/N)
    C
    C
    C **********************************************************************
    C
    C     SUBROUTINE EZFFTB(N,R,AZERO,A,B,WSAVE)
    C
    C     SUBROUTINE EZFFTB COMPUTES A REAL PERODIC SEQUENCE FROM ITS
    C     FOURIER COEFFICIENTS (FOURIER SYNTHESIS). THE TRANSFORM IS
    C     DEFINED BELOW AT OUTPUT PARAMETER R. EZFFTB IS A SIMPLIFIED
    C     BUT SLOWER VERSION OF RFFTB.
    C
    C     INPUT PARAMETERS
    C
    C     N       THE LENGTH OF THE OUTPUT ARRAY R.  THE METHOD IS MOST
    C             EFFICIENT WHEN N IS THE PRODUCT OF SMALL PRIMES.
    C
    C     AZERO   THE CONSTANT FOURIER COEFFICIENT
    C
    C     A,B     ARRAYS WHICH CONTAIN THE REMAINING FOURIER COEFFICIENTS
    C             THESE ARRAYS ARE NOT DESTROYED.
    C
    C             THE LENGTH OF THESE ARRAYS DEPENDS ON WHETHER N IS EVEN OR
    C             ODD.
    C
    C             IF N IS EVEN N/2    LOCATIONS ARE REQUIRED
    C             IF N IS ODD (N-1)/2 LOCATIONS ARE REQUIRED
    C
    C     WSAVE   A WORK ARRAY WHICH MUST BE DIMENSIONED AT LEAST 3*N+15.
    C             IN THE PROGRAM THAT CALLS EZFFTB. THE WSAVE ARRAY MUST BE
    C             INITIALIZED BY CALLING SUBROUTINE EZFFTI(N,WSAVE) AND A
    C             DIFFERENT WSAVE ARRAY MUST BE USED FOR EACH DIFFERENT
    C             VALUE OF N. THIS INITIALIZATION DOES NOT HAVE TO BE
    C             REPEATED SO LONG AS N REMAINS UNCHANGED THUS SUBSEQUENT
    C             TRANSFORMS CAN BE OBTAINED FASTER THAN THE FIRST.
    C             THE SAME WSAVE ARRAY CAN BE USED BY EZFFTF AND EZFFTB.
    C
    C
    C     OUTPUT PARAMETERS
    C
    C     R       IF N IS EVEN DEFINE KMAX=N/2
    C             IF N IS ODD  DEFINE KMAX=(N-1)/2
    C
    C             THEN FOR I=1,...,N
    C
    C                  R(I)=AZERO PLUS THE SUM FROM K=1 TO K=KMAX OF
    C
    C                  A(K)*COS(K*(I-1)*2*PI/N)+B(K)*SIN(K*(I-1)*2*PI/N)
    C
    C     ********************* COMPLEX NOTATION **************************
    C
    C             FOR J=1,...,N
    C
    C             R(J) EQUALS THE SUM FROM K=-KMAX TO K=KMAX OF
    C
    C                  C(K)*EXP(I*K*(J-1)*2*PI/N)
    C
    C             WHERE
    C
    C                  C(K) = .5*CMPLX(A(K),-B(K))   FOR K=1,...,KMAX
    C
    C                  C(-K) = CONJG(C(K))
    C
    C                  C(0) = AZERO
    C
    C                       AND I=SQRT(-1)
    C
    C     *************** AMPLITUDE - PHASE NOTATION ***********************
    C
    C             FOR I=1,...,N
    C
    C             R(I) EQUALS AZERO PLUS THE SUM FROM K=1 TO K=KMAX OF
    C
    C                  ALPHA(K)*COS(K*(I-1)*2*PI/N+BETA(K))
    C
    C             WHERE
    C
    C                  ALPHA(K) = SQRT(A(K)*A(K)+B(K)*B(K))
    C
    C                  COS(BETA(K))=A(K)/ALPHA(K)
    C
    C                  SIN(BETA(K))=-B(K)/ALPHA(K)
    C
    C **********************************************************************
    C
    C     SUBROUTINE SINTI(N,WSAVE)
    C
    C     SUBROUTINE SINTI INITIALIZES THE ARRAY WSAVE WHICH IS USED IN
    C     SUBROUTINE SINT. THE PRIME FACTORIZATION OF N TOGETHER WITH
    C     A TABULATION OF THE TRIGONOMETRIC FUNCTIONS ARE COMPUTED AND
    C     STORED IN WSAVE.
    C
    C     INPUT PARAMETER
    C
    C     N       THE LENGTH OF THE SEQUENCE TO BE TRANSFORMED.  THE METHOD
    C             IS MOST EFFICIENT WHEN N+1 IS A PRODUCT OF SMALL PRIMES.
    C
    C     OUTPUT PARAMETER
    C
    C     WSAVE   A WORK ARRAY WITH AT LEAST INT(2.5*N+15) LOCATIONS.
    C             DIFFERENT WSAVE ARRAYS ARE REQUIRED FOR DIFFERENT VALUES
    C             OF N. THE CONTENTS OF WSAVE MUST NOT BE CHANGED BETWEEN
    C             CALLS OF SINT.
    C
    C **********************************************************************
    C
    C     SUBROUTINE SINT(N,X,WSAVE)
    C
    C     SUBROUTINE SINT COMPUTES THE DISCRETE FOURIER SINE TRANSFORM
    C     OF AN ODD SEQUENCE X(I). THE TRANSFORM IS DEFINED BELOW AT
    C     OUTPUT PARAMETER X.
    C
    C     SINT IS THE UNNORMALIZED INVERSE OF ITSELF SINCE A CALL OF SINT
    C     FOLLOWED BY ANOTHER CALL OF SINT WILL MULTIPLY THE INPUT SEQUENCE
    C     X BY 2*(N+1).
    C
    C     THE ARRAY WSAVE WHICH IS USED BY SUBROUTINE SINT MUST BE
    C     INITIALIZED BY CALLING SUBROUTINE SINTI(N,WSAVE).
    C
    C     INPUT PARAMETERS
    C
    C     N       THE LENGTH OF THE SEQUENCE TO BE TRANSFORMED.  THE METHOD
    C             IS MOST EFFICIENT WHEN N+1 IS THE PRODUCT OF SMALL PRIMES.
    C
    C     X       AN ARRAY WHICH CONTAINS THE SEQUENCE TO BE TRANSFORMED
    C
    C
    C     WSAVE   A WORK ARRAY WITH DIMENSION AT LEAST INT(2.5*N+15)
    C             IN THE PROGRAM THAT CALLS SINT. THE WSAVE ARRAY MUST BE
    C             INITIALIZED BY CALLING SUBROUTINE SINTI(N,WSAVE) AND A
    C             DIFFERENT WSAVE ARRAY MUST BE USED FOR EACH DIFFERENT
    C             VALUE OF N. THIS INITIALIZATION DOES NOT HAVE TO BE
    C             REPEATED SO LONG AS N REMAINS UNCHANGED THUS SUBSEQUENT
    C             TRANSFORMS CAN BE OBTAINED FASTER THAN THE FIRST.
    C
    C     OUTPUT PARAMETERS
    C
    C     X       FOR I=1,...,N
    C
    C                  X(I)= THE SUM FROM K=1 TO K=N
    C
    C                       2*X(K)*SIN(K*I*PI/(N+1))
    C
    C                  A CALL OF SINT FOLLOWED BY ANOTHER CALL OF
    C                  SINT WILL MULTIPLY THE SEQUENCE X BY 2*(N+1).
    C                  HENCE SINT IS THE UNNORMALIZED INVERSE
    C                  OF ITSELF.
    C
    C     WSAVE   CONTAINS INITIALIZATION CALCULATIONS WHICH MUST NOT BE
    C             DESTROYED BETWEEN CALLS OF SINT.
    C
    C **********************************************************************
    C
    C     SUBROUTINE COSTI(N,WSAVE)
    C
    C     SUBROUTINE COSTI INITIALIZES THE ARRAY WSAVE WHICH IS USED IN
    C     SUBROUTINE COST. THE PRIME FACTORIZATION OF N TOGETHER WITH
    C     A TABULATION OF THE TRIGONOMETRIC FUNCTIONS ARE COMPUTED AND
    C     STORED IN WSAVE.
    C
    C     INPUT PARAMETER
    C
    C     N       THE LENGTH OF THE SEQUENCE TO BE TRANSFORMED.  THE METHOD
    C             IS MOST EFFICIENT WHEN N-1 IS A PRODUCT OF SMALL PRIMES.
    C
    C     OUTPUT PARAMETER
    C
    C     WSAVE   A WORK ARRAY WHICH MUST BE DIMENSIONED AT LEAST 3*N+15.
    C             DIFFERENT WSAVE ARRAYS ARE REQUIRED FOR DIFFERENT VALUES
    C             OF N. THE CONTENTS OF WSAVE MUST NOT BE CHANGED BETWEEN
    C             CALLS OF COST.
    C
    C **********************************************************************
    C
    C     SUBROUTINE COST(N,X,WSAVE)
    C
    C     SUBROUTINE COST COMPUTES THE DISCRETE FOURIER COSINE TRANSFORM
    C     OF AN EVEN SEQUENCE X(I). THE TRANSFORM IS DEFINED BELOW AT OUTPUT
    C     PARAMETER X.
    C
    C     COST IS THE UNNORMALIZED INVERSE OF ITSELF SINCE A CALL OF COST
    C     FOLLOWED BY ANOTHER CALL OF COST WILL MULTIPLY THE INPUT SEQUENCE
    C     X BY 2*(N-1). THE TRANSFORM IS DEFINED BELOW AT OUTPUT PARAMETER X
    C
    C     THE ARRAY WSAVE WHICH IS USED BY SUBROUTINE COST MUST BE
    C     INITIALIZED BY CALLING SUBROUTINE COSTI(N,WSAVE).
    C
    C     INPUT PARAMETERS
    C
    C     N       THE LENGTH OF THE SEQUENCE X. N MUST BE GREATER THAN 1.
    C             THE METHOD IS MOST EFFICIENT WHEN N-1 IS A PRODUCT OF
    C             SMALL PRIMES.
    C
    C     X       AN ARRAY WHICH CONTAINS THE SEQUENCE TO BE TRANSFORMED
    C
    C     WSAVE   A WORK ARRAY WHICH MUST BE DIMENSIONED AT LEAST 3*N+15
    C             IN THE PROGRAM THAT CALLS COST. THE WSAVE ARRAY MUST BE
    C             INITIALIZED BY CALLING SUBROUTINE COSTI(N,WSAVE) AND A
    C             DIFFERENT WSAVE ARRAY MUST BE USED FOR EACH DIFFERENT
    C             VALUE OF N. THIS INITIALIZATION DOES NOT HAVE TO BE
    C             REPEATED SO LONG AS N REMAINS UNCHANGED THUS SUBSEQUENT
    C             TRANSFORMS CAN BE OBTAINED FASTER THAN THE FIRST.
    C
    C     OUTPUT PARAMETERS
    C
    C     X       FOR I=1,...,N
    C
    C                 X(I) = X(1)+(-1)**(I-1)*X(N)
    C
    C                  + THE SUM FROM K=2 TO K=N-1
    C
    C                      2*X(K)*COS((K-1)*(I-1)*PI/(N-1))
    C
    C                  A CALL OF COST FOLLOWED BY ANOTHER CALL OF
    C                  COST WILL MULTIPLY THE SEQUENCE X BY 2*(N-1)
    C                  HENCE COST IS THE UNNORMALIZED INVERSE
    C                  OF ITSELF.
    C
    C     WSAVE   CONTAINS INITIALIZATION CALCULATIONS WHICH MUST NOT BE
    C             DESTROYED BETWEEN CALLS OF COST.
    C
    C **********************************************************************
    C
    C     SUBROUTINE SINQI(N,WSAVE)
    C
    C     SUBROUTINE SINQI INITIALIZES THE ARRAY WSAVE WHICH IS USED IN
    C     BOTH SINQF AND SINQB. THE PRIME FACTORIZATION OF N TOGETHER WITH
    C     A TABULATION OF THE TRIGONOMETRIC FUNCTIONS ARE COMPUTED AND
    C     STORED IN WSAVE.
    C
    C     INPUT PARAMETER
    C
    C     N       THE LENGTH OF THE SEQUENCE TO BE TRANSFORMED. THE METHOD
    C             IS MOST EFFICIENT WHEN N IS A PRODUCT OF SMALL PRIMES.
    C
    C     OUTPUT PARAMETER
    C
    C     WSAVE   A WORK ARRAY WHICH MUST BE DIMENSIONED AT LEAST 3*N+15.
    C             THE SAME WORK ARRAY CAN BE USED FOR BOTH SINQF AND SINQB
    C             AS LONG AS N REMAINS UNCHANGED. DIFFERENT WSAVE ARRAYS
    C             ARE REQUIRED FOR DIFFERENT VALUES OF N. THE CONTENTS OF
    C             WSAVE MUST NOT BE CHANGED BETWEEN CALLS OF SINQF OR SINQB.
    C
    C **********************************************************************
    C
    C     SUBROUTINE SINQF(N,X,WSAVE)
    C
    C     SUBROUTINE SINQF COMPUTES THE FAST FOURIER TRANSFORM OF QUARTER
    C     WAVE DATA. THAT IS , SINQF COMPUTES THE COEFFICIENTS IN A SINE
    C     SERIES REPRESENTATION WITH ONLY ODD WAVE NUMBERS. THE TRANSFORM
    C     IS DEFINED BELOW AT OUTPUT PARAMETER X.
    C
    C     SINQB IS THE UNNORMALIZED INVERSE OF SINQF SINCE A CALL OF SINQF
    C     FOLLOWED BY A CALL OF SINQB WILL MULTIPLY THE INPUT SEQUENCE X
    C     BY 4*N.
    C
    C     THE ARRAY WSAVE WHICH IS USED BY SUBROUTINE SINQF MUST BE
    C     INITIALIZED BY CALLING SUBROUTINE SINQI(N,WSAVE).
    C
    C
    C     INPUT PARAMETERS
    C
    C     N       THE LENGTH OF THE ARRAY X TO BE TRANSFORMED.  THE METHOD
    C             IS MOST EFFICIENT WHEN N IS A PRODUCT OF SMALL PRIMES.
    C
    C     X       AN ARRAY WHICH CONTAINS THE SEQUENCE TO BE TRANSFORMED
    C
    C     WSAVE   A WORK ARRAY WHICH MUST BE DIMENSIONED AT LEAST 3*N+15.
    C             IN THE PROGRAM THAT CALLS SINQF. THE WSAVE ARRAY MUST BE
    C             INITIALIZED BY CALLING SUBROUTINE SINQI(N,WSAVE) AND A
    C             DIFFERENT WSAVE ARRAY MUST BE USED FOR EACH DIFFERENT
    C             VALUE OF N. THIS INITIALIZATION DOES NOT HAVE TO BE
    C             REPEATED SO LONG AS N REMAINS UNCHANGED THUS SUBSEQUENT
    C             TRANSFORMS CAN BE OBTAINED FASTER THAN THE FIRST.
    C
    C     OUTPUT PARAMETERS
    C
    C     X       FOR I=1,...,N
    C
    C                  X(I) = (-1)**(I-1)*X(N)
    C
    C                     + THE SUM FROM K=1 TO K=N-1 OF
    C
    C                     2*X(K)*SIN((2*I-1)*K*PI/(2*N))
    C
    C                  A CALL OF SINQF FOLLOWED BY A CALL OF
    C                  SINQB WILL MULTIPLY THE SEQUENCE X BY 4*N.
    C                  THEREFORE SINQB IS THE UNNORMALIZED INVERSE
    C                  OF SINQF.
    C
    C     WSAVE   CONTAINS INITIALIZATION CALCULATIONS WHICH MUST NOT
    C             BE DESTROYED BETWEEN CALLS OF SINQF OR SINQB.
    C
    C **********************************************************************
    C
    C     SUBROUTINE SINQB(N,X,WSAVE)
    C
    C     SUBROUTINE SINQB COMPUTES THE FAST FOURIER TRANSFORM OF QUARTER
    C     WAVE DATA. THAT IS , SINQB COMPUTES A SEQUENCE FROM ITS
    C     REPRESENTATION IN TERMS OF A SINE SERIES WITH ODD WAVE NUMBERS.
    C     THE TRANSFORM IS DEFINED BELOW AT OUTPUT PARAMETER X.
    C
    C     SINQF IS THE UNNORMALIZED INVERSE OF SINQB SINCE A CALL OF SINQB
    C     FOLLOWED BY A CALL OF SINQF WILL MULTIPLY THE INPUT SEQUENCE X
    C     BY 4*N.
    C
    C     THE ARRAY WSAVE WHICH IS USED BY SUBROUTINE SINQB MUST BE
    C     INITIALIZED BY CALLING SUBROUTINE SINQI(N,WSAVE).
    C
    C
    C     INPUT PARAMETERS
    C
    C     N       THE LENGTH OF THE ARRAY X TO BE TRANSFORMED.  THE METHOD
    C             IS MOST EFFICIENT WHEN N IS A PRODUCT OF SMALL PRIMES.
    C
    C     X       AN ARRAY WHICH CONTAINS THE SEQUENCE TO BE TRANSFORMED
    C
    C     WSAVE   A WORK ARRAY WHICH MUST BE DIMENSIONED AT LEAST 3*N+15.
    C             IN THE PROGRAM THAT CALLS SINQB. THE WSAVE ARRAY MUST BE
    C             INITIALIZED BY CALLING SUBROUTINE SINQI(N,WSAVE) AND A
    C             DIFFERENT WSAVE ARRAY MUST BE USED FOR EACH DIFFERENT
    C             VALUE OF N. THIS INITIALIZATION DOES NOT HAVE TO BE
    C             REPEATED SO LONG AS N REMAINS UNCHANGED THUS SUBSEQUENT
    C             TRANSFORMS CAN BE OBTAINED FASTER THAN THE FIRST.
    C
    C     OUTPUT PARAMETERS
    C
    C     X       FOR I=1,...,N
    C
    C                  X(I)= THE SUM FROM K=1 TO K=N OF
    C
    C                    4*X(K)*SIN((2K-1)*I*PI/(2*N))
    C
    C                  A CALL OF SINQB FOLLOWED BY A CALL OF
    C                  SINQF WILL MULTIPLY THE SEQUENCE X BY 4*N.
    C                  THEREFORE SINQF IS THE UNNORMALIZED INVERSE
    C                  OF SINQB.
    C
    C     WSAVE   CONTAINS INITIALIZATION CALCULATIONS WHICH MUST NOT
    C             BE DESTROYED BETWEEN CALLS OF SINQB OR SINQF.
    C
    C **********************************************************************
    C
    C     SUBROUTINE COSQI(N,WSAVE)
    C
    C     SUBROUTINE COSQI INITIALIZES THE ARRAY WSAVE WHICH IS USED IN
    C     BOTH COSQF AND COSQB. THE PRIME FACTORIZATION OF N TOGETHER WITH
    C     A TABULATION OF THE TRIGONOMETRIC FUNCTIONS ARE COMPUTED AND
    C     STORED IN WSAVE.
    C
    C     INPUT PARAMETER
    C
    C     N       THE LENGTH OF THE ARRAY TO BE TRANSFORMED.  THE METHOD
    C             IS MOST EFFICIENT WHEN N IS A PRODUCT OF SMALL PRIMES.
    C
    C     OUTPUT PARAMETER
    C
    C     WSAVE   A WORK ARRAY WHICH MUST BE DIMENSIONED AT LEAST 3*N+15.
    C             THE SAME WORK ARRAY CAN BE USED FOR BOTH COSQF AND COSQB
    C             AS LONG AS N REMAINS UNCHANGED. DIFFERENT WSAVE ARRAYS
    C             ARE REQUIRED FOR DIFFERENT VALUES OF N. THE CONTENTS OF
    C             WSAVE MUST NOT BE CHANGED BETWEEN CALLS OF COSQF OR COSQB.
    C
    C **********************************************************************
    C
    C     SUBROUTINE COSQF(N,X,WSAVE)
    C
    C     SUBROUTINE COSQF COMPUTES THE FAST FOURIER TRANSFORM OF QUARTER
    C     WAVE DATA. THAT IS , COSQF COMPUTES THE COEFFICIENTS IN A COSINE
    C     SERIES REPRESENTATION WITH ONLY ODD WAVE NUMBERS. THE TRANSFORM
    C     IS DEFINED BELOW AT OUTPUT PARAMETER X
    C
    C     COSQF IS THE UNNORMALIZED INVERSE OF COSQB SINCE A CALL OF COSQF
    C     FOLLOWED BY A CALL OF COSQB WILL MULTIPLY THE INPUT SEQUENCE X
    C     BY 4*N.
    C
    C     THE ARRAY WSAVE WHICH IS USED BY SUBROUTINE COSQF MUST BE
    C     INITIALIZED BY CALLING SUBROUTINE COSQI(N,WSAVE).
    C
    C
    C     INPUT PARAMETERS
    C
    C     N       THE LENGTH OF THE ARRAY X TO BE TRANSFORMED.  THE METHOD
    C             IS MOST EFFICIENT WHEN N IS A PRODUCT OF SMALL PRIMES.
    C
    C     X       AN ARRAY WHICH CONTAINS THE SEQUENCE TO BE TRANSFORMED
    C
    C     WSAVE   A WORK ARRAY WHICH MUST BE DIMENSIONED AT LEAST 3*N+15
    C             IN THE PROGRAM THAT CALLS COSQF. THE WSAVE ARRAY MUST BE
    C             INITIALIZED BY CALLING SUBROUTINE COSQI(N,WSAVE) AND A
    C             DIFFERENT WSAVE ARRAY MUST BE USED FOR EACH DIFFERENT
    C             VALUE OF N. THIS INITIALIZATION DOES NOT HAVE TO BE
    C             REPEATED SO LONG AS N REMAINS UNCHANGED THUS SUBSEQUENT
    C             TRANSFORMS CAN BE OBTAINED FASTER THAN THE FIRST.
    C
    C     OUTPUT PARAMETERS
    C
    C     X       FOR I=1,...,N
    C
    C                  X(I) = X(1) PLUS THE SUM FROM K=2 TO K=N OF
    C
    C                     2*X(K)*COS((2*I-1)*(K-1)*PI/(2*N))
    C
    C                  A CALL OF COSQF FOLLOWED BY A CALL OF
    C                  COSQB WILL MULTIPLY THE SEQUENCE X BY 4*N.
    C                  THEREFORE COSQB IS THE UNNORMALIZED INVERSE
    C                  OF COSQF.
    C
    C     WSAVE   CONTAINS INITIALIZATION CALCULATIONS WHICH MUST NOT
    C             BE DESTROYED BETWEEN CALLS OF COSQF OR COSQB.
    C
    C **********************************************************************
    C
    C     SUBROUTINE COSQB(N,X,WSAVE)
    C
    C     SUBROUTINE COSQB COMPUTES THE FAST FOURIER TRANSFORM OF QUARTER
    C     WAVE DATA. THAT IS , COSQB COMPUTES A SEQUENCE FROM ITS
    C     REPRESENTATION IN TERMS OF A COSINE SERIES WITH ODD WAVE NUMBERS.
    C     THE TRANSFORM IS DEFINED BELOW AT OUTPUT PARAMETER X.
    C
    C     COSQB IS THE UNNORMALIZED INVERSE OF COSQF SINCE A CALL OF COSQB
    C     FOLLOWED BY A CALL OF COSQF WILL MULTIPLY THE INPUT SEQUENCE X
    C     BY 4*N.
    C
    C     THE ARRAY WSAVE WHICH IS USED BY SUBROUTINE COSQB MUST BE
    C     INITIALIZED BY CALLING SUBROUTINE COSQI(N,WSAVE).
    C
    C
    C     INPUT PARAMETERS
    C
    C     N       THE LENGTH OF THE ARRAY X TO BE TRANSFORMED.  THE METHOD
    C             IS MOST EFFICIENT WHEN N IS A PRODUCT OF SMALL PRIMES.
    C
    C     X       AN ARRAY WHICH CONTAINS THE SEQUENCE TO BE TRANSFORMED
    C
    C     WSAVE   A WORK ARRAY THAT MUST BE DIMENSIONED AT LEAST 3*N+15
    C             IN THE PROGRAM THAT CALLS COSQB. THE WSAVE ARRAY MUST BE
    C             INITIALIZED BY CALLING SUBROUTINE COSQI(N,WSAVE) AND A
    C             DIFFERENT WSAVE ARRAY MUST BE USED FOR EACH DIFFERENT
    C             VALUE OF N. THIS INITIALIZATION DOES NOT HAVE TO BE
    C             REPEATED SO LONG AS N REMAINS UNCHANGED THUS SUBSEQUENT
    C             TRANSFORMS CAN BE OBTAINED FASTER THAN THE FIRST.
    C
    C     OUTPUT PARAMETERS
    C
    C     X       FOR I=1,...,N
    C
    C                  X(I)= THE SUM FROM K=1 TO K=N OF
    C
    C                    4*X(K)*COS((2*K-1)*(I-1)*PI/(2*N))
    C
    C                  A CALL OF COSQB FOLLOWED BY A CALL OF
    C                  COSQF WILL MULTIPLY THE SEQUENCE X BY 4*N.
    C                  THEREFORE COSQF IS THE UNNORMALIZED INVERSE
    C                  OF COSQB.
    C
    C     WSAVE   CONTAINS INITIALIZATION CALCULATIONS WHICH MUST NOT
    C             BE DESTROYED BETWEEN CALLS OF COSQB OR COSQF.
    C
    C **********************************************************************
    C
    C     SUBROUTINE CFFTI(N,WSAVE)
    C
    C     SUBROUTINE CFFTI INITIALIZES THE ARRAY WSAVE WHICH IS USED IN
    C     BOTH CFFTF AND CFFTB. THE PRIME FACTORIZATION OF N TOGETHER WITH
    C     A TABULATION OF THE TRIGONOMETRIC FUNCTIONS ARE COMPUTED AND
    C     STORED IN WSAVE.
    C
    C     INPUT PARAMETER
    C
    C     N       THE LENGTH OF THE SEQUENCE TO BE TRANSFORMED
    C
    C     OUTPUT PARAMETER
    C
    C     WSAVE   A WORK ARRAY WHICH MUST BE DIMENSIONED AT LEAST 4*N+15
    C             THE SAME WORK ARRAY CAN BE USED FOR BOTH CFFTF AND CFFTB
    C             AS LONG AS N REMAINS UNCHANGED. DIFFERENT WSAVE ARRAYS
    C             ARE REQUIRED FOR DIFFERENT VALUES OF N. THE CONTENTS OF
    C             WSAVE MUST NOT BE CHANGED BETWEEN CALLS OF CFFTF OR CFFTB.
    C
    C **********************************************************************
    C
    C     SUBROUTINE CFFTF(N,C,WSAVE)
    C
    C     SUBROUTINE CFFTF COMPUTES THE FORWARD COMPLEX DISCRETE FOURIER
    C     TRANSFORM (THE FOURIER ANALYSIS). EQUIVALENTLY , CFFTF COMPUTES
    C     THE FOURIER COEFFICIENTS OF A COMPLEX PERIODIC SEQUENCE.
    C     THE TRANSFORM IS DEFINED BELOW AT OUTPUT PARAMETER C.
    C
    C     THE TRANSFORM IS NOT NORMALIZED. TO OBTAIN A NORMALIZED TRANSFORM
    C     THE OUTPUT MUST BE DIVIDED BY N. OTHERWISE A CALL OF CFFTF
    C     FOLLOWED BY A CALL OF CFFTB WILL MULTIPLY THE SEQUENCE BY N.
    C
    C     THE ARRAY WSAVE WHICH IS USED BY SUBROUTINE CFFTF MUST BE
    C     INITIALIZED BY CALLING SUBROUTINE CFFTI(N,WSAVE).
    C
    C     INPUT PARAMETERS
    C
    C
    C     N      THE LENGTH OF THE COMPLEX SEQUENCE C. THE METHOD IS
    C            MORE EFFICIENT WHEN N IS THE PRODUCT OF SMALL PRIMES. N
    C
    C     C      A COMPLEX ARRAY OF LENGTH N WHICH CONTAINS THE SEQUENCE
    C
    C     WSAVE   A REAL WORK ARRAY WHICH MUST BE DIMENSIONED AT LEAST 4N+15
    C             IN THE PROGRAM THAT CALLS CFFTF. THE WSAVE ARRAY MUST BE
    C             INITIALIZED BY CALLING SUBROUTINE CFFTI(N,WSAVE) AND A
    C             DIFFERENT WSAVE ARRAY MUST BE USED FOR EACH DIFFERENT
    C             VALUE OF N. THIS INITIALIZATION DOES NOT HAVE TO BE
    C             REPEATED SO LONG AS N REMAINS UNCHANGED THUS SUBSEQUENT
    C             TRANSFORMS CAN BE OBTAINED FASTER THAN THE FIRST.
    C             THE SAME WSAVE ARRAY CAN BE USED BY CFFTF AND CFFTB.
    C
    C     OUTPUT PARAMETERS
    C
    C     C      FOR J=1,...,N
    C
    C                C(J)=THE SUM FROM K=1,...,N OF
    C
    C                      C(K)*EXP(-I*(J-1)*(K-1)*2*PI/N)
    C
    C                            WHERE I=SQRT(-1)
    C
    C     WSAVE   CONTAINS INITIALIZATION CALCULATIONS WHICH MUST NOT BE
    C             DESTROYED BETWEEN CALLS OF SUBROUTINE CFFTF OR CFFTB
    C
    C **********************************************************************
    C
    C     SUBROUTINE CFFTB(N,C,WSAVE)
    C
    C     SUBROUTINE CFFTB COMPUTES THE BACKWARD COMPLEX DISCRETE FOURIER
    C     TRANSFORM (THE FOURIER SYNTHESIS). EQUIVALENTLY , CFFTB COMPUTES
    C     A COMPLEX PERIODIC SEQUENCE FROM ITS FOURIER COEFFICIENTS.
    C     THE TRANSFORM IS DEFINED BELOW AT OUTPUT PARAMETER C.
    C
    C     A CALL OF CFFTF FOLLOWED BY A CALL OF CFFTB WILL MULTIPLY THE
    C     SEQUENCE BY N.
    C
    C     THE ARRAY WSAVE WHICH IS USED BY SUBROUTINE CFFTB MUST BE
    C     INITIALIZED BY CALLING SUBROUTINE CFFTI(N,WSAVE).
    C
    C     INPUT PARAMETERS
    C
    C
    C     N      THE LENGTH OF THE COMPLEX SEQUENCE C. THE METHOD IS
    C            MORE EFFICIENT WHEN N IS THE PRODUCT OF SMALL PRIMES.
    C
    C     C      A COMPLEX ARRAY OF LENGTH N WHICH CONTAINS THE SEQUENCE
    C
    C     WSAVE   A REAL WORK ARRAY WHICH MUST BE DIMENSIONED AT LEAST 4N+15
    C             IN THE PROGRAM THAT CALLS CFFTB. THE WSAVE ARRAY MUST BE
    C             INITIALIZED BY CALLING SUBROUTINE CFFTI(N,WSAVE) AND A
    C             DIFFERENT WSAVE ARRAY MUST BE USED FOR EACH DIFFERENT
    C             VALUE OF N. THIS INITIALIZATION DOES NOT HAVE TO BE
    C             REPEATED SO LONG AS N REMAINS UNCHANGED THUS SUBSEQUENT
    C             TRANSFORMS CAN BE OBTAINED FASTER THAN THE FIRST.
    C             THE SAME WSAVE ARRAY CAN BE USED BY CFFTF AND CFFTB.
    C
    C     OUTPUT PARAMETERS
    C
    C     C      FOR J=1,...,N
    C
    C                C(J)=THE SUM FROM K=1,...,N OF
    C
    C                      C(K)*EXP(I*(J-1)*(K-1)*2*PI/N)
    C
    C                            WHERE I=SQRT(-1)
    C
    C     WSAVE   CONTAINS INITIALIZATION CALCULATIONS WHICH MUST NOT BE
    C             DESTROYED BETWEEN CALLS OF SUBROUTINE CFFTF OR CFFTB
    C **********************************************************************

GENBUN

          SUBROUTINE GENBUN (NPEROD,N,MPEROD,M,A,B,C,IDIMY,Y,IERROR,W)
    C
    C     * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
    C     *                                                               *
    C     *                  copyright (c) 1999 by UCAR                   *
    C     *                                                               *
    C     *       UNIVERSITY CORPORATION for ATMOSPHERIC RESEARCH         *
    C     *                                                               *
    C     *                      all rights reserved                      *
    C     *                                                               *
    C     *                      FISHPACK version 4.1                     *
    C     *                                                               *
    C     *     A PACKAGE OF FORTRAN SUBPROGRAMS FOR THE SOLUTION OF      *
    C     *                                                               *
    C     *      SEPARABLE ELLIPTIC PARTIAL DIFFERENTIAL EQUATIONS        *
    C     *                                                               *
    C     *                             BY                                *
    C     *                                                               *
    C     *        JOHN ADAMS, PAUL SWARZTRAUBER AND ROLAND SWEET         *
    C     *                                                               *
    C     *                             OF                                *
    C     *                                                               *
    C     *         THE NATIONAL CENTER FOR ATMOSPHERIC RESEARCH          *
    C     *                                                               *
    C     *                BOULDER, COLORADO  (80307)  U.S.A.             *
    C     *                                                               *
    C     *                   WHICH IS SPONSORED BY                       *
    C     *                                                               *
    C     *              THE NATIONAL SCIENCE FOUNDATION                  *
    C     *                                                               *
    C     * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
    C
    C
    C
    C DIMENSION OF           A(M),B(M),C(M),Y(IDIMY,N),
    C                        W(SEE PARAMETER LIST)
    C ARGUMENTS
    C
    C LATEST REVISION        NOVEMBER 1988
    C
    C PURPOSE                THE NAME OF THIS PACKAGE IS A MNEMONIC FOR THE
    C                        GENERALIZED BUNEMAN ALGORITHM.
    C
    C                        IT SOLVES THE REAL LINEAR SYSTEM OF EQUATIONS
    C
    C                        A(I)*X(I-1,J) + B(I)*X(I,J) + C(I)*X(I+1,J)
    C                        + X(I,J-1) - 2.*X(I,J) + X(I,J+1) = Y(I,J)
    C
    C                        FOR I = 1,2,...,M  AND  J = 1,2,...,N.
    C
    C                        INDICES I+1 AND I-1 ARE EVALUATED MODULO M,
    C                        I.E., X(0,J) = X(M,J) AND X(M+1,J) = X(1,J),
    C                        AND X(I,0) MAY EQUAL 0, X(I,2), OR X(I,N),
    C                        AND X(I,N+1) MAY EQUAL 0, X(I,N-1), OR X(I,1)
    C                        DEPENDING ON AN INPUT PARAMETER.
    C
    C USAGE                  CALL GENBUN (NPEROD,N,MPEROD,M,A,B,C,IDIMY,Y,
    C                                     IERROR,W)
    C
    C ARGUMENTS
    C
    C ON INPUT               NPEROD
    C
    C                          INDICATES THE VALUES THAT X(I,0) AND
    C                          X(I,N+1) ARE ASSUMED TO HAVE.
    C
    C                          = 0  IF X(I,0) = X(I,N) AND X(I,N+1) =
    C                               X(I,1).
    C                          = 1  IF X(I,0) = X(I,N+1) = 0  .
    C                          = 2  IF X(I,0) = 0 AND X(I,N+1) = X(I,N-1).
    C                          = 3  IF X(I,0) = X(I,2) AND X(I,N+1) =
    C                               X(I,N-1).
    C                          = 4  IF X(I,0) = X(I,2) AND X(I,N+1) = 0.
    C
    C                        N
    C                          THE NUMBER OF UNKNOWNS IN THE J-DIRECTION.
    C                          N MUST BE GREATER THAN 2.
    C
    C                        MPEROD
    C                          = 0 IF A(1) AND C(M) ARE NOT ZERO
    C                          = 1 IF A(1) = C(M) = 0
    C
    C                        M
    C                          THE NUMBER OF UNKNOWNS IN THE I-DIRECTION.
    C                          N MUST BE GREATER THAN 2.
    C
    C                        A,B,C
    C                          ONE-DIMENSIONAL ARRAYS OF LENGTH M THAT
    C                          SPECIFY THE COEFFICIENTS IN THE LINEAR
    C                          EQUATIONS GIVEN ABOVE.  IF MPEROD = 0
    C                          THE ARRAY ELEMENTS MUST NOT DEPEND UPON
    C                          THE INDEX I, BUT MUST BE CONSTANT.
    C                          SPECIFICALLY, THE SUBROUTINE CHECKS THE
    C                          FOLLOWING CONDITION .
    C
    C                            A(I) = C(1)
    C                            C(I) = C(1)
    C                            B(I) = B(1)
    C
    C                          FOR I=1,2,...,M.
    C
    C                        IDIMY
    C                          THE ROW (OR FIRST) DIMENSION OF THE
    C                          TWO-DIMENSIONAL ARRAY Y AS IT APPEARS
    C                          IN THE PROGRAM CALLING GENBUN.
    C                          THIS PARAMETER IS USED TO SPECIFY THE
    C                          VARIABLE DIMENSION OF Y.
    C                          IDIMY MUST BE AT LEAST M.
    C
    C                        Y
    C                          A TWO-DIMENSIONAL COMPLEX ARRAY THAT
    C                          SPECIFIES THE VALUES OF THE RIGHT SIDE
    C                          OF THE LINEAR SYSTEM OF EQUATIONS GIVEN
    C                          ABOVE.
    C                          Y MUST BE DIMENSIONED AT LEAST M*N.
    C
    C                        W
    C                          A ONE-DIMENSIONAL ARRAY THAT MUST
    C                          BE PROVIDED BY THE USER FOR WORK
    C                          SPACE.  W MAY REQUIRE UP TO 4*N +
    C                          (10 + INT(LOG2(N)))*M LOCATIONS.
    C                          THE ACTUAL NUMBER OF LOCATIONS USED IS
    C                          COMPUTED BY GENBUN AND IS RETURNED IN
    C                          LOCATION W(1).
    C
    C
    C  ON OUTPUT             Y
    C
    C                          CONTAINS THE SOLUTION X.
    C
    C                        IERROR
    C                          AN ERROR FLAG WHICH INDICATES INVALID
    C                          INPUT PARAMETERS  EXCEPT FOR NUMBER
    C                          ZERO, A SOLUTION IS NOT ATTEMPTED.
    C
    C                          = 0  NO ERROR.
    C                          = 1  M .LE. 2  .
    C                          = 2  N .LE. 2
    C                          = 3  IDIMY .LT. M
    C                          = 4  NPEROD .LT. 0 OR NPEROD .GT. 4
    C                          = 5  MPEROD .LT. 0 OR MPEROD .GT. 1
    C                          = 6  A(I) .NE. C(1) OR C(I) .NE. C(1) OR
    C                               B(I) .NE. B(1) FOR
    C                               SOME I=1,2,...,M.
    C                          = 7  A(1) .NE. 0 OR C(M) .NE. 0 AND
    C                                 MPEROD = 1
    C
    C                        W
    C                          W(1) CONTAINS THE REQUIRED LENGTH OF W.
    C
    C SPECIAL CONDITONS      NONE
    C
    C I/O                    NONE
    C
    C PRECISION              SINGLE
    C
    C REQUIRED LIBRARY       COMF AND GNBNAUX FROM FISHPAK
    C FILES
    C
    C LANGUAGE               FORTRAN
    C
    C HISTORY                WRITTEN IN 1979 BY ROLAND SWEET OF NCAR'S
    C                        SCIENTIFIC COMPUTING DIVISION.  MADE AVAILABLE
    C                        ON NCAR'S PUBLIC LIBRARIES IN JANUARY, 1980.
    C
    C ALGORITHM              THE LINEAR SYSTEM IS SOLVED BY A CYCLIC
    C                        REDUCTION ALGORITHM DESCRIBED IN THE
    C                        REFERENCE.
    C
    C PORTABILITY            FORTRAN 77 --
    C                        THE MACHINE DEPENDENT CONSTANT PI IS
    C                        DEFINED IN FUNCTION PIMACH.
    C
    C REFERENCES             SWEET, R., "A CYCLIC REDUCTION ALGORITHM FOR
    C                        SOLVING BLOCK TRIDIAGONAL SYSTEMS OF ARBITRARY
    C                        DIMENSIONS," SIAM J. ON NUMER. ANAL., 14 (1977)
    C                        PP. 706-720.
    C
    C ACCURACY               THIS TEST WAS PERFORMED ON A CDC 7600:
    C
    C                        A UNIFORM RANDOM NUMBER GENERATOR WAS USED
    C                        TO CREATE A SOLUTION ARRAY X FOR THE SYSTEM
    C                        GIVEN IN THE 'PURPOSE' DESCRIPTION ABOVE
    C                        WITH
    C                          A(I) = C(I) = -0.5*B(I) = 1, I=1,2,...,M
    C
    C                        AND, WHEN MPEROD = 1
    C
    C                          A(1) = C(M) = 0
    C                          A(M) = C(1) = 2.
    C
    C                        THE SOLUTION X WAS SUBSTITUTED INTO THE
    C                        GIVEN SYSTEM  AND, USING DOUBLE PRECISION
    C                        A RIGHT SIDE Y WAS COMPUTED.
    C                        USING THIS ARRAY Y, SUBROUTINE GENBUN
    C                        WAS CALLED TO PRODUCE APPROXIMATE
    C                        SOLUTION Z.  THEN RELATIVE ERROR
    C                          E = MAX(ABS(Z(I,J)-X(I,J)))/
    C                              MAX(ABS(X(I,J)))
    C                        WAS COMPUTED, WHERE THE TWO MAXIMA ARE TAKEN
    C                        OVER I=1,2,...,M AND J=1,...,N.
    C
    C                        THE VALUE OF E IS GIVEN IN THE TABLE
    C                        BELOW FOR SOME TYPICAL VALUES OF M AND N.
    C
    C                   M (=N)    MPEROD    NPEROD    T(MSECS)    E
    C                   ------    ------    ------    --------  ------
    C
    C                     31        0         0          36     6.E-14
    C                     31        1         1          21     4.E-13
    C                     31        1         3          41     3.E-13
    C                     32        0         0          29     9.E-14
    C                     32        1         1          32     3.E-13
    C                     32        1         3          48     1.E-13
    C                     33        0         0          36     9.E-14
    C                     33        1         1          30     4.E-13
    C                     33        1         3          34     1.E-13
    C                     63        0         0         150     1.E-13
    C                     63        1         1          91     1.E-12
    C                     63        1         3         173     2.E-13
    C                     64        0         0         122     1.E-13
    C                     64        1         1         128     1.E-12
    C                     64        1         3         199     6.E-13
    C                     65        0         0         143     2.E-13
    C                     65        1         1         120     1.E-12
    C                     65        1         3         138     4.E-13
    C * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

GNBNAUX

    C
    C     * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
    C     *                                                               *
    C     *                  copyright (c) 1999 by UCAR                   *
    C     *                                                               *
    C     *       UNIVERSITY CORPORATION for ATMOSPHERIC RESEARCH         *
    C     *                                                               *
    C     *                      all rights reserved                      *
    C     *                                                               *
    C     *                      FISHPACK version 4.1                     *
    C     *                                                               *
    C     *     A PACKAGE OF FORTRAN SUBPROGRAMS FOR THE SOLUTION OF      *
    C     *                                                               *
    C     *      SEPARABLE ELLIPTIC PARTIAL DIFFERENTIAL EQUATIONS        *
    C     *                                                               *
    C     *                             BY                                *
    C     *                                                               *
    C     *        JOHN ADAMS, PAUL SWARZTRAUBER AND ROLAND SWEET         *
    C     *                                                               *
    C     *                             OF                                *
    C     *                                                               *
    C     *         THE NATIONAL CENTER FOR ATMOSPHERIC RESEARCH          *
    C     *                                                               *
    C     *                BOULDER, COLORADO  (80307)  U.S.A.             *
    C     *                                                               *
    C     *                   WHICH IS SPONSORED BY                       *
    C     *                                                               *
    C     *              THE NATIONAL SCIENCE FOUNDATION                  *
    C     *                                                               *
    C     * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
    C
    C
    C PACKAGE GNBNAUX
    C
    C LATEST REVISION        NOVEMBER 1988
    C
    C PURPOSE                TO PROVIDE AUXILIARY ROUTINES FOR FISHPAK
    C                        ENTRIES GENBUN AND POISTG.
    C
    C USAGE                  THERE ARE NO USER ENTRIES IN THIS PACKAGE.
    C                        THE ROUTINES IN THIS PACKAGE ARE NOT INTENDED
    C                        TO BE CALLED BY USERS, BUT RATHER BY ROUTINES
    C                        IN PACKAGES GENBUN AND POISTG.
    C
    C SPECIAL CONDITIONS     NONE
    C
    C I/O                    NONE
    C
    C PRECISION              SINGLE
    C
    C REQUIRED LIBRARY       COMF FROM FISHPAK
    C FILES
    C
    C LANGUAGE               FORTRAN
    C
    C HISTORY                WRITTEN IN 1979 BY ROLAND SWEET OF NCAR'S
    C                        SCIENTIFIC COMPUTING DIVISION.  MADE AVAILABLE
    C                        ON NCAR'S PUBLIC LIBRARIES IN JANUARY, 1980.
    C
    C PORTABILITY            FORTRAN 77
    C ********************************************************************

HSTCRT

          SUBROUTINE HSTCRT (A,B,M,MBDCND,BDA,BDB,C,D,N,NBDCND,BDC,BDD,
         1                   ELMBDA,F,IDIMF,PERTRB,IERROR,W)
    C
    C     * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
    C     *                                                               *
    C     *                  copyright (c) 1999 by UCAR                   *
    C     *                                                               *
    C     *       UNIVERSITY CORPORATION for ATMOSPHERIC RESEARCH         *
    C     *                                                               *
    C     *                      all rights reserved                      *
    C     *                                                               *
    C     *                      FISHPACK version 4.1                     *
    C     *                                                               *
    C     *     A PACKAGE OF FORTRAN SUBPROGRAMS FOR THE SOLUTION OF      *
    C     *                                                               *
    C     *      SEPARABLE ELLIPTIC PARTIAL DIFFERENTIAL EQUATIONS        *
    C     *                                                               *
    C     *                             BY                                *
    C     *                                                               *
    C     *        JOHN ADAMS, PAUL SWARZTRAUBER AND ROLAND SWEET         *
    C     *                                                               *
    C     *                             OF                                *
    C     *                                                               *
    C     *         THE NATIONAL CENTER FOR ATMOSPHERIC RESEARCH          *
    C     *                                                               *
    C     *                BOULDER, COLORADO  (80307)  U.S.A.             *
    C     *                                                               *
    C     *                   WHICH IS SPONSORED BY                       *
    C     *                                                               *
    C     *              THE NATIONAL SCIENCE FOUNDATION                  *
    C     *                                                               *
    C     * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
    C
    C
    C
    C DIMENSION OF           BDA(N),BDB(N),BDC(M),BDD(M),F(IDIMF,N),
    C ARGUMENTS              W(SEE ARGUMENT LIST)
    C
    C LATEST REVISION        NOVEMBER 1988
    C
    C PURPOSE                 SOLVES THE STANDARD FIVE-POINT FINITE
    C                         DIFFERENCE APPROXIMATION TO THE HELMHOLTZ
    C                         EQUATION
    C                           (D/DX)(DU/DX) + (D/DY)(DU/DY) + LAMBDA*U
    C                           = F(X,Y)
    C                         ON A STAGGERED GRID IN CARTESIAN COORDINATES.
    C
    C USAGE                   CALL HSTCRT (A,B,M,MBDCND,BDA,BDB,C,D
    C                                      N,NBDCND,BDC,BDD,ELMBDA,
    C                                      F,IDIMF,PERTRB,IERROR,W)
    C
    C ARGUMENTS
    C ON INPUT
    C
    C                        A,B
    C                          THE RANGE OF X, I.E. A .LE. X .LE. B.
    C                          A MUST BE LESS THAN B.
    C
    C                        M
    C                          THE NUMBER OF GRID POINTS IN THE
    C                          INTERVAL (A,B).  THE GRID POINTS
    C                          IN THE X-DIRECTION ARE GIVEN BY
    C                          X(I) = A + (I-0.5)DX FOR I=1,2,...,M
    C                          WHERE DX =(B-A)/M.  M MUST BE GREATER
    C                          THAN 2.
    C
    C                        MBDCND
    C                          INDICATES THE TYPE OF BOUNDARY CONDITIONS
    C                          AT X = A AND X = B.
    C
    C                          = 0  IF THE SOLUTION IS PERIODIC IN X,
    C                               U(M+I,J) = U(I,J).
    C
    C                          = 1  IF THE SOLUTION IS SPECIFIED AT
    C                               X = A AND X = B.
    C
    C                          = 2  IF THE SOLUTION IS SPECIFIED AT
    C                               X = A AND THE DERIVATIVE
    C                               OF THE SOLUTION WITH RESPECT TO X
    C                               IS SPECIFIED AT X = B.
    C
    C                          = 3  IF THE DERIVATIVE OF THE SOLUTION
    C                               WITH RESPECT TO X IS SPECIFIED
    C                               AT X = A  AND X = B.
    C
    C                          = 4  IF THE DERIVATIVE OF THE SOLUTION
    C                               WITH RESPECT TO X IS SPECIFIED
    C                               AT X = A  AND THE SOLUTION IS
    C                               SPECIFIED AT X = B.
    C
    C                        BDA
    C                          A ONE-DIMENSIONAL ARRAY OF LENGTH N
    C                          THAT SPECIFIES THE BOUNDARY VALUES
    C                          (IF ANY) OF THE SOLUTION AT X = A.
    C
    C                          WHEN MBDCND = 1 OR 2,
    C                            BDA(J) = U(A,Y(J)) ,         J=1,2,...,N.
    C
    C                          WHEN MBDCND = 3 OR 4,
    C                            BDA(J) = (D/DX)U(A,Y(J)) ,   J=1,2,...,N.
    C
    C                        BDB
    C                          A ONE-DIMENSIONAL ARRAY OF LENGTH N
    C                          THAT SPECIFIES THE BOUNDARY VALUES
    C                          OF THE SOLUTION AT X = B.
    C
    C                          WHEN MBDCND = 1 OR 4
    C                            BDB(J) = U(B,Y(J)) ,        J=1,2,...,N.
    C
    C                          WHEN MBDCND = 2 OR 3
    C                            BDB(J) = (D/DX)U(B,Y(J)) ,  J=1,2,...,N.
    C
    C                        C,D
    C                          THE RANGE OF Y, I.E. C .LE. Y .LE. D.
    C                          C MUST BE LESS THAN D.
    C
    C
    C                        N
    C                          THE NUMBER OF UNKNOWNS IN THE INTERVAL
    C                          (C,D).  THE UNKNOWNS IN THE Y-DIRECTION
    C                          ARE GIVEN BY Y(J) = C + (J-0.5)DY,
    C                          J=1,2,...,N, WHERE DY = (D-C)/N.
    C                          N MUST BE GREATER THAN 2.
    C
    C                        NBDCND
    C                          INDICATES THE TYPE OF BOUNDARY CONDITIONS
    C                          AT Y = C   AND Y = D.
    C
    C
    C                          = 0  IF THE SOLUTION IS PERIODIC IN Y, I.E.
    C                               U(I,J) = U(I,N+J).
    C
    C                          = 1  IF THE SOLUTION IS SPECIFIED AT Y = C
    C                               AND Y = D.
    C
    C                          = 2  IF THE SOLUTION IS SPECIFIED AT Y = C
    C                               AND THE DERIVATIVE OF THE SOLUTION
    C                               WITH RESPECT TO Y IS SPECIFIED AT
    C                               Y = D.
    C
    C                          = 3  IF THE DERIVATIVE OF THE SOLUTION
    C                               WITH RESPECT TO Y IS SPECIFIED AT
    C                               Y = C AND Y = D.
    C
    C                          = 4  IF THE DERIVATIVE OF THE SOLUTION
    C                               WITH RESPECT TO Y IS SPECIFIED AT
    C                               Y = C AND THE SOLUTION IS SPECIFIED
    C                               AT Y = D.
    C
    C                        BDC
    C                          A ONE DIMENSIONAL ARRAY OF LENGTH M THAT
    C                          SPECIFIES THE BOUNDARY VALUES OF THE
    C                          SOLUTION AT Y = C.
    C
    C                          WHEN NBDCND = 1 OR 2,
    C                            BDC(I) = U(X(I),C) ,        I=1,2,...,M.
    C
    C                          WHEN NBDCND = 3 OR 4,
    C                            BDC(I) = (D/DY)U(X(I),C),   I=1,2,...,M.
    C
    C                          WHEN NBDCND = 0, BDC IS A DUMMY VARIABLE.
    C
    C                        BDD
    C                          A ONE-DIMENSIONAL ARRAY OF LENGTH M THAT
    C                          SPECIFIES THE BOUNDARY VALUES OF THE
    C                          SOLUTION AT Y = D.
    C
    C                          WHEN NBDCND = 1 OR 4,
    C                            BDD(I) = U(X(I),D) ,        I=1,2,...,M.
    C
    C                          WHEN NBDCND = 2 OR 3,
    C                            BDD(I) = (D/DY)U(X(I),D) ,  I=1,2,...,M.
    C
    C                          WHEN NBDCND = 0, BDD IS A DUMMY VARIABLE.
    C
    C                        ELMBDA
    C                          THE CONSTANT LAMBDA IN THE HELMHOLTZ
    C                          EQUATION.  IF LAMBDA IS GREATER THAN 0,
    C                          A SOLUTION MAY NOT EXIST. HOWEVER,
    C                          HSTCRT WILL  ATTEMPT TO FIND A SOLUTION.
    C
    C                        F
    C                          A TWO-DIMENSIONAL ARRAY THAT SPECIFIES
    C                          THE VALUES OF THE RIGHT SIDE OF THE
    C                          HELMHOLTZ EQUATION.  FOR I=1,2,...,M
    C                          AND J=1,2,...,N
    C
    C                            F(I,J) = F(X(I),Y(J)) .
    C
    C                          F MUST BE DIMENSIONED AT LEAST M X N.
    C
    C                        IDIMF
    C                          THE ROW (OR FIRST) DIMENSION OF THE ARRAY
    C                          F AS IT APPEARS IN THE PROGRAM CALLING
    C                          HSTCRT.  THIS PARAMETER IS USED TO SPECIFY
    C                          THE VARIABLE DIMENSION OF F.
    C                          IDIMF MUST BE AT LEAST M.
    C
    C                        W
    C                          A ONE-DIMENSIONAL ARRAY THAT MUST BE
    C                          PROVIDED BY THE USER FOR WORK SPACE.
    C                          W MAY REQUIRE UP TO 13M + 4N +
    C                          M*INT(LOG2(N)) LOCATIONS. THE ACTUAL NUMBER
    C                          OF LOCATIONS USED IS COMPUTED BY HSTCRT
    C                          AND IS RETURNED IN THE LOCATION W(1).
    C
    C ON OUTPUT              F
    C                          CONTAINS THE SOLUTION U(I,J) OF THE FINITE
    C                          DIFFERENCE APPROXIMATION FOR THE GRID POINT
    C                          (X(I),Y(J)) FOR  I=1,2,...,M, J=1,2,...,N.
    C
    C                        PERTRB
    C                          IF A COMBINATION OF PERIODIC OR DERIVATIVE
    C                          BOUNDARY CONDITIONS IS SPECIFIED FOR A
    C                          POISSON EQUATION (LAMBDA = 0), A SOLUTION
    C                          MAY NOT EXIST.  PERTRB IS A CONSTANT,
    C                          CALCULATED AND SUBTRACTED FROM F, WHICH
    C                          ENSURES THAT A SOLUTION EXISTS.  HSTCRT
    C                          THEN COMPUTES THIS SOLUTION, WHICH IS A
    C                          LEAST SQUARES SOLUTION TO THE ORIGINAL
    C                          APPROXIMATION.  THIS SOLUTION PLUS ANY
    C                          CONSTANT IS ALSO A SOLUTION; HENCE, THE
    C                          SOLUTION IS NOT UNIQUE.  THE VALUE OF
    C                          PERTRB SHOULD BE SMALL COMPARED TO THE
    C                          RIGHT SIDE F.  OTHERWISE, A SOLUTION IS
    C                          OBTAINED TO AN ESSENTIALLY DIFFERENT PROBLEM.
    C                          THIS COMPARISON SHOULD ALWAYS BE MADE TO
    C                          INSURE THAT A MEANINGFUL SOLUTION HAS BEEN
    C                          OBTAINED.
    C
    C                        IERROR
    C                          AN ERROR FLAG THAT INDICATES INVALID INPUT
    C                          PARAMETERS.  EXCEPT TO NUMBERS 0 AND  6,
    C                          A SOLUTION IS NOT ATTEMPTED.
    C
    C                          =  0  NO ERROR
    C
    C                          =  1  A .GE. B
    C
    C                          =  2  MBDCND .LT. 0 OR MBDCND .GT. 4
    C
    C                          =  3  C .GE. D
    C
    C                          =  4  N .LE. 2
    C
    C                         =  5  NBDCND .LT. 0 OR NBDCND .GT. 4
    C
    C                         =  6  LAMBDA .GT. 0
    C
    C                         =  7  IDIMF .LT. M
    C
    C                         =  8  M .LE. 2
    C
    C                         SINCE THIS IS THE ONLY MEANS OF INDICATING
    C                         A POSSIBLY INCORRECT CALL TO HSTCRT, THE
    C                         USER SHOULD TEST IERROR AFTER THE CALL.
    C
    C                        W
    C                          W(1) CONTAINS THE REQUIRED LENGTH OF W.
    C
    C I/O                    NONE
    C
    C PRECISION              SINGLE
    C
    C REQUIRED LIBRARY       COMF, GENBUN, GNBNAUX, AND POISTG
    C FILES                  FROM FISHPAK
    C
    C LANGUAGE               FORTRAN
    C
    C HISTORY                WRITTEN BY ROLAND SWEET AT NCAR IN 1977.
    C                        RELEASED ON NCAR'S PUBLIC SOFTWARE LIBRARIES
    C                        IN JANUARY 1980.
    C
    C PORTABILITY            FORTRAN 77
    C
    C ALGORITHM              THIS SUBROUTINE DEFINES THE FINITE-DIFFERENCE
    C                        EQUATIONS, INCORPORATES BOUNDARY DATA, ADJUSTS
    C                        THE RIGHT SIDE WHEN THE SYSTEM IS SINGULAR
    C                        AND CALLS EITHER POISTG OR GENBUN WHICH SOLVES
    C                        THE LINEAR SYSTEM OF EQUATIONS.
    C
    C TIMING                 FOR LARGE M AND N, THE OPERATION COUNT
    C                        IS ROUGHLY PROPORTIONAL TO M*N*LOG2(N).
    C
    C ACCURACY               THE SOLUTION PROCESS EMPLOYED RESULTS IN A
    C                        LOSS OF NO MORE THAN FOUR SIGNIFICANT DIGITS
    C                        FOR N AND M AS LARGE AS 64.  MORE DETAILED
    C                        INFORMATION ABOUT ACCURACY CAN BE FOUND IN
    C                        THE DOCUMENTATION FOR PACKAGE POISTG WHICH
    C                        SOLVES THE FINITE DIFFERENCE EQUATIONS.
    C
    C REFERENCES             U. SCHUMANN AND R. SWEET,"A DIRECT METHOD
    C                        FOR THE SOLUTION OF POISSON'S EQUATION WITH
    C                        BOUNDARY CONDITIONS ON A STAGGERED GRID OF
    C                        ARBITRARY SIZE," J. COMP. PHYS. 20(1976),
    C                        PP. 171-182.
    C***********************************************************************

HSTCSP

          SUBROUTINE HSTCSP (INTL,A,B,M,MBDCND,BDA,BDB,C,D,N,NBDCND,BDC,
         1                   BDD,ELMBDA,F,IDIMF,PERTRB,IERROR,W)
    C
    C     * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
    C     *                                                               *
    C     *                  copyright (c) 1999 by UCAR                   *
    C     *                                                               *
    C     *       UNIVERSITY CORPORATION for ATMOSPHERIC RESEARCH         *
    C     *                                                               *
    C     *                      all rights reserved                      *
    C     *                                                               *
    C     *                      FISHPACK version 4.1                     *
    C     *                                                               *
    C     *     A PACKAGE OF FORTRAN SUBPROGRAMS FOR THE SOLUTION OF      *
    C     *                                                               *
    C     *      SEPARABLE ELLIPTIC PARTIAL DIFFERENTIAL EQUATIONS        *
    C     *                                                               *
    C     *                             BY                                *
    C     *                                                               *
    C     *        JOHN ADAMS, PAUL SWARZTRAUBER AND ROLAND SWEET         *
    C     *                                                               *
    C     *                             OF                                *
    C     *                                                               *
    C     *         THE NATIONAL CENTER FOR ATMOSPHERIC RESEARCH          *
    C     *                                                               *
    C     *                BOULDER, COLORADO  (80307)  U.S.A.             *
    C     *                                                               *
    C     *                   WHICH IS SPONSORED BY                       *
    C     *                                                               *
    C     *              THE NATIONAL SCIENCE FOUNDATION                  *
    C     *                                                               *
    C     * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
    C
    C
    C
    C DIMENSION OF           BDA(N),BDB(N),BDC(M),BDD(M),F(IDIMF,N),
    C ARGUMENTS              W(SEE ARGUMENT LIST)
    C
    C LATEST REVISION        NOVEMBER 1988
    C
    C PURPOSE                SOLVES THE STANDARD FIVE-POINT FINITE
    C                        DIFFERENCE APPROXIMATION ON A STAGGERED
    C                        GRID TO THE MODIFIED HELMHOLTZ EQUATION IN
    C                        SPHERICAL COORDINATES ASSUMING AXISYMMETRY
    C                        (NO DEPENDENCE ON LONGITUDE).
    C
    C                        THE EQUATION IS
    C
    C                           (1/R**2)(D/DR)(R**2(DU/DR)) +
    C                           1/(R**2*SIN(THETA))(D/DTHETA)
    C                           (SIN(THETA)(DU/DTHETA)) +
    C                           (LAMBDA/(R*SIN(THETA))**2)U  =  F(THETA,R)
    C
    C                        WHERE THETA IS COLATITUDE AND R IS THE
    C                        RADIAL COORDINATE. THIS TWO-DIMENSIONAL
    C                        MODIFIED HELMHOLTZ EQUATION RESULTS FROM
    C                        THE FOURIER TRANSFORM OF THE THREE-
    C                        DIMENSIONAL POISSON EQUATION.
    C
    C
    C USAGE                  CALL HSTCSP (INTL,A,B,M,MBDCND,BDA,BDB,C,D,N,
    C                                     NBDCND,BDC,BDD,ELMBDA,F,IDIMF,
    C                                     PERTRB,IERROR,W)
    C
    C ARGUMENTS
    C  ON INPUT              INTL
    C
    C                          = 0  ON INITIAL ENTRY TO HSTCSP OR IF ANY
    C                               OF THE ARGUMENTS C, D, N, OR NBDCND
    C                               ARE CHANGED FROM A PREVIOUS CALL
    C
    C                          = 1  IF C, D, N, AND NBDCND ARE ALL
    C                               UNCHANGED FROM PREVIOUS CALL TO HSTCSP
    C
    C                          NOTE:
    C                          A CALL WITH INTL = 0 TAKES APPROXIMATELY
    C                          1.5 TIMES AS MUCH TIME AS A CALL WITH
    C                          INTL = 1.  ONCE A CALL WITH INTL = 0
    C                          HAS BEEN MADE THEN SUBSEQUENT SOLUTIONS
    C                          CORRESPONDING TO DIFFERENT F, BDA, BDB,
    C                          BDC, AND BDD CAN BE OBTAINED FASTER WITH
    C                          INTL = 1 SINCE INITIALIZATION IS NOT
    C                          REPEATED.
    C
    C                        A,B
    C                          THE RANGE OF THETA (COLATITUDE),
    C                          I.E. A .LE. THETA .LE. B.  A
    C                          MUST BE LESS THAN B AND A MUST BE
    C                          NON-NEGATIVE.  A AND B ARE IN RADIANS.
    C                          A = 0 CORRESPONDS TO THE NORTH POLE AND
    C                          B = PI CORRESPONDS TO THE SOUTH POLE.
    C
    C                          * * *  IMPORTANT  * * *
    C
    C                          IF B IS EQUAL TO PI, THEN B MUST BE
    C                          COMPUTED USING THE STATEMENT
    C                              B = PIMACH(DUM)
    C                          THIS INSURES THAT B IN THE USER'S PROGRAM
    C                          IS EQUAL TO PI IN THIS PROGRAM, PERMITTING
    C                          SEVERAL TESTS OF THE INPUT PARAMETERS THAT
    C                          OTHERWISE WOULD NOT BE POSSIBLE.
    C
    C                          * * * * * * * * * * * *
    C
    C                        M
    C                          THE NUMBER OF GRID POINTS IN THE INTERVAL
    C                          (A,B).  THE GRID POINTS IN THE THETA-
    C                          DIRECTION ARE GIVEN BY
    C                            THETA(I) = A + (I-0.5)DTHETA
    C                          FOR I=1,2,...,M WHERE DTHETA =(B-A)/M.
    C                          M MUST BE GREATER THAN 4.
    C
    C                        MBDCND
    C                          INDICATES THE TYPE OF BOUNDARY CONDITIONS
    C                          AT THETA = A AND THETA = B.
    C
    C                          = 1  IF THE SOLUTION IS SPECIFIED AT
    C                               THETA = A AND THETA = B.
    C                               (SEE NOTES 1, 2 BELOW)
    C
    C                          = 2  IF THE SOLUTION IS SPECIFIED AT
    C                               THETA = A AND THE DERIVATIVE OF THE
    C                               SOLUTION WITH RESPECT TO THETA IS
    C                               SPECIFIED AT THETA = B
    C                               (SEE NOTES 1, 2 BELOW).
    C
    C                          = 3  IF THE DERIVATIVE OF THE SOLUTION
    C                               WITH RESPECT TO THETA IS SPECIFIED
    C                               AT THETA = A (SEE NOTES 1, 2 BELOW)
    C                               AND THETA = B.
    C
    C                          = 4  IF THE DERIVATIVE OF THE SOLUTION
    C                               WITH RESPECT TO THETA IS SPECIFIED AT
    C                               THETA = A (SEE NOTES 1, 2 BELOW) AND
    C                               THE SOLUTION IS SPECIFIED AT THETA = B.
    C
    C                          = 5  IF THE SOLUTION IS UNSPECIFIED AT
    C                               THETA = A = 0 AND THE SOLUTION IS
    C                               SPECIFIED AT THETA = B.
    C                               (SEE NOTE 2 BELOW)
    C
    C                          = 6  IF THE SOLUTION IS UNSPECIFIED AT
    C                               THETA = A = 0 AND THE DERIVATIVE OF
    C                               THE SOLUTION WITH RESPECT TO THETA IS
    C                               SPECIFIED AT THETA = B
    C                               (SEE NOTE 2 BELOW).
    C
    C                          = 7  IF THE SOLUTION IS SPECIFIED AT
    C                               THETA = A AND THE SOLUTION IS
    C                               UNSPECIFIED AT THETA = B = PI.
    C
    C                          = 8  IF THE DERIVATIVE OF THE SOLUTION
    C                               WITH RESPECT TO THETA IS SPECIFIED AT
    C                               THETA = A (SEE NOTE 1 BELOW)
    C                               AND THE SOLUTION IS UNSPECIFIED AT
    C                               THETA = B = PI.
    C
    C                          = 9  IF THE SOLUTION IS UNSPECIFIED AT
    C                                THETA = A = 0 AND THETA = B = PI.
    C
    C                          NOTE 1:
    C                          IF A = 0, DO NOT USE MBDCND = 1,2,3,4,7
    C                          OR 8, BUT INSTEAD USE MBDCND = 5, 6, OR 9.
    C
    C                          NOTE 2:
    C                          IF B = PI, DO NOT USE MBDCND = 1,2,3,4,5,
    C                          OR 6, BUT INSTEAD USE MBDCND = 7, 8, OR 9.
    C
    C                          NOTE 3:
    C                          WHEN A = 0  AND/OR B = PI THE ONLY
    C                          MEANINGFUL BOUNDARY CONDITION IS
    C                          DU/DTHETA = 0.   SEE D. GREENSPAN,
    C                          'NUMERICAL ANALYSIS OF ELLIPTIC
    C                           BOUNDARY VALUE PROBLEMS,'
    C                          HARPER AND ROW, 1965, CHAPTER 5.)
    C
    C                        BDA
    C                          A ONE-DIMENSIONAL ARRAY OF LENGTH N THAT
    C                          SPECIFIES THE BOUNDARY VALUES (IF ANY) OF
    C                          THE SOLUTION AT THETA = A.
    C
    C                          WHEN  MBDCND = 1, 2, OR 7,
    C                            BDA(J) = U(A,R(J)),   J=1,2,...,N.
    C
    C                          WHEN MBDCND = 3, 4, OR 8,
    C                            BDA(J) = (D/DTHETA)U(A,R(J)), J=1,2,...,N.
    C
    C                          WHEN MBDCND HAS ANY OTHER VALUE, BDA IS A
    C                          DUMMY VARIABLE.
    C
    C                        BDB
    C                          A ONE-DIMENSIONAL ARRAY OF LENGTH N THAT
    C                          SPECIFIES THE BOUNDARY VALUES OF THE
    C                          SOLUTION AT THETA = B.
    C
    C                          WHEN MBDCND = 1, 4, OR 5,
    C                            BDB(J) = U(B,R(J)),     J=1,2,...,N.
    C
    C                          WHEN MBDCND = 2,3, OR 6,
    C                            BDB(J) = (D/DTHETA)U(B,R(J)), J=1,2,...,N.
    C
    C                          WHEN MBDCND HAS ANY OTHER VALUE, BDB IS
    C                          A DUMMY VARIABLE.
    C
    C                        C,D
    C                          THE RANGE OF R , I.E. C .LE. R .LE. D.
    C                          C MUST BE LESS THAN D AND NON-NEGATIVE.
    C
    C                        N
    C                          THE NUMBER OF UNKNOWNS IN THE INTERVAL
    C                          (C,D).  THE UNKNOWNS IN THE R-DIRECTION
    C                          ARE GIVEN BY R(J) = C + (J-0.5)DR,
    C                          J=1,2,...,N, WHERE DR = (D-C)/N.
    C                          N MUST BE GREATER THAN 4.
    C
    C                        NBDCND
    C                          INDICATES THE TYPE OF BOUNDARY CONDITIONS
    C                          AT R = C AND R = D.
    C
    C
    C                          = 1  IF THE SOLUTION IS SPECIFIED AT
    C                               R = C AND R = D.
    C
    C                          = 2  IF THE SOLUTION IS SPECIFIED AT
    C                               R = C AND THE DERIVATIVE OF THE
    C                               SOLUTION WITH RESPECT TO R IS
    C                               SPECIFIED AT R = D. (SEE NOTE 1 BELOW)
    C
    C                          = 3  IF THE DERIVATIVE OF THE SOLUTION
    C                               WITH RESPECT TO R IS SPECIFIED AT
    C                               R = C AND R = D.
    C
    C                          = 4  IF THE DERIVATIVE OF THE SOLUTION
    C                               WITH RESPECT TO R IS
    C                               SPECIFIED AT R = C AND THE SOLUTION
    C                               IS SPECIFIED AT R = D.
    C
    C                          = 5  IF THE SOLUTION IS UNSPECIFIED AT
    C                               R = C = 0 (SEE NOTE 2 BELOW) AND THE
    C                               SOLUTION IS SPECIFIED AT R = D.
    C
    C                          = 6  IF THE SOLUTION IS UNSPECIFIED AT
    C                               R = C = 0 (SEE NOTE 2 BELOW)
    C                               AND THE DERIVATIVE OF THE SOLUTION
    C                               WITH RESPECT TO R IS SPECIFIED AT
    C                               R = D.
    C
    C                          NOTE 1:
    C                          IF C = 0 AND MBDCND = 3,6,8 OR 9, THE
    C                          SYSTEM OF EQUATIONS TO BE SOLVED IS
    C                          SINGULAR.  THE UNIQUE SOLUTION IS
    C                          DETERMINED BY EXTRAPOLATION TO THE
    C                          SPECIFICATION OF U(THETA(1),C).
    C                          BUT IN THESE CASES THE RIGHT SIDE OF THE
    C                          SYSTEM WILL BE PERTURBED BY THE CONSTANT
    C                          PERTRB.
    C
    C                          NOTE 2:
    C                          NBDCND = 5 OR 6 CANNOT BE USED WITH
    C                          MBDCND =1, 2, 4, 5, OR 7
    C                          (THE FORMER INDICATES THAT THE SOLUTION IS
    C                          UNSPECIFIED AT R = 0; THE LATTER INDICATES
    C                          SOLUTION IS SPECIFIED).
    C                          USE INSTEAD NBDCND = 1 OR 2.
    C
    C                        BDC
    C                          A ONE DIMENSIONAL ARRAY OF LENGTH M THAT
    C                          SPECIFIES THE BOUNDARY VALUES OF THE
    C                          SOLUTION AT R = C.  WHEN NBDCND = 1 OR 2,
    C                            BDC(I) = U(THETA(I),C),    I=1,2,...,M.
    C
    C                          WHEN NBDCND = 3 OR 4,
    C                            BDC(I) = (D/DR)U(THETA(I),C), I=1,2,...,M.
    C
    C                          WHEN NBDCND HAS ANY OTHER VALUE, BDC IS
    C                          A DUMMY VARIABLE.
    C
    C                        BDD
    C                          A ONE-DIMENSIONAL ARRAY OF LENGTH M THAT
    C                          SPECIFIES THE BOUNDARY VALUES OF THE
    C                          SOLUTION AT R = D.  WHEN NBDCND = 1 OR 4,
    C                            BDD(I) = U(THETA(I),D) ,    I=1,2,...,M.
    C
    C                          WHEN NBDCND = 2 OR 3,
    C                            BDD(I) = (D/DR)U(THETA(I),D), I=1,2,...,M.
    C
    C                          WHEN NBDCND HAS ANY OTHER VALUE, BDD IS
    C                          A DUMMY VARIABLE.
    C
    C                        ELMBDA
    C                          THE CONSTANT LAMBDA IN THE MODIFIED
    C                          HELMHOLTZ EQUATION.  IF LAMBDA IS GREATER
    C                          THAN 0, A SOLUTION MAY NOT EXIST.
    C                          HOWEVER, HSTCSP WILL ATTEMPT TO FIND A
    C                          SOLUTION.
    C
    C                        F
    C                          A TWO-DIMENSIONAL ARRAY THAT SPECIFIES THE
    C                          VALUES OF THE RIGHT SIDE OF THE MODIFIED
    C                          HELMHOLTZ EQUATION.  FOR I=1,2,...,M AND
    C                          J=1,2,...,N
    C
    C                                F(I,J) = F(THETA(I),R(J)) .
    C
    C                          F MUST BE DIMENSIONED AT LEAST M X N.
    C
    C                        IDIMF
    C                          THE ROW (OR FIRST) DIMENSION OF THE ARRAY
    C                          F AS IT APPEARS IN THE PROGRAM CALLING
    C                          HSTCSP.  THIS PARAMETER IS USED TO SPECIFY
    C                          THE VARIABLE DIMENSION OF F.
    C                          IDIMF MUST BE AT LEAST M.
    C
    C                        W
    C                          A ONE-DIMENSIONAL ARRAY THAT MUST BE
    C                          PROVIDED BY THE USER FOR WORK SPACE.
    C                          WITH K = INT(LOG2(N))+1 AND L = 2**(K+1),
    C                          W MAY REQUIRE UP TO
    C                          (K-2)*L+K+MAX(2N,6M)+4(N+M)+5 LOCATIONS.
    C                          THE ACTUAL NUMBER OF LOCATIONS USED IS
    C                          COMPUTED BY HSTCSP AND IS RETURNED IN THE
    C                          LOCATION W(1).
    C
    C
    C ON OUTPUT              F
    C                          CONTAINS THE SOLUTION U(I,J) OF THE FINITE
    C                          DIFFERENCE APPROXIMATION FOR THE GRID POINT
    C                          (THETA(I),R(J)) FOR I=1,2,..,M, J=1,2,...,N.
    C
    C                        PERTRB
    C                          IF A COMBINATION OF PERIODIC, DERIVATIVE,
    C                          OR UNSPECIFIED BOUNDARY CONDITIONS IS
    C                          SPECIFIED FOR A POISSON EQUATION
    C                          (LAMBDA = 0), A SOLUTION MAY NOT EXIST.
    C                          PERTRB IS A CONSTANT, CALCULATED AND
    C                          SUBTRACTED FROM F, WHICH ENSURES THAT A
    C                          SOLUTION EXISTS.  HSTCSP THEN COMPUTES THIS
    C                          SOLUTION, WHICH IS A LEAST SQUARES SOLUTION
    C                          TO THE ORIGINAL APPROXIMATION.
    C                          THIS SOLUTION PLUS ANY CONSTANT IS ALSO
    C                          A SOLUTION; HENCE, THE SOLUTION IS NOT
    C                          UNIQUE.  THE VALUE OF PERTRB SHOULD BE
    C                          SMALL COMPARED TO THE RIGHT SIDE F.
    C                          OTHERWISE, A SOLUTION IS OBTAINED TO AN
    C                          ESSENTIALLY DIFFERENT PROBLEM.
    C                          THIS COMPARISON SHOULD ALWAYS BE MADE TO
    C                          INSURE THAT A MEANINGFUL SOLUTION HAS BEEN
    C                          OBTAINED.
    C
    C                        IERROR
    C                          AN ERROR FLAG THAT INDICATES INVALID INPUT
    C                          PARAMETERS. EXCEPT FOR NUMBERS 0 AND 10,
    C                          A SOLUTION IS NOT ATTEMPTED.
    C
    C                          =  0  NO ERROR
    C
    C                          =  1  A .LT. 0 OR B .GT. PI
    C
    C                          =  2  A .GE. B
    C
    C                          =  3  MBDCND .LT. 1 OR MBDCND .GT. 9
    C
    C                          =  4  C .LT. 0
    C
    C                          =  5  C .GE. D
    C
    C                          =  6  NBDCND .LT. 1 OR NBDCND .GT. 6
    C
    C                          =  7  N .LT. 5
    C
    C                          =  8  NBDCND = 5 OR 6 AND
    C                                MBDCND = 1, 2, 4, 5, OR 7
    C
    C                          =  9  C .GT. 0 AND NBDCND .GE. 5
    C
    C                          = 10  ELMBDA .GT. 0
    C
    C                          = 11  IDIMF .LT. M
    C
    C                          = 12  M .LT. 5
    C
    C                          = 13  A = 0 AND MBDCND =1,2,3,4,7 OR 8
    C
    C                          = 14  B = PI AND MBDCND .LE. 6
    C
    C                          = 15  A .GT. 0 AND MBDCND = 5, 6, OR 9
    C
    C                          = 16  B .LT. PI AND MBDCND .GE. 7
    C
    C                          = 17  LAMBDA .NE. 0 AND NBDCND .GE. 5
    C
    C                          SINCE THIS IS THE ONLY MEANS OF INDICATING
    C                          A POSSIBLY INCORRECT CALL TO HSTCSP,
    C                          THE USER SHOULD TEST IERROR AFTER THE CALL.
    C
    C                        W
    C                          W(1) CONTAINS THE REQUIRED LENGTH OF W.
    C                          ALSO  W CONTAINS INTERMEDIATE VALUES THAT
    C                          MUST NOT BE DESTROYED IF HSTCSP WILL BE
    C                          CALLED AGAIN WITH INTL = 1.
    C
    C I/O                    NONE
    C
    C PRECISION              SINGLE
    C
    C REQUIRED LIBRARY       BLKTRI AND COMF FROM FISHPAK
    C FILES
    C
    C LANGUAGE               FORTRAN
    C
    C HISTORY                WRITTEN BY ROLAND SWEET AT NCAR IN 1977.
    C                        RELEASED ON NCAR'S PUBLIC SOFTWARE LIBRARIES
    C                        IN JANUARY 1980.
    C
    C PORTABILITY            FORTRAN 77
    C
    C ALGORITHM              THIS SUBROUTINE DEFINES THE FINITE-DIFFERENCE
    C                        EQUATIONS, INCORPORATES BOUNDARY DATA, ADJUSTS
    C                        THE RIGHT SIDE WHEN THE SYSTEM IS SINGULAR
    C                        AND CALLS BLKTRI WHICH SOLVES THE LINEAR
    C                        SYSTEM OF EQUATIONS.
    C
    C
    C TIMING                 FOR LARGE M AND N, THE OPERATION COUNT IS
    C                        ROUGHLY PROPORTIONAL TO M*N*LOG2(N).  THE
    C                        TIMING ALSO DEPENDS ON INPUT PARAMETER INTL.
    C
    C ACCURACY               THE SOLUTION PROCESS EMPLOYED RESULTS IN
    C                        A LOSS OF NO MORE THAN FOUR SIGNIFICANT
    C                        DIGITS FOR N AND M AS LARGE AS 64.
    C                        MORE DETAILED INFORMATION ABOUT ACCURACY
    C                        CAN BE FOUND IN THE DOCUMENTATION FOR
    C                        SUBROUTINE BLKTRI WHICH IS THE ROUTINE
    C                        SOLVES THE FINITE DIFFERENCE EQUATIONS.
    C
    C REFERENCES             P.N. SWARZTRAUBER, "A DIRECT METHOD FOR
    C                        THE DISCRETE SOLUTION OF SEPARABLE ELLIPTIC
    C                        EQUATIONS",
    C                        SIAM J. NUMER. ANAL. 11(1974), PP. 1136-1150.
    C
    C                        U. SCHUMANN AND R. SWEET, "A DIRECT METHOD FOR
    C                        THE SOLUTION OF POISSON'S EQUATION WITH NEUMANN
    C                        BOUNDARY CONDITIONS ON A STAGGERED GRID OF
    C                        ARBITRARY SIZE," J. COMP. PHYS. 20(1976),
    C                        PP. 171-182.
    C***********************************************************************

HSTCYL

          SUBROUTINE HSTCYL (A,B,M,MBDCND,BDA,BDB,C,D,N,NBDCND,BDC,BDD,
         1                   ELMBDA,F,IDIMF,PERTRB,IERROR,W)
    C
    C     * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
    C     *                                                               *
    C     *                  copyright (c) 1999 by UCAR                   *
    C     *                                                               *
    C     *       UNIVERSITY CORPORATION for ATMOSPHERIC RESEARCH         *
    C     *                                                               *
    C     *                      all rights reserved                      *
    C     *                                                               *
    C     *                      FISHPACK version 4.1                     *
    C     *                                                               *
    C     *     A PACKAGE OF FORTRAN SUBPROGRAMS FOR THE SOLUTION OF      *
    C     *                                                               *
    C     *      SEPARABLE ELLIPTIC PARTIAL DIFFERENTIAL EQUATIONS        *
    C     *                                                               *
    C     *                             BY                                *
    C     *                                                               *
    C     *        JOHN ADAMS, PAUL SWARZTRAUBER AND ROLAND SWEET         *
    C     *                                                               *
    C     *                             OF                                *
    C     *                                                               *
    C     *         THE NATIONAL CENTER FOR ATMOSPHERIC RESEARCH          *
    C     *                                                               *
    C     *                BOULDER, COLORADO  (80307)  U.S.A.             *
    C     *                                                               *
    C     *                   WHICH IS SPONSORED BY                       *
    C     *                                                               *
    C     *              THE NATIONAL SCIENCE FOUNDATION                  *
    C     *                                                               *
    C     * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
    C
    C
    C
    C DIMENSION OF           BDA(N),BDB(N),BDC(M),BDD(M),F(IDIMF,N),
    C ARGUMENTS              W(SEE ARGUMENT LIST)
    C
    C LATEST REVISION        NOVEMBER 1988
    C
    C PURPOSE                SOLVES THE STANDARD FIVE-POINT FINITE
    C                        DIFFERENCE APPROXIMATION ON A STAGGERED
    C                        GRID TO THE MODIFIED HELMHOLTZ EQUATION
    C                        IN CYLINDRICAL COORDINATES. THIS EQUATION
    C
    C                          (1/R)(D/DR)(R(DU/DR)) + (D/DZ)(DU/DZ)
    C
    C                          + LAMBDA*(1/R**2)*U = F(R,Z)
    C
    C                        IS A TWO-DIMENSIONAL MODIFIED HELMHOLTZ
    C                        EQUATION RESULTING FROM THE FOURIER TRANSFORM
    C                        OF A THREE-DIMENSIONAL POISSON EQUATION.
    C
    C USAGE                  CALL HSTCYL (A,B,M,MBDCND,BDA,BDB,C,D,N,
    C                                     NBDCND,BDC,BDD,ELMBDA,F,IDIMF,
    C                                     PERTRB,IERROR,W)
    C
    C ARGUMENTS
    C ON INPUT               A,B
    C
    C                          THE RANGE OF R, I.E. A .LE. R .LE. B.
    C                          A MUST BE LESS THAN B AND A MUST BE
    C                          BE NON-NEGATIVE.
    C
    C                        M
    C                          THE NUMBER OF GRID POINTS IN THE INTERVAL
    C                          (A,B).  THE GRID POINTS IN THE R-DIRECTION
    C                          R-DIRECTION ARE GIVEN BY
    C                          R(I) = A + (I-0.5)DR FOR I=1,2,...,M
    C                          WHERE DR =(B-A)/M.
    C                          M MUST BE GREATER THAN 2.
    C
    C                        MBDCND
    C                          INDICATES THE TYPE OF BOUNDARY CONDITIONS
    C                          AT R = A AND R = B.
    C
    C                          = 1  IF THE SOLUTION IS SPECIFIED AT R = A
    C                               (SEE NOTE BELOW) AND R = B.
    C
    C                          = 2  IF THE SOLUTION IS SPECIFIED AT R = A
    C                               (SEE NOTE BELOW) AND THE DERIVATIVE
    C                               OF THE SOLUTION WITH RESPECT TO R IS
    C                               SPECIFIED AT R = B.
    C
    C                          = 3  IF THE DERIVATIVE OF THE SOLUTION
    C                               WITH RESPECT TO R IS SPECIFIED AT
    C                               R = A (SEE NOTE BELOW) AND R = B.
    C
    C                          = 4  IF THE DERIVATIVE OF THE SOLUTION
    C                               WITH RESPECT TO R IS SPECIFIED AT
    C                               R = A (SEE NOTE BELOW) AND THE
    C                               SOLUTION IS SPECIFIED AT R = B.
    C
    C                          = 5  IF THE SOLUTION IS UNSPECIFIED AT
    C                               R = A = 0 AND THE SOLUTION IS
    C                               SPECIFIED AT R = B.
    C
    C                          = 6  IF THE SOLUTION IS UNSPECIFIED AT
    C                               R = A = 0 AND THE DERIVATIVE OF THE
    C                               SOLUTION WITH RESPECT TO R IS SPECIFIED
    C                               AT R = B.
    C
    C                          NOTE:
    C                          IF A = 0, DO NOT USE MBDCND = 1,2,3, OR 4,
    C                          BUT INSTEAD USE MBDCND = 5 OR 6.
    C                          THE RESULTING APPROXIMATION GIVES THE ONLY
    C                          MEANINGFUL BOUNDARY CONDITION,
    C                          I.E. DU/DR = 0.
    C                          (SEE D. GREENSPAN, 'INTRODUCTORY NUMERICAL
    C                          ANALYSIS OF ELLIPTIC BOUNDARY VALUE
    C                          PROBLEMS,' HARPER AND ROW, 1965, CHAPTER 5.)
    C
    C                        BDA
    C                          A ONE-DIMENSIONAL ARRAY OF LENGTH N THAT
    C                          SPECIFIES THE BOUNDARY VALUES (IF ANY)
    C                          OF THE SOLUTION AT R = A.
    C
    C                          WHEN MBDCND = 1 OR 2,
    C                            BDA(J) = U(A,Z(J)) ,       J=1,2,...,N.
    C
    C                          WHEN MBDCND = 3 OR 4,
    C                            BDA(J) = (D/DR)U(A,Z(J)) ,   J=1,2,...,N.
    C
    C                          WHEN MBDCND = 5 OR 6, BDA IS A DUMMY
    C                          VARIABLE.
    C
    C                        BDB
    C                          A ONE-DIMENSIONAL ARRAY OF LENGTH N THAT
    C                          SPECIFIES THE BOUNDARY VALUES OF THE
    C                          SOLUTION AT R = B.
    C
    C                          WHEN MBDCND = 1,4,OR 5,
    C                            BDB(J) = U(B,Z(J)) ,        J=1,2,...,N.
    C
    C                          WHEN MBDCND = 2,3, OR 6,
    C                            BDB(J) = (D/DR)U(B,Z(J)) ,   J=1,2,...,N.
    C
    C                        C,D
    C                          THE RANGE OF Z, I.E. C .LE. Z .LE. D.
    C                          C MUST BE LESS THAN D.
    C
    C                        N
    C                          THE NUMBER OF UNKNOWNS IN THE INTERVAL
    C                          (C,D).  THE UNKNOWNS IN THE Z-DIRECTION
    C                          ARE GIVEN BY Z(J) = C + (J-0.5)DZ,
    C                          J=1,2,...,N, WHERE DZ = (D-C)/N.
    C                          N MUST BE GREATER THAN 2.
    C
    C                        NBDCND
    C                          INDICATES THE TYPE OF BOUNDARY CONDITIONS
    C                          AT Z = C  AND Z = D.
    C
    C                          = 0  IF THE SOLUTION IS PERIODIC IN Z, I.E.
    C                               U(I,J) = U(I,N+J).
    C
    C                          = 1  IF THE SOLUTION IS SPECIFIED AT Z = C
    C                               AND Z = D.
    C
    C                          = 2  IF THE SOLUTION IS SPECIFIED AT Z = C
    C                               AND THE DERIVATIVE OF THE SOLUTION WITH
    C                               RESPECT TO Z IS SPECIFIED AT Z = D.
    C
    C                          = 3  IF THE DERIVATIVE OF THE SOLUTION WITH
    C                               RESPECT TO Z IS SPECIFIED AT Z = C
    C                               AND Z = D.
    C
    C                          = 4  IF THE DERIVATIVE OF THE SOLUTION WITH
    C                               RESPECT TO Z IS SPECIFIED AT Z = C AND
    C                               THE SOLUTION IS SPECIFIED AT Z = D.
    C
    C                        BDC
    C                          A ONE DIMENSIONAL ARRAY OF LENGTH M THAT
    C                          SPECIFIES THE BOUNDARY VALUES OF THE
    C                          SOLUTION AT Z = C.
    C
    C                          WHEN NBDCND = 1 OR 2,
    C                            BDC(I) = U(R(I),C) ,        I=1,2,...,M.
    C
    C                          WHEN NBDCND = 3 OR 4,
    C                            BDC(I) = (D/DZ)U(R(I),C),    I=1,2,...,M.
    C
    C                          WHEN NBDCND = 0, BDC IS A DUMMY VARIABLE.
    C
    C                        BDD
    C                          A ONE-DIMENSIONAL ARRAY OF LENGTH M THAT
    C                          SPECIFIES THE BOUNDARY VALUES OF THE
    C                          SOLUTION AT Z = D.
    C
    C                          WHEN NBDCND = 1 OR 4,
    C                            BDD(I) = U(R(I),D) ,       I=1,2,...,M.
    C
    C                          WHEN NBDCND = 2 OR 3,
    C                            BDD(I) = (D/DZ)U(R(I),D) ,   I=1,2,...,M.
    C
    C                          WHEN NBDCND = 0, BDD IS A DUMMY VARIABLE.
    C
    C                        ELMBDA
    C                          THE CONSTANT LAMBDA IN THE MODIFIED
    C                          HELMHOLTZ EQUATION.  IF LAMBDA IS GREATER
    C                          THAN 0, A SOLUTION MAY NOT EXIST.
    C                          HOWEVER, HSTCYL WILL ATTEMPT TO FIND A
    C                          SOLUTION.  LAMBDA MUST BE ZERO WHEN
    C                          MBDCND = 5 OR 6.
    C
    C                        F
    C                          A TWO-DIMENSIONAL ARRAY THAT SPECIFIES
    C                          THE VALUES OF THE RIGHT SIDE OF THE
    C                          MODIFIED HELMHOLTZ EQUATION.
    C                          FOR I=1,2,...,M   AND J=1,2,...,N
    C                            F(I,J) = F(R(I),Z(J)) .
    C                          F MUST BE DIMENSIONED AT LEAST M X N.
    C
    C                        IDIMF
    C                          THE ROW (OR FIRST) DIMENSION OF THE ARRAY
    C                          F AS IT APPEARS IN THE PROGRAM CALLING
    C                          HSTCYL.  THIS PARAMETER IS USED TO SPECIFY
    C                          THE VARIABLE DIMENSION OF F.  IDIMF MUST
    C                          BE AT LEAST M.
    C
    C                        W
    C                          A ONE-DIMENSIONAL ARRAY THAT MUST BE
    C                          PROVIDED BY THE USER FOR WORK SPACE. W MAY
    C                          REQUIRE UP TO 13M + 4N + M*INT(LOG2(N))
    C                          LOCATIONS.  THE ACTUAL NUMBER OF LOCATIONS
    C                          USED IS COMPUTED BY HSTCYL AND IS RETURNED
    C                          IN THE LOCATION W(1).
    C
    C ON OUTPUT
    C
    C                        F
    C                          CONTAINS THE SOLUTION U(I,J) OF THE FINITE
    C                          DIFFERENCE APPROXIMATION FOR THE GRID POINT
    C                          (R(I),Z(J)) FOR  I=1,2,...,M, J=1,2,...,N.
    C
    C                        PERTRB
    C                          IF A COMBINATION OF PERIODIC, DERIVATIVE,
    C                          OR UNSPECIFIED BOUNDARY CONDITIONS IS
    C                          SPECIFIED FOR A POISSON EQUATION
    C                          (LAMBDA = 0), A SOLUTION MAY NOT EXIST.
    C                          PERTRB IS A CONSTANT, CALCULATED AND
    C                          SUBTRACTED FROM F, WHICH ENSURES THAT A
    C                          SOLUTION EXISTS.  HSTCYL THEN COMPUTES
    C                          THIS SOLUTION, WHICH IS A LEAST SQUARES
    C                          SOLUTION TO THE ORIGINAL APPROXIMATION.
    C                          THIS SOLUTION PLUS ANY CONSTANT IS ALSO
    C                          A SOLUTION; HENCE, THE SOLUTION IS NOT
    C                          UNIQUE.  THE VALUE OF PERTRB SHOULD BE
    C                          SMALL COMPARED TO THE RIGHT SIDE F.
    C                          OTHERWISE, A SOLUTION IS OBTAINED TO AN
    C                          ESSENTIALLY DIFFERENT PROBLEM.
    C                          THIS COMPARISON SHOULD ALWAYS BE MADE TO
    C                          INSURE THAT A MEANINGFUL SOLUTION HAS BEEN
    C                          OBTAINED.
    C
    C                        IERROR
    C                          AN ERROR FLAG THAT INDICATES INVALID INPUT
    C                          PARAMETERS. EXCEPT TO NUMBERS 0 AND 11,
    C                          A SOLUTION IS NOT ATTEMPTED.
    C
    C                          =  0  NO ERROR
    C
    C                          =  1  A .LT. 0
    C
    C                          =  2  A .GE. B
    C
    C                          =  3  MBDCND .LT. 1 OR MBDCND .GT. 6
    C
    C                          =  4  C .GE. D
    C
    C                          =  5  N .LE. 2
    C
    C                          =  6  NBDCND .LT. 0 OR NBDCND .GT. 4
    C
    C                          =  7  A = 0 AND MBDCND = 1,2,3, OR 4
    C
    C                          =  8  A .GT. 0 AND MBDCND .GE. 5
    C
    C                          =  9  M .LE. 2
    C
    C                          = 10  IDIMF .LT. M
    C
    C                          = 11  LAMBDA .GT. 0
    C
    C                          = 12  A=0, MBDCND .GE. 5, ELMBDA .NE. 0
    C
    C                          SINCE THIS IS THE ONLY MEANS OF INDICATING
    C                          A POSSIBLY INCORRECT CALL TO HSTCYL, THE
    C                          USER SHOULD TEST IERROR AFTER THE CALL.
    C
    C                        W
    C                          W(1) CONTAINS THE REQUIRED LENGTH OF W.
    C
    C I/O                    NONE
    C
    C PRECISION              SINGLE
    C
    C REQUIRED LIBRARY       COMF, GENBUN, GNBNAUX, AND POISTG
    C FILES                  FROM FISHPAK
    C
    C LANGUAGE               FORTRAN
    C
    C HISTORY                WRITTEN BY ROLAND SWEET AT NCAR IN 1977.
    C                        RELEASED ON NCAR'S PUBLIC SOFTWARE LIBRARIES
    C                        IN JANUARY 1980.
    C
    C PORTABILITY            FORTRAN 77
    C
    C ALGORITHM              THIS SUBROUTINE DEFINES THE FINITE-DIFFERENCE
    C                        EQUATIONS, INCORPORATES BOUNDARY DATA, ADJUSTS
    C                        THE RIGHT SIDE WHEN THE SYSTEM IS SINGULAR AND
    C                        CALLS EITHER POISTG OR GENBUN WHICH SOLVES THE
    C                        LINEAR SYSTEM OF EQUATIONS.
    C
    C TIMING                 FOR LARGE M AND N, THE OPERATION COUNT
    C                        IS ROUGHLY PROPORTIONAL TO M*N*LOG2(N).
    C
    C ACCURACY               THE SOLUTION PROCESS RESULTS IN A LOSS
    C                        OF NO MORE THAN FOUR SIGNIFICANT DIGITS
    C                        FOR N AND M AS LARGE AS 64.
    C                        MORE DETAILED INFORMATION ABOUT ACCURACY
    C                        CAN BE FOUND IN THE DOCUMENTATION FOR
    C                        SUBROUTINE POISTG WHICH IS THE ROUTINE THAT
    C                        ACTUALLY SOLVES THE FINITE DIFFERENCE
    C                        EQUATIONS.
    C
    C REFERENCES             U. SCHUMANN AND R. SWEET, "A DIRECT METHOD FOR
    C                        THE SOLUTION OF POISSON'S EQUATION WITH NEUMANN
    C                        BOUNDARY CONDITIONS ON A STAGGERED GRID OF
    C                        ARBITRARY SIZE," J. COMP. PHYS. 20(1976),
    C                        PP. 171-182.
    C***********************************************************************

HSTPLR

          SUBROUTINE HSTPLR (A,B,M,MBDCND,BDA,BDB,C,D,N,NBDCND,BDC,BDD,
         1                   ELMBDA,F,IDIMF,PERTRB,IERROR,W)
    C
    C     * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
    C     *                                                               *
    C     *                  copyright (c) 1999 by UCAR                   *
    C     *                                                               *
    C     *       UNIVERSITY CORPORATION for ATMOSPHERIC RESEARCH         *
    C     *                                                               *
    C     *                      all rights reserved                      *
    C     *                                                               *
    C     *                      FISHPACK version 4.1                     *
    C     *                                                               *
    C     *     A PACKAGE OF FORTRAN SUBPROGRAMS FOR THE SOLUTION OF      *
    C     *                                                               *
    C     *      SEPARABLE ELLIPTIC PARTIAL DIFFERENTIAL EQUATIONS        *
    C     *                                                               *
    C     *                             BY                                *
    C     *                                                               *
    C     *        JOHN ADAMS, PAUL SWARZTRAUBER AND ROLAND SWEET         *
    C     *                                                               *
    C     *                             OF                                *
    C     *                                                               *
    C     *         THE NATIONAL CENTER FOR ATMOSPHERIC RESEARCH          *
    C     *                                                               *
    C     *                BOULDER, COLORADO  (80307)  U.S.A.             *
    C     *                                                               *
    C     *                   WHICH IS SPONSORED BY                       *
    C     *                                                               *
    C     *              THE NATIONAL SCIENCE FOUNDATION                  *
    C     *                                                               *
    C     * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
    C
    C
    C
    C DIMENSION OF           BDA(N),BDB(N),BDC(M),BDD(M),F(IDIMF,N),
    C ARGUMENTS              W(SEE ARGUMENT LIST)
    C
    C LATEST REVISION        NOVEMBER 1988
    C
    C PURPOSE                SOLVES THE STANDARD FIVE-POINT FINITE
    C                        DIFFERENCE APPROXIMATION ON A STAGGERED
    C                        GRID TO THE HELMHOLTZ EQUATION IN POLAR
    C                        COORDINATES.  THE EQUATION IS
    C
    C                           (1/R)(D/DR)(R(DU/DR)) +
    C                           (1/R**2)(D/DTHETA)(DU/DTHETA) +
    C                           LAMBDA*U = F(R,THETA)
    C
    C USAGE                  CALL HSTPLR (A,B,M,MBDCND,BDA,BDB,C,D,N,
    C                                     NBDCND,BDC,BDD,ELMBDA,F,
    C                                     IDIMF,PERTRB,IERROR,W)
    C
    C ARGUMENTS
    C ON INPUT               A,B
    C
    C                          THE RANGE OF R, I.E. A .LE. R .LE. B.
    C                          A MUST BE LESS THAN B AND A MUST BE
    C                          NON-NEGATIVE.
    C
    C                        M
    C                          THE NUMBER OF GRID POINTS IN THE INTERVAL
    C                          (A,B).  THE GRID POINTS IN THE R-DIRECTION
    C                          ARE GIVEN BY R(I) = A + (I-0.5)DR FOR
    C                          I=1,2,...,M WHERE DR =(B-A)/M.
    C                          M MUST BE GREATER THAN 2.
    C
    C                        MBDCND
    C                          INDICATES THE TYPE OF BOUNDARY CONDITIONS
    C                          AT R = A AND R = B.
    C
    C                          = 1  IF THE SOLUTION IS SPECIFIED AT R = A
    C                               AND R = B.
    C
    C                          = 2  IF THE SOLUTION IS SPECIFIED AT R = A
    C                               AND THE DERIVATIVE OF THE SOLUTION
    C                               WITH RESPECT TO R IS SPECIFIED AT R = B.
    C                               (SEE NOTE 1 BELOW)
    C
    C                          = 3  IF THE DERIVATIVE OF THE SOLUTION
    C                               WITH RESPECT TO R IS SPECIFIED AT
    C                               R = A (SEE NOTE 2 BELOW) AND R = B.
    C
    C                          = 4  IF THE DERIVATIVE OF THE SOLUTION
    C                               WITH RESPECT TO R IS SPECIFIED AT
    C                               SPECIFIED AT R = A (SEE NOTE 2 BELOW)
    C                               AND THE SOLUTION IS SPECIFIED AT R = B.
    C
    C
    C                          = 5  IF THE SOLUTION IS UNSPECIFIED AT
    C                               R = A = 0 AND THE SOLUTION IS
    C                               SPECIFIED AT R = B.
    C
    C                          = 6  IF THE SOLUTION IS UNSPECIFIED AT
    C                               R = A = 0 AND THE DERIVATIVE OF THE
    C                               SOLUTION WITH RESPECT TO R IS SPECIFIED
    C                               AT R = B.
    C
    C                          NOTE 1:
    C                          IF A = 0, MBDCND = 2, AND NBDCND = 0 OR 3,
    C                          THE SYSTEM OF EQUATIONS TO BE SOLVED IS
    C                          SINGULAR.  THE UNIQUE SOLUTION IS
    C                          IS DETERMINED BY EXTRAPOLATION TO THE
    C                          SPECIFICATION OF U(0,THETA(1)).
    C                          BUT IN THIS CASE THE RIGHT SIDE OF THE
    C                          SYSTEM WILL BE PERTURBED BY THE CONSTANT
    C                          PERTRB.
    C
    C                          NOTE 2:
    C                          IF A = 0, DO NOT USE MBDCND = 3 OR 4,
    C                          BUT INSTEAD USE MBDCND = 1,2,5, OR 6.
    C
    C                        BDA
    C                          A ONE-DIMENSIONAL ARRAY OF LENGTH N THAT
    C                          SPECIFIES THE BOUNDARY VALUES (IF ANY) OF
    C                          THE SOLUTION AT R = A.
    C
    C                          WHEN MBDCND = 1 OR 2,
    C                            BDA(J) = U(A,THETA(J)) ,     J=1,2,...,N.
    C
    C                          WHEN MBDCND = 3 OR 4,
    C                            BDA(J) = (D/DR)U(A,THETA(J)) ,
    C                            J=1,2,...,N.
    C
    C                          WHEN MBDCND = 5 OR 6, BDA IS A DUMMY
    C                          VARIABLE.
    C
    C                        BDB
    C                          A ONE-DIMENSIONAL ARRAY OF LENGTH N THAT
    C                          SPECIFIES THE BOUNDARY VALUES OF THE
    C                          SOLUTION AT R = B.
    C
    C                          WHEN MBDCND = 1,4, OR 5,
    C                            BDB(J) = U(B,THETA(J)) ,     J=1,2,...,N.
    C
    C                          WHEN MBDCND = 2,3, OR 6,
    C                            BDB(J) = (D/DR)U(B,THETA(J)) ,
    C                            J=1,2,...,N.
    C
    C                        C,D
    C                          THE RANGE OF THETA, I.E. C .LE. THETA .LE. D.
    C                          C MUST BE LESS THAN D.
    C
    C                        N
    C                          THE NUMBER OF UNKNOWNS IN THE INTERVAL
    C                          (C,D).  THE UNKNOWNS IN THE THETA-
    C                          DIRECTION ARE GIVEN BY THETA(J) = C +
    C                          (J-0.5)DT,   J=1,2,...,N, WHERE
    C                          DT = (D-C)/N.  N MUST BE GREATER THAN 2.
    C
    C                        NBDCND
    C                          INDICATES THE TYPE OF BOUNDARY CONDITIONS
    C                          AT THETA = C  AND THETA = D.
    C
    C                          = 0  IF THE SOLUTION IS PERIODIC IN THETA,
    C                               I.E. U(I,J) = U(I,N+J).
    C
    C                          = 1  IF THE SOLUTION IS SPECIFIED AT
    C                               THETA = C AND THETA = D
    C                               (SEE NOTE BELOW).
    C
    C                          = 2  IF THE SOLUTION IS SPECIFIED AT
    C                               THETA = C AND THE DERIVATIVE OF THE
    C                               SOLUTION WITH RESPECT TO THETA IS
    C                               SPECIFIED AT THETA = D
    C                               (SEE NOTE BELOW).
    C
    C                          = 3  IF THE DERIVATIVE OF THE SOLUTION
    C                               WITH RESPECT TO THETA IS SPECIFIED
    C                               AT THETA = C AND THETA = D.
    C
    C                          = 4  IF THE DERIVATIVE OF THE SOLUTION
    C                               WITH RESPECT TO THETA IS SPECIFIED
    C                               AT THETA = C AND THE SOLUTION IS
    C                               SPECIFIED AT THETA = D
    C                               (SEE NOTE BELOW).
    C
    C                          NOTE:
    C                          WHEN NBDCND = 1, 2, OR 4, DO NOT USE
    C                          MBDCND = 5 OR 6 (THE FORMER INDICATES THAT
    C                          THE SOLUTION IS SPECIFIED AT R =  0; THE
    C                          LATTER INDICATES THE SOLUTION IS UNSPECIFIED
    C                          AT R = 0).  USE INSTEAD MBDCND = 1 OR 2.
    C
    C                        BDC
    C                          A ONE DIMENSIONAL ARRAY OF LENGTH M THAT
    C                          SPECIFIES THE BOUNDARY VALUES OF THE
    C                          SOLUTION AT THETA = C.
    C
    C                          WHEN NBDCND = 1 OR 2,
    C                            BDC(I) = U(R(I),C) ,        I=1,2,...,M.
    C
    C                          WHEN NBDCND = 3 OR 4,
    C                            BDC(I) = (D/DTHETA)U(R(I),C),
    C                            I=1,2,...,M.
    C
    C                          WHEN NBDCND = 0, BDC IS A DUMMY VARIABLE.
    C
    C                        BDD
    C                          A ONE-DIMENSIONAL ARRAY OF LENGTH M THAT
    C                          SPECIFIES THE BOUNDARY VALUES OF THE
    C                          SOLUTION AT THETA = D.
    C
    C                          WHEN NBDCND = 1 OR 4,
    C                            BDD(I) = U(R(I),D) ,         I=1,2,...,M.
    C
    C                          WHEN NBDCND = 2 OR 3,
    C                            BDD(I) =(D/DTHETA)U(R(I),D), I=1,2,...,M.
    C
    C                          WHEN NBDCND = 0, BDD IS A DUMMY VARIABLE.
    C
    C                        ELMBDA
    C                          THE CONSTANT LAMBDA IN THE HELMHOLTZ
    C                          EQUATION.  IF LAMBDA IS GREATER THAN 0,
    C                          A SOLUTION MAY NOT EXIST.  HOWEVER, HSTPLR
    C                          WILL ATTEMPT TO FIND A SOLUTION.
    C
    C                        F
    C                          A TWO-DIMENSIONAL ARRAY THAT SPECIFIES THE
    C                          VALUES OF THE RIGHT SIDE OF THE HELMHOLTZ
    C                          EQUATION.
    C
    C                          FOR I=1,2,...,M AND J=1,2,...,N
    C                            F(I,J) = F(R(I),THETA(J)) .
    C
    C                          F MUST BE DIMENSIONED AT LEAST M X N.
    C
    C                        IDIMF
    C                          THE ROW (OR FIRST) DIMENSION OF THE ARRAY
    C                          F AS IT APPEARS IN THE PROGRAM CALLING
    C                          HSTPLR.  THIS PARAMETER IS USED TO SPECIFY
    C                          THE VARIABLE DIMENSION OF F.
    C                          IDIMF MUST BE AT LEAST M.
    C
    C                        W
    C                          A ONE-DIMENSIONAL ARRAY THAT MUST BE
    C                          PROVIDED BY THE USER FOR WORK SPACE.
    C                          W MAY REQUIRE UP TO 13M + 4N +
    C                          M*INT(LOG2(N)) LOCATIONS.
    C                          THE ACTUAL NUMBER OF LOCATIONS USED IS
    C                          COMPUTED BY HSTPLR AND IS RETURNED IN
    C                          THE LOCATION W(1).
    C
    C
    C ON OUTPUT
    C
    C                        F
    C                          CONTAINS THE SOLUTION U(I,J) OF THE FINITE
    C                          DIFFERENCE APPROXIMATION FOR THE GRID POINT
    C                          (R(I),THETA(J)) FOR I=1,2,...,M,
    C                          J=1,2,...,N.
    C
    C                        PERTRB
    C                          IF A COMBINATION OF PERIODIC, DERIVATIVE,
    C                          OR UNSPECIFIED BOUNDARY CONDITIONS IS
    C                          SPECIFIED FOR A POISSON EQUATION
    C                          (LAMBDA = 0), A SOLUTION MAY NOT EXIST.
    C                          PERTRB IS A CONSTANT CALCULATED AND
    C                          SUBTRACTED FROM F, WHICH ENSURES THAT A
    C                          SOLUTION EXISTS.  HSTPLR THEN COMPUTES THIS
    C                          SOLUTION, WHICH IS A LEAST SQUARES SOLUTION
    C                          TO THE ORIGINAL APPROXIMATION.
    C                          THIS SOLUTION PLUS ANY CONSTANT IS ALSO
    C                          A SOLUTION; HENCE, THE SOLUTION IS NOT
    C                          UNIQUE.  THE VALUE OF PERTRB SHOULD BE
    C                          SMALL COMPARED TO THE RIGHT SIDE F.
    C                          OTHERWISE, A SOLUTION IS OBTAINED TO AN
    C                          ESSENTIALLY DIFFERENT PROBLEM.
    C                          THIS COMPARISON SHOULD ALWAYS BE MADE TO
    C                          INSURE THAT A MEANINGFUL SOLUTION HAS BEEN
    C                          OBTAINED.
    C
    C                        IERROR
    C                          AN ERROR FLAG THAT INDICATES INVALID INPUT
    C                          PARAMETERS. EXCEPT TO NUMBERS 0 AND 11,
    C                          A SOLUTION IS NOT ATTEMPTED.
    C
    C                          =  0  NO ERROR
    C
    C                          =  1  A .LT. 0
    C
    C                          =  2  A .GE. B
    C
    C                          =  3  MBDCND .LT. 1 OR MBDCND .GT. 6
    C
    C                          =  4  C .GE. D
    C
    C                          =  5  N .LE. 2
    C
    C                          =  6  NBDCND .LT. 0 OR NBDCND .GT. 4
    C
    C                          =  7  A = 0 AND MBDCND = 3 OR 4
    C
    C                          =  8  A .GT. 0 AND MBDCND .GE. 5
    C
    C                          =  9  MBDCND .GE. 5 AND NBDCND .NE. 0 OR 3
    C
    C                          = 10  IDIMF .LT. M
    C
    C                          = 11  LAMBDA .GT. 0
    C
    C                          = 12  M .LE. 2
    C
    C                          SINCE THIS IS THE ONLY MEANS OF INDICATING
    C                          A POSSIBLY INCORRECT CALL TO HSTPLR, THE
    C                          USER SHOULD TEST IERROR AFTER THE CALL.
    C
    C                        W
    C                          W(1) CONTAINS THE REQUIRED LENGTH OF W.
    C
    C I/O                    NONE
    C
    C PRECISION              SINGLE
    C
    C REQUIRED LIBRARY       COMF, GENBUN, GNBNAUX, AND POISTG
    C FILES                  FROM FISHPAK
    C
    C LANGUAGE               FORTRAN
    C
    C HISTORY                WRITTEN BY ROLAND SWEET AT NCAR IN 1977.
    C                        RELEASED ON NCAR'S PUBLIC SOFTWARE LIBRARIES
    C                        IN JANUARY 1980.
    C
    C PORTABILITY            FORTRAN 77.
    C
    C ALGORITHM              THIS SUBROUTINE DEFINES THE FINITE-
    C                        DIFFERENCE EQUATIONS, INCORPORATES BOUNDARY
    C                        DATA, ADJUSTS THE RIGHT SIDE WHEN THE SYSTEM
    C                        IS SINGULAR AND CALLS EITHER POISTG OR GENBUN
    C                        WHICH SOLVES THE LINEAR SYSTEM OF EQUATIONS.
    C
    C TIMING                 FOR LARGE M AND N, THE OPERATION COUNT
    C                        IS ROUGHLY PROPORTIONAL TO M*N*LOG2(N).
    C
    C ACCURACY               THE SOLUTION PROCESS EMPLOYED RESULTS IN
    C                        A LOSS OF NO MORE THAN FOUR SIGNIFICANT
    C                        DIGITS FOR N AND M AS LARGE AS 64.
    C                        MORE DETAILED INFORMATION ABOUT ACCURACY
    C                        CAN BE FOUND IN THE DOCUMENTATION FOR
    C                        ROUTINE POISTG WHICH IS THE ROUTINE THAT
    C                        ACTUALLY SOLVES THE FINITE DIFFERENCE
    C                        EQUATIONS.
    C
    C REFERENCES             U. SCHUMANN AND R. SWEET, "A DIRECT METHOD
    C                        FOR THE SOLUTION OF POISSON'S EQUATION WITH
    C                        NEUMANN BOUNDARY CONDITIONS ON A STAGGERED
    C                        GRID OF ARBITRARY SIZE," J. COMP. PHYS.
    C                        20(1976), PP. 171-182.
    C***********************************************************************

HSTSSP

          SUBROUTINE HSTSSP (A,B,M,MBDCND,BDA,BDB,C,D,N,NBDCND,BDC,BDD,
         1                   ELMBDA,F,IDIMF,PERTRB,IERROR,W)
    C
    C     * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
    C     *                                                               *
    C     *                  copyright (c) 1999 by UCAR                   *
    C     *                                                               *
    C     *       UNIVERSITY CORPORATION for ATMOSPHERIC RESEARCH         *
    C     *                                                               *
    C     *                      all rights reserved                      *
    C     *                                                               *
    C     *                      FISHPACK version 4.1                     *
    C     *                                                               *
    C     *     A PACKAGE OF FORTRAN SUBPROGRAMS FOR THE SOLUTION OF      *
    C     *                                                               *
    C     *      SEPARABLE ELLIPTIC PARTIAL DIFFERENTIAL EQUATIONS        *
    C     *                                                               *
    C     *                             BY                                *
    C     *                                                               *
    C     *        JOHN ADAMS, PAUL SWARZTRAUBER AND ROLAND SWEET         *
    C     *                                                               *
    C     *                             OF                                *
    C     *                                                               *
    C     *         THE NATIONAL CENTER FOR ATMOSPHERIC RESEARCH          *
    C     *                                                               *
    C     *                BOULDER, COLORADO  (80307)  U.S.A.             *
    C     *                                                               *
    C     *                   WHICH IS SPONSORED BY                       *
    C     *                                                               *
    C     *              THE NATIONAL SCIENCE FOUNDATION                  *
    C     *                                                               *
    C     * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
    C
    C
    C
    C DIMENSION OF           BDA(N),BDB(N),BDC(M),BDD(M),F(IDIMF,N),
    C ARGUMENTS              W(SEE ARGUMENT LIST)
    C
    C LATEST REVISION        NOVEMBER 1988
    C
    C PURPOSE                SOLVES THE STANDARD FIVE-POINT FINITE
    C                        DIFFERENCE APPROXIMATION ON A STAGGERED GRID
    C                        TO THE HELMHOLTZ EQUATION IN SPHERICAL
    C                        COORDINATES AND ON THE SURFACE OF THE UNIT
    C                        SPHERE (RADIUS OF 1).  THE EQUATION IS
    C
    C                          (1/SIN(THETA))(D/DTHETA)(SIN(THETA)
    C                          (DU/DTHETA)) + (1/SIN(THETA)**2)
    C                          (D/DPHI)(DU/DPHI) + LAMBDA*U = F(THETA,PHI)
    C
    C                        WHERE THETA IS COLATITUDE AND PHI IS
    C                        LONGITUDE.
    C
    C USAGE                  CALL HSTSSP (A,B,M,MBDCND,BDA,BDB,C,D,N,
    C                                     NBDCND,BDC,BDD,ELMBDA,F,IDIMF,
    C                                     PERTRB,IERROR,W)
    C
    C
    C ARGUMENTS
    C ON INPUT
    C
    C                        A,B
    C                          THE RANGE OF THETA (COLATITUDE),
    C                          I.E. A .LE. THETA .LE. B.
    C                          A MUST BE LESS THAN B AND A MUST BE
    C                          NON-NEGATIVE.  A AND B ARE IN RADIANS.
    C                          A = 0 CORRESPONDS TO THE NORTH POLE AND
    C                          B = PI CORRESPONDS TO THE SOUTH POLE.
    C
    C
    C                            * * *  IMPORTANT  * * *
    C
    C                          IF B IS EQUAL TO PI, THEN B MUST BE
    C                          COMPUTED USING THE STATEMENT
    C                            B = PIMACH(DUM)
    C
    C                          THIS INSURES THAT B IN THE USER"S PROGRAM
    C                          IS EQUAL TO PI IN THIS PROGRAM WHICH
    C                          PERMITS SEVERAL TESTS OF THE INPUT
    C                          PARAMETERS THAT OTHERWISE WOULD NOT BE
    C                          POSSIBLE.
    C
    C                            * * * * * * * * * * * *
    C                        M
    C                          THE NUMBER OF GRID POINTS IN THE INTERVAL
    C                          (A,B).  THE GRID POINTS IN THE THETA
    C                          DIRECTION ARE GIVEN BY
    C                          THETA(I) = A + (I-0.5)DTHETA
    C                          FOR I=1,2,...,M WHERE DTHETA =(B-A)/M.
    C                          M MUST BE GREATER THAN 2.
    C
    C                        MBDCND
    C                          INDICATES THE TYPE OF BOUNDARY CONDITIONS
    C                          AT THETA = A AND THETA = B.
    C
    C                          = 1  IF THE SOLUTION IS SPECIFIED AT
    C                               THETA = A AND THETA = B.
    C                               (SEE NOTE 3 BELOW)
    C
    C                          = 2  IF THE SOLUTION IS SPECIFIED AT
    C                               THETA = A AND THE DERIVATIVE OF THE
    C                               SOLUTION WITH RESPECT TO THETA IS
    C                               SPECIFIED AT THETA = B
    C                               (SEE NOTES 2 AND 3 BELOW).
    C
    C                          = 3  IF THE DERIVATIVE OF THE SOLUTION
    C                             WITH RESPECT TO THETA IS SPECIFIED
    C                             AT THETA = A
    C                             (SEE NOTES 1, 2 BELOW) AND THETA = B.
    C
    C                          = 4  IF THE DERIVATIVE OF THE SOLUTION
    C                               WITH RESPECT TO THETA IS SPECIFIED
    C                               AT THETA = A
    C                               (SEE NOTES 1 AND 2 BELOW) AND THE
    C                               SOLUTION IS SPECIFIED AT THETA = B.
    C
    C                          = 5  IF THE SOLUTION IS UNSPECIFIED AT
    C                               THETA = A = 0 AND THE SOLUTION IS
    C                               SPECIFIED AT THETA = B.
    C                               (SEE NOTE 3 BELOW)
    C
    C                          = 6  IF THE SOLUTION IS UNSPECIFIED AT
    C                               THETA = A = 0 AND THE DERIVATIVE
    C                               OF THE SOLUTION WITH RESPECT TO THETA
    C                               IS SPECIFIED AT THETA = B
    C                               (SEE NOTE 2 BELOW).
    C
    C                          = 7  IF THE SOLUTION IS SPECIFIED AT
    C                               THETA = A AND THE SOLUTION IS
    C                               UNSPECIFIED AT THETA = B = PI.
    C                               (SEE NOTE 3 BELOW)
    C
    C                          = 8  IF THE DERIVATIVE OF THE SOLUTION
    C                               WITH RESPECT TO THETA IS SPECIFIED AT
    C                               THETA = A (SEE NOTE 1 BELOW)
    C                               AND THE SOLUTION IS UNSPECIFIED AT
    C                               THETA = B = PI.
    C
    C                          = 9  IF THE SOLUTION IS UNSPECIFIED AT
    C                               THETA = A = 0 AND THETA = B = PI.
    C
    C                          NOTE 1:
    C                          IF A = 0, DO NOT USE MBDCND = 3, 4, OR 8,
    C                          BUT INSTEAD USE MBDCND = 5, 6, OR 9.
    C
    C                          NOTE 2:
    C                          IF B = PI, DO NOT USE MBDCND = 2, 3, OR 6,
    C                          BUT INSTEAD USE MBDCND = 7, 8, OR 9.
    C
    C                          NOTE 3:
    C                          WHEN THE SOLUTION IS SPECIFIED AT
    C                          THETA = 0 AND/OR THETA = PI AND THE OTHER
    C                          BOUNDARY CONDITIONS ARE COMBINATIONS
    C                          OF UNSPECIFIED, NORMAL DERIVATIVE, OR
    C                          PERIODICITY A SINGULAR SYSTEM RESULTS.
    C                          THE UNIQUE SOLUTION IS DETERMINED BY
    C                          EXTRAPOLATION TO THE SPECIFICATION OF THE
    C                          SOLUTION AT EITHER THETA = 0 OR THETA = PI.
    C                          BUT IN THESE CASES THE RIGHT SIDE OF THE
    C                          SYSTEM  WILL BE PERTURBED BY THE CONSTANT
    C                          PERTRB.
    C
    C                        BDA
    C                          A ONE-DIMENSIONAL ARRAY OF LENGTH N THAT
    C                          SPECIFIES THE BOUNDARY VALUES (IF ANY) OF
    C                          THE SOLUTION AT THETA = A.
    C
    C                          WHEN MBDCND = 1, 2, OR 7,
    C                            BDA(J) = U(A,PHI(J)) ,      J=1,2,...,N.
    C
    C                          WHEN MBDCND = 3, 4, OR 8,
    C                            BDA(J) = (D/DTHETA)U(A,PHI(J)) ,
    C                            J=1,2,...,N.
    C
    C                          WHEN MBDCND HAS ANY OTHER VALUE,
    C                          BDA IS A DUMMY VARIABLE.
    C
    C                        BDB
    C                          A ONE-DIMENSIONAL ARRAY OF LENGTH N THAT
    C                          SPECIFIES THE BOUNDARY VALUES OF THE
    C                          SOLUTION AT THETA = B.
    C
    C                          WHEN MBDCND = 1,4, OR 5,
    C                            BDB(J) = U(B,PHI(J)) ,       J=1,2,...,N.
    C
    C                          WHEN MBDCND = 2,3, OR 6,
    C                            BDB(J) = (D/DTHETA)U(B,PHI(J)) ,
    C                            J=1,2,...,N.
    C
    C                          WHEN MBDCND HAS ANY OTHER VALUE, BDB IS
    C                          A DUMMY VARIABLE.
    C
    C                        C,D
    C                          THE RANGE OF PHI (LONGITUDE),
    C                          I.E. C .LE. PHI .LE. D.
    C                          C MUST BE LESS THAN D.  IF D-C = 2*PI,
    C                          PERIODIC BOUNDARY CONDITIONS ARE USUALLY
    C                          USUALLY PRESCRIBED.
    C
    C                        N
    C                          THE NUMBER OF UNKNOWNS IN THE INTERVAL
    C                          (C,D).  THE UNKNOWNS IN THE PHI-DIRECTION
    C                          ARE GIVEN BY PHI(J) = C + (J-0.5)DPHI,
    C                          J=1,2,...,N, WHERE DPHI = (D-C)/N.
    C                          N MUST BE GREATER THAN 2.
    C
    C                        NBDCND
    C                          INDICATES THE TYPE OF BOUNDARY CONDITIONS
    C                          AT PHI = C  AND PHI = D.
    C
    C                          = 0  IF THE SOLUTION IS PERIODIC IN PHI,
    C                               I.E.  U(I,J) = U(I,N+J).
    C
    C                          = 1  IF THE SOLUTION IS SPECIFIED AT
    C                               PHI = C AND PHI = D
    C                               (SEE NOTE BELOW).
    C
    C                          = 2  IF THE SOLUTION IS SPECIFIED AT
    C                               PHI = C AND THE DERIVATIVE OF THE
    C                               SOLUTION WITH RESPECT TO PHI IS
    C                               SPECIFIED AT PHI = D
    C                               (SEE NOTE BELOW).
    C
    C                          = 3  IF THE DERIVATIVE OF THE SOLUTION
    C                               WITH RESPECT TO PHI IS SPECIFIED
    C                               AT PHI = C AND PHI = D.
    C
    C                          = 4  IF THE DERIVATIVE OF THE SOLUTION
    C                               WITH RESPECT TO PHI IS SPECIFIED
    C                               AT PHI = C AND THE SOLUTION IS
    C                               SPECIFIED AT PHI = D
    C                               (SEE NOTE BELOW).
    C
    C                          NOTE:
    C                          WHEN NBDCND = 1, 2, OR 4, DO NOT USE
    C                          MBDCND = 5, 6, 7, 8, OR 9
    C                          (THE FORMER INDICATES THAT THE SOLUTION
    C                          IS SPECIFIED AT A POLE; THE LATTER
    C                          INDICATES THE SOLUTION IS UNSPECIFIED).
    C                          USE INSTEAD MBDCND = 1 OR 2.
    C
    C                        BDC
    C                          A ONE DIMENSIONAL ARRAY OF LENGTH M THAT
    C                          SPECIFIES THE BOUNDARY VALUES OF THE
    C                          SOLUTION AT PHI = C.
    C
    C                          WHEN NBDCND = 1 OR 2,
    C                            BDC(I) = U(THETA(I),C) ,     I=1,2,...,M.
    C
    C                          WHEN NBDCND = 3 OR 4,
    C                            BDC(I) = (D/DPHI)U(THETA(I),C),
    C                            I=1,2,...,M.
    C
    C                          WHEN NBDCND = 0, BDC IS A DUMMY VARIABLE.
    C
    C                        BDD
    C                          A ONE-DIMENSIONAL ARRAY OF LENGTH M THAT
    C                          SPECIFIES THE BOUNDARY VALUES OF THE
    C                          SOLUTION AT PHI = D.
    C
    C                          WHEN NBDCND = 1 OR 4,
    C                            BDD(I) = U(THETA(I),D) ,     I=1,2,...,M.
    C
    C                          WHEN NBDCND = 2 OR 3,
    C                            BDD(I) = (D/DPHI)U(THETA(I),D) ,
    C                            I=1,2,...,M.
    C
    C                          WHEN NBDCND = 0, BDD IS A DUMMY VARIABLE.
    C
    C                        ELMBDA
    C                          THE CONSTANT LAMBDA IN THE HELMHOLTZ
    C                          EQUATION.  IF LAMBDA IS GREATER THAN 0,
    C                          A SOLUTION MAY NOT EXIST.  HOWEVER,
    C                          HSTSSP WILL ATTEMPT TO FIND A SOLUTION.
    C
    C                        F
    C                          A TWO-DIMENSIONAL ARRAY THAT SPECIFIES
    C                          THE VALUES OF THE RIGHT SIDE OF THE
    C                          HELMHOLTZ EQUATION.
    C                          FOR I=1,2,...,M AND J=1,2,...,N
    C
    C                            F(I,J) = F(THETA(I),PHI(J)) .
    C
    C                          F MUST BE DIMENSIONED AT LEAST M X N.
    C
    C                        IDIMF
    C                          THE ROW (OR FIRST) DIMENSION OF THE ARRAY
    C                          F AS IT APPEARS IN THE PROGRAM CALLING
    C                          HSTSSP.  THIS PARAMETER IS USED TO SPECIFY
    C                          THE VARIABLE DIMENSION OF F.
    C                          IDIMF MUST BE AT LEAST M.
    C
    C                        W
    C                          A ONE-DIMENSIONAL ARRAY THAT MUST BE
    C                          PROVIDED BY THE USER FOR WORK SPACE.
    C                          W MAY REQUIRE UP TO 13M + 4N +
    C                          M*INT(LOG2(N))  LOCATIONS.
    C                          THE ACTUAL NUMBER OF LOCATIONS USED IS
    C                          COMPUTED BY HSTSSP AND IS RETURNED IN
    C                          THE LOCATION W(1).
    C
    C
    C ON OUTPUT              F
    C                          CONTAINS THE SOLUTION U(I,J) OF THE FINITE
    C                          DIFFERENCE APPROXIMATION FOR THE GRID POINT
    C                          (THETA(I),PHI(J)) FOR
    C                          I=1,2,...,M, J=1,2,...,N.
    C
    C                        PERTRB
    C                          IF A COMBINATION OF PERIODIC, DERIVATIVE,
    C                          OR UNSPECIFIED BOUNDARY CONDITIONS IS
    C                          SPECIFIED FOR A POISSON EQUATION
    C                          (LAMBDA = 0), A SOLUTION MAY NOT EXIST.
    C                          PERTRB IS A CONSTANT, CALCULATED AND
    C                          SUBTRACTED FROM F, WHICH ENSURES THAT A
    C                          SOLUTION EXISTS.  HSTSSP THEN COMPUTES
    C                          THIS SOLUTION, WHICH IS A LEAST SQUARES
    C                          SOLUTION TO THE ORIGINAL APPROXIMATION.
    C                          THIS SOLUTION PLUS ANY CONSTANT IS ALSO
    C                          A SOLUTION; HENCE, THE SOLUTION IS NOT
    C                          UNIQUE.  THE VALUE OF PERTRB SHOULD BE
    C                          SMALL COMPARED TO THE RIGHT SIDE F.
    C                          OTHERWISE, A SOLUTION IS OBTAINED TO AN
    C                          ESSENTIALLY DIFFERENT PROBLEM.
    C                          THIS COMPARISON SHOULD ALWAYS BE MADE TO
    C                          INSURE THAT A MEANINGFUL SOLUTION HAS BEEN
    C                          OBTAINED.
    C
    C                        IERROR
    C                          AN ERROR FLAG THAT INDICATES INVALID INPUT
    C                          PARAMETERS. EXCEPT TO NUMBERS 0 AND 14,
    C                          A SOLUTION IS NOT ATTEMPTED.
    C
    C                          =  0  NO ERROR
    C
    C                          =  1  A .LT. 0 OR B .GT. PI
    C
    C                          =  2  A .GE. B
    C
    C                          =  3  MBDCND .LT. 1 OR MBDCND .GT. 9
    C
    C                          =  4  C .GE. D
    C
    C                          =  5  N .LE. 2
    C
    C                          =  6  NBDCND .LT. 0 OR NBDCND .GT. 4
    C
    C                          =  7  A .GT. 0 AND MBDCND = 5, 6, OR 9
    C
    C                          =  8  A = 0 AND MBDCND = 3, 4, OR 8
    C
    C                          =  9  B .LT. PI AND MBDCND .GE. 7
    C
    C                          = 10  B = PI AND MBDCND = 2,3, OR 6
    C
    C                          = 11  MBDCND .GE. 5 AND NDBCND = 1, 2, OR 4
    C
    C                          = 12  IDIMF .LT. M
    C
    C                          = 13  M .LE. 2
    C
    C                          = 14  LAMBDA .GT. 0
    C
    C                          SINCE THIS IS THE ONLY MEANS OF INDICATING
    C                          A POSSIBLY INCORRECT CALL TO HSTSSP, THE
    C                          USER SHOULD TEST IERROR AFTER THE CALL.
    C
    C                        W
    C                          W(1) CONTAINS THE REQUIRED LENGTH OF W.
    C
    C I/O                    NONE
    C
    C PRECISION              SINGLE
    C
    C REQUIRED LIBRARY       COMF, GENBUN, GNBNAUX, AND POISTG
    C FILES                  FROM FISHPAK
    C
    C LANGUAGE               FORTRAN
    C
    C HISTORY                WRITTEN BY ROLAND SWEET AT NCAR IN 1977.
    C                        RELEASED ON NCAR'S PUBLIC SOFTWARE LIBRARIES
    C                        IN JANUARY 1980.
    C
    C PORTABILITY            FORTRAN 77.
    C
    C ALGORITHM              THIS SUBROUTINE DEFINES THE FINITE-
    C                        DIFFERENCE EQUATIONS, INCORPORATES BOUNDARY
    C                        DATA, ADJUSTS THE RIGHT SIDE WHEN THE SYSTEM
    C                        IS SINGULAR AND CALLS EITHER POISTG OR GENBUN
    C                        WHICH SOLVES THE LINEAR SYSTEM OF EQUATIONS.
    C
    C TIMING                 FOR LARGE M AND N, THE OPERATION COUNT
    C                        IS ROUGHLY PROPORTIONAL TO M*N*LOG2(N).
    C
    C ACCURACY               THE SOLUTION PROCESS EMPLOYED RESULTS IN
    C                        A LOSS OF NO MORE THAN FOUR SIGNIFICANT
    C                        DIGITS FOR N AND M AS LARGE AS 64.
    C                        MORE DETAILED INFORMATION ABOUT ACCURACY
    C                        CAN BE FOUND IN THE DOCUMENTATION FOR
    C                        ROUTINE POISTG WHICH IS THE ROUTINE THAT
    C                        ACTUALLY SOLVES THE FINITE DIFFERENCE
    C                        EQUATIONS.
    C
    C REFERENCES             U. SCHUMANN AND R. SWEET,"A DIRECT METHOD
    C                        FOR THE SOLUTION OF POISSON'S EQUATION WITH
    C                        NEUMANN BOUNDARY CONDITIONS ON A STAGGERED
    C                        GRID OF ARBITRARY SIZE," J. COMP. PHYS.
    C                        20(1976), PP. 171-182.
    C***********************************************************************

HW3CRT

          SUBROUTINE HW3CRT (XS,XF,L,LBDCND,BDXS,BDXF,YS,YF,M,MBDCND,BDYS,
         1                   BDYF,ZS,ZF,N,NBDCND,BDZS,BDZF,ELMBDA,LDIMF,
         2                   MDIMF,F,PERTRB,IERROR,W)
    C
    C     * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
    C     *                                                               *
    C     *                  copyright (c) 1999 by UCAR                   *
    C     *                                                               *
    C     *       UNIVERSITY CORPORATION for ATMOSPHERIC RESEARCH         *
    C     *                                                               *
    C     *                      all rights reserved                      *
    C     *                                                               *
    C     *                      FISHPACK version 4.1                     *
    C     *                                                               *
    C     *     A PACKAGE OF FORTRAN SUBPROGRAMS FOR THE SOLUTION OF      *
    C     *                                                               *
    C     *      SEPARABLE ELLIPTIC PARTIAL DIFFERENTIAL EQUATIONS        *
    C     *                                                               *
    C     *                             BY                                *
    C     *                                                               *
    C     *        JOHN ADAMS, PAUL SWARZTRAUBER AND ROLAND SWEET         *
    C     *                                                               *
    C     *                             OF                                *
    C     *                                                               *
    C     *         THE NATIONAL CENTER FOR ATMOSPHERIC RESEARCH          *
    C     *                                                               *
    C     *                BOULDER, COLORADO  (80307)  U.S.A.             *
    C     *                                                               *
    C     *                   WHICH IS SPONSORED BY                       *
    C     *                                                               *
    C     *              THE NATIONAL SCIENCE FOUNDATION                  *
    C     *                                                               *
    C     * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
    C
    C
    C
    C DIMENSION OF           BDXS(MDIMF,N+1),    BDXF(MDIMF,N+1),
    C ARGUMENTS              BDYS(LDIMF,N+1),    BDYF(LDIMF,N+1),
    C                        BDZS(LDIMF,M+1),    BDZF(LDIMF,M+1),
    C                        F(LDIMF,MDIMF,N+1), W(SEE ARGUMENT LIST)
    C
    C LATEST REVISION        NOVEMBER 1988
    C
    C PURPOSE                SOLVES THE STANDARD FIVE-POINT FINITE
    C                        DIFFERENCE APPROXIMATION TO THE HELMHOLTZ
    C                        EQUATION IN CARTESIAN COORDINATES.  THIS
    C                        EQUATION IS
    C
    C                          (D/DX)(DU/DX) + (D/DY)(DU/DY) +
    C                          (D/DZ)(DU/DZ) + LAMBDA*U = F(X,Y,Z) .
    C
    C USAGE                  CALL HW3CRT (XS,XF,L,LBDCND,BDXS,BDXF,YS,YF,M,
    C                                     MBDCND,BDYS,BDYF,ZS,ZF,N,NBDCND,
    C                                     BDZS,BDZF,ELMBDA,LDIMF,MDIMF,F,
    C                                     PERTRB,IERROR,W)
    C
    C ARGUMENTS
    C
    C ON INPUT               XS,XF
    C
    C                          THE RANGE OF X, I.E. XS .LE. X .LE. XF .
    C                          XS MUST BE LESS THAN XF.
    C
    C                        L
    C                          THE NUMBER OF PANELS INTO WHICH THE
    C                          INTERVAL (XS,XF) IS SUBDIVIDED.
    C                          HENCE, THERE WILL BE L+1 GRID POINTS
    C                          IN THE X-DIRECTION GIVEN BY
    C                          X(I) = XS+(I-1)DX FOR I=1,2,...,L+1,
    C                          WHERE DX = (XF-XS)/L IS THE PANEL WIDTH.
    C                          L MUST BE AT LEAST 5.
    C
    C                        LBDCND
    C                          INDICATES THE TYPE OF BOUNDARY CONDITIONS
    C                          AT X = XS AND X = XF.
    C
    C                          = 0  IF THE SOLUTION IS PERIODIC IN X,
    C                               I.E. U(L+I,J,K) = U(I,J,K).
    C                          = 1  IF THE SOLUTION IS SPECIFIED AT
    C                               X = XS AND X = XF.
    C                          = 2  IF THE SOLUTION IS SPECIFIED AT
    C                               X = XS AND THE DERIVATIVE OF THE
    C                               SOLUTION WITH RESPECT TO X IS
    C                               SPECIFIED AT X = XF.
    C                          = 3  IF THE DERIVATIVE OF THE SOLUTION
    C                               WITH RESPECT TO X IS SPECIFIED AT
    C                               X = XS AND X = XF.
    C                          = 4  IF THE DERIVATIVE OF THE SOLUTION
    C                               WITH RESPECT TO X IS SPECIFIED AT
    C                               X = XS AND THE SOLUTION IS SPECIFIED
    C                               AT X=XF.
    C
    C                        BDXS
    C                          A TWO-DIMENSIONAL ARRAY THAT SPECIFIES THE
    C                          VALUES OF THE DERIVATIVE OF THE SOLUTION
    C                          WITH RESPECT TO X AT X = XS.
    C
    C                          WHEN LBDCND = 3 OR 4,
    C
    C                            BDXS(J,K) = (D/DX)U(XS,Y(J),Z(K)),
    C                            J=1,2,...,M+1,      K=1,2,...,N+1.
    C
    C                          WHEN LBDCND HAS ANY OTHER VALUE, BDXS
    C                          IS A DUMMY VARIABLE. BDXS MUST BE
    C                          DIMENSIONED AT LEAST (M+1)*(N+1).
    C
    C                        BDXF
    C                          A TWO-DIMENSIONAL ARRAY THAT SPECIFIES THE
    C                          VALUES OF THE DERIVATIVE OF THE SOLUTION
    C                          WITH RESPECT TO X AT X = XF.
    C
    C                          WHEN LBDCND = 2 OR 3,
    C
    C                            BDXF(J,K) = (D/DX)U(XF,Y(J),Z(K)),
    C                            J=1,2,...,M+1,      K=1,2,...,N+1.
    C
    C                          WHEN LBDCND HAS ANY OTHER VALUE, BDXF IS
    C                          A DUMMY VARIABLE.  BDXF MUST BE
    C                          DIMENSIONED AT LEAST (M+1)*(N+1).
    C
    C                        YS,YF
    C                          THE RANGE OF Y, I.E. YS .LE. Y .LE. YF.
    C                          YS MUST BE LESS THAN YF.
    C
    C                        M
    C                          THE NUMBER OF PANELS INTO WHICH THE
    C                          INTERVAL (YS,YF) IS SUBDIVIDED.
    C                          HENCE, THERE WILL BE M+1 GRID POINTS IN
    C                          THE Y-DIRECTION GIVEN BY Y(J) = YS+(J-1)DY
    C                          FOR J=1,2,...,M+1,
    C                          WHERE DY = (YF-YS)/M IS THE PANEL WIDTH.
    C                          M MUST BE AT LEAST 5.
    C
    C                        MBDCND
    C                          INDICATES THE TYPE OF BOUNDARY CONDITIONS
    C                          AT Y = YS AND Y = YF.
    C
    C                          = 0  IF THE SOLUTION IS PERIODIC IN Y, I.E.
    C                               U(I,M+J,K) = U(I,J,K).
    C                          = 1  IF THE SOLUTION IS SPECIFIED AT
    C                               Y = YS AND Y = YF.
    C                          = 2  IF THE SOLUTION IS SPECIFIED AT
    C                               Y = YS AND THE DERIVATIVE OF THE
    C                               SOLUTION WITH RESPECT TO Y IS
    C                               SPECIFIED AT Y = YF.
    C                          = 3  IF THE DERIVATIVE OF THE SOLUTION
    C                               WITH RESPECT TO Y IS SPECIFIED AT
    C                               Y = YS AND Y = YF.
    C                          = 4  IF THE DERIVATIVE OF THE SOLUTION
    C                               WITH RESPECT TO Y IS SPECIFIED AT
    C                               AT Y = YS AND THE SOLUTION IS
    C                               SPECIFIED AT Y=YF.
    C
    C                        BDYS
    C                          A TWO-DIMENSIONAL ARRAY THAT SPECIFIES
    C                          THE VALUES OF THE DERIVATIVE OF THE
    C                          SOLUTION WITH RESPECT TO Y AT Y = YS.
    C
    C                          WHEN MBDCND = 3 OR 4,
    C
    C                            BDYS(I,K) = (D/DY)U(X(I),YS,Z(K)),
    C                            I=1,2,...,L+1,      K=1,2,...,N+1.
    C
    C                          WHEN MBDCND HAS ANY OTHER VALUE, BDYS
    C                          IS A DUMMY VARIABLE. BDYS MUST BE
    C                          DIMENSIONED AT LEAST (L+1)*(N+1).
    C
    C                        BDYF
    C                          A TWO-DIMENSIONAL ARRAY THAT SPECIFIES
    C                          THE VALUES OF THE DERIVATIVE OF THE
    C                          SOLUTION WITH RESPECT TO Y AT Y = YF.
    C
    C                          WHEN MBDCND = 2 OR 3,
    C
    C                            BDYF(I,K) = (D/DY)U(X(I),YF,Z(K)),
    C                            I=1,2,...,L+1,      K=1,2,...,N+1.
    C
    C                          WHEN MBDCND HAS ANY OTHER VALUE, BDYF
    C                          IS A DUMMY VARIABLE. BDYF MUST BE
    C                          DIMENSIONED AT LEAST (L+1)*(N+1).
    C
    C                        ZS,ZF
    C                          THE RANGE OF Z, I.E. ZS .LE. Z .LE. ZF.
    C                          ZS MUST BE LESS THAN ZF.
    C
    C                        N
    C                          THE NUMBER OF PANELS INTO WHICH THE
    C                          INTERVAL (ZS,ZF) IS SUBDIVIDED.
    C                          HENCE, THERE WILL BE N+1 GRID POINTS
    C                          IN THE Z-DIRECTION GIVEN BY
    C                          Z(K) = ZS+(K-1)DZ FOR K=1,2,...,N+1,
    C                          WHERE DZ = (ZF-ZS)/N IS THE PANEL WIDTH.
    C                          N MUST BE AT LEAST 5.
    C
    C                        NBDCND
    C                          INDICATES THE TYPE OF BOUNDARY CONDITIONS
    C                          AT Z = ZS AND Z = ZF.
    C
    C                          = 0  IF THE SOLUTION IS PERIODIC IN Z, I.E.
    C                               U(I,J,N+K) = U(I,J,K).
    C                          = 1  IF THE SOLUTION IS SPECIFIED AT
    C                               Z = ZS AND Z = ZF.
    C                          = 2  IF THE SOLUTION IS SPECIFIED AT
    C                               Z = ZS AND THE DERIVATIVE OF THE
    C                               SOLUTION WITH RESPECT TO Z IS
    C                               SPECIFIED AT Z = ZF.
    C                          = 3  IF THE DERIVATIVE OF THE SOLUTION
    C                               WITH RESPECT TO Z IS SPECIFIED AT
    C                               Z = ZS AND Z = ZF.
    C                          = 4  IF THE DERIVATIVE OF THE SOLUTION
    C                               WITH RESPECT TO Z IS SPECIFIED AT
    C                               Z = ZS AND THE SOLUTION IS SPECIFIED
    C                               AT Z=ZF.
    C
    C                        BDZS
    C                          A TWO-DIMENSIONAL ARRAY THAT SPECIFIES
    C                          THE VALUES OF THE DERIVATIVE OF THE
    C                          SOLUTION WITH RESPECT TO Z AT Z = ZS.
    C
    C                          WHEN NBDCND = 3 OR 4,
    C
    C                            BDZS(I,J) = (D/DZ)U(X(I),Y(J),ZS),
    C                            I=1,2,...,L+1,      J=1,2,...,M+1.
    C
    C                          WHEN NBDCND HAS ANY OTHER VALUE, BDZS
    C                          IS A DUMMY VARIABLE. BDZS MUST BE
    C                          DIMENSIONED AT LEAST (L+1)*(M+1).
    C
    C                        BDZF
    C                          A TWO-DIMENSIONAL ARRAY THAT SPECIFIES
    C                          THE VALUES OF THE DERIVATIVE OF THE
    C                          SOLUTION WITH RESPECT TO Z AT Z = ZF.
    C
    C                          WHEN NBDCND = 2 OR 3,
    C
    C                            BDZF(I,J) = (D/DZ)U(X(I),Y(J),ZF),
    C                            I=1,2,...,L+1,      J=1,2,...,M+1.
    C
    C                          WHEN NBDCND HAS ANY OTHER VALUE, BDZF
    C                          IS A DUMMY VARIABLE. BDZF MUST BE
    C                          DIMENSIONED AT LEAST (L+1)*(M+1).
    C
    C                        ELMBDA
    C                          THE CONSTANT LAMBDA IN THE HELMHOLTZ
    C                          EQUATION. IF LAMBDA .GT. 0, A SOLUTION
    C                          MAY NOT EXIST.  HOWEVER, HW3CRT WILL
    C                          ATTEMPT TO FIND A SOLUTION.
    C
    C                        LDIMF
    C                          THE ROW (OR FIRST) DIMENSION OF THE
    C                          ARRAYS F,BDYS,BDYF,BDZS,AND BDZF AS IT
    C                          APPEARS IN THE PROGRAM CALLING HW3CRT.
    C                          THIS PARAMETER IS USED TO SPECIFY THE
    C                          VARIABLE DIMENSION OF THESE ARRAYS.
    C                          LDIMF MUST BE AT LEAST L+1.
    C
    C                        MDIMF
    C                          THE COLUMN (OR SECOND) DIMENSION OF THE
    C                          ARRAY F AND THE ROW (OR FIRST) DIMENSION
    C                          OF THE ARRAYS BDXS AND BDXF AS IT APPEARS
    C                          IN THE PROGRAM CALLING HW3CRT.  THIS
    C                          PARAMETER IS USED TO SPECIFY THE VARIABLE
    C                          DIMENSION OF THESE ARRAYS.
    C                          MDIMF MUST BE AT LEAST M+1.
    C
    C                        F
    C                          A THREE-DIMENSIONAL ARRAY OF DIMENSION AT
    C                          AT LEAST (L+1)*(M+1)*(N+1), SPECIFYING THE
    C                          VALUES OF THE RIGHT SIDE OF THE HELMHOLZ
    C                          EQUATION AND BOUNDARY VALUES (IF ANY).
    C
    C                          ON THE INTERIOR, F IS DEFINED AS FOLLOWS:
    C                          FOR I=2,3,...,L,  J=2,3,...,M,
    C                          AND K=2,3,...,N
    C                          F(I,J,K) = F(X(I),Y(J),Z(K)).
    C
    C                          ON THE BOUNDARIES, F IS DEFINED AS FOLLOWS:
    C                          FOR J=1,2,...,M+1,  K=1,2,...,N+1,
    C                          AND I=1,2,...,L+1
    C
    C                          LBDCND      F(1,J,K)         F(L+1,J,K)
    C                          ------   ---------------   ---------------
    C
    C                            0      F(XS,Y(J),Z(K))   F(XS,Y(J),Z(K))
    C                            1      U(XS,Y(J),Z(K))   U(XF,Y(J),Z(K))
    C                            2      U(XS,Y(J),Z(K))   F(XF,Y(J),Z(K))
    C                            3      F(XS,Y(J),Z(K))   F(XF,Y(J),Z(K))
    C                            4      F(XS,Y(J),Z(K))   U(XF,Y(J),Z(K))
    C
    C                          MBDCND      F(I,1,K)         F(I,M+1,K)
    C                          ------   ---------------   ---------------
    C
    C                            0      F(X(I),YS,Z(K))   F(X(I),YS,Z(K))
    C                            1      U(X(I),YS,Z(K))   U(X(I),YF,Z(K))
    C                            2      U(X(I),YS,Z(K))   F(X(I),YF,Z(K))
    C                            3      F(X(I),YS,Z(K))   F(X(I),YF,Z(K))
    C                            4      F(X(I),YS,Z(K))   U(X(I),YF,Z(K))
    C
    C                          NBDCND      F(I,J,1)         F(I,J,N+1)
    C                          ------   ---------------   ---------------
    C
    C                            0      F(X(I),Y(J),ZS)   F(X(I),Y(J),ZS)
    C                            1      U(X(I),Y(J),ZS)   U(X(I),Y(J),ZF)
    C                            2      U(X(I),Y(J),ZS)   F(X(I),Y(J),ZF)
    C                            3      F(X(I),Y(J),ZS)   F(X(I),Y(J),ZF)
    C                            4      F(X(I),Y(J),ZS)   U(X(I),Y(J),ZF)
    C
    C                          NOTE:
    C                          IF THE TABLE CALLS FOR BOTH THE SOLUTION
    C                          U AND THE RIGHT SIDE F ON A BOUNDARY,
    C                          THEN THE SOLUTION MUST BE SPECIFIED.
    C
    C                        W
    C                          A ONE-DIMENSIONAL ARRAY THAT MUST BE
    C                          PROVIDED BY THE USER FOR WORK SPACE.
    C                          THE LENGTH OF W MUST BE AT LEAST
    C                          30 + L + M + 5*N + MAX(L,M,N) +
    C                          7*(INT((L+1)/2) + INT((M+1)/2))
    C
    C
    C
    C
    C ON OUTPUT              F
    C                          CONTAINS THE SOLUTION U(I,J,K) OF THE
    C                          FINITE DIFFERENCE APPROXIMATION FOR THE
    C                          GRID POINT (X(I),Y(J),Z(K)) FOR
    C                          I=1,2,...,L+1, J=1,2,...,M+1,
    C                          AND K=1,2,...,N+1.
    C
    C                        PERTRB
    C                          IF A COMBINATION OF PERIODIC OR DERIVATIVE
    C                          BOUNDARY CONDITIONS IS SPECIFIED FOR A
    C                          POISSON EQUATION (LAMBDA = 0), A SOLUTION
    C                          MAY NOT EXIST.  PERTRB IS A CONSTANT,
    C                          CALCULATED AND SUBTRACTED FROM F, WHICH
    C                          ENSURES THAT A SOLUTION EXISTS.  PWSCRT
    C                          THEN COMPUTES THIS SOLUTION, WHICH IS A
    C                          LEAST SQUARES SOLUTION TO THE ORIGINAL
    C                          APPROXIMATION.  THIS SOLUTION IS NOT
    C                          UNIQUE AND IS UNNORMALIZED.  THE VALUE OF
    C                          PERTRB SHOULD BE SMALL COMPARED TO THE
    C                          THE RIGHT SIDE F.  OTHERWISE, A SOLUTION
    C                          IS OBTAINED TO AN ESSENTIALLY DIFFERENT
    C                          PROBLEM.  THIS COMPARISON SHOULD ALWAYS
    C                          BE MADE TO INSURE THAT A MEANINGFUL
    C                          SOLUTION HAS BEEN OBTAINED.
    C
    C                        IERROR
    C                          AN ERROR FLAG THAT INDICATES INVALID INPUT
    C                          PARAMETERS.  EXCEPT FOR NUMBERS 0 AND 12,
    C                          A SOLUTION IS NOT ATTEMPTED.
    C
    C                          =  0  NO ERROR
    C                          =  1  XS .GE. XF
    C                          =  2  L .LT. 5
    C                          =  3  LBDCND .LT. 0 .OR. LBDCND .GT. 4
    C                          =  4  YS .GE. YF
    C                          =  5  M .LT. 5
    C                          =  6  MBDCND .LT. 0 .OR. MBDCND .GT. 4
    C                          =  7  ZS .GE. ZF
    C                          =  8  N .LT. 5
    C                          =  9  NBDCND .LT. 0 .OR. NBDCND .GT. 4
    C                          = 10  LDIMF .LT. L+1
    C                          = 11  MDIMF .LT. M+1
    C                          = 12  LAMBDA .GT. 0
    C
    C                          SINCE THIS IS THE ONLY MEANS OF INDICATING
    C                          A POSSIBLY INCORRECT CALL TO HW3CRT, THE
    C                          USER SHOULD TEST IERROR AFTER THE CALL.
    C
    C SPECIAL CONDITIONS     NONE
    C
    C I/O                    NONE
    C
    C PRECISION              SINGLE
    C
    C REQUIRED LIBRARY       POIS3D, FFTPACK, AND COMF FROM FISHPAK
    C FILES
    C
    C LANGUAGE               FORTRAN
    C
    C HISTORY                WRITTEN BY ROLAND SWEET AT NCAR IN THE LATE
    C                        1970'S.  RELEASED ON NCAR'S PUBLIC SOFTWARE
    C                        LIBRARIES IN JANUARY 1980.
    C
    C PORTABILITY            FORTRAN 77
    C
    C ALGORITHM              THIS SUBROUTINE DEFINES THE FINITE DIFFERENCE
    C                        EQUATIONS, INCORPORATES BOUNDARY DATA, AND
    C                        ADJUSTS THE RIGHT SIDE OF SINGULAR SYSTEMS AND
    C                        THEN CALLS POIS3D TO SOLVE THE SYSTEM.
    C
    C TIMING                 FOR LARGE L, M AND N, THE OPERATION COUNT
    C                        IS ROUGHLY PROPORTIONAL TO
    C                          L*M*N*(LOG2(L)+LOG2(M)+5),
    C                        BUT ALSO DEPENDS ON INPUT PARAMETERS LBDCND
    C                        AND MBDCND.
    C
    C ACCURACY               THE SOLUTION PROCESS EMPLOYED RESULTS IN
    C                        A LOSS OF NO MORE THAN FOUR SIGNIFICANT
    C                        DIGITS FOR L, M AND N AS LARGE AS 32.
    C                        MORE DETAILED INFORMATION ABOUT ACCURACY
    C                        CAN BE FOUND IN THE DOCUMENTATION FOR
    C                        ROUTINE POIS3D WHICH IS THE ROUTINE THAT
    C                        ACTUALLY SOLVES THE FINITE DIFFERENCE
    C                        EQUATIONS.
    C
    C REFERENCES             NONE
    C***********************************************************************

HWSCRT

          SUBROUTINE HWSCRT (A,B,M,MBDCND,BDA,BDB,C,D,N,NBDCND,BDC,BDD,
         1                   ELMBDA,F,IDIMF,PERTRB,IERROR,W)
    C
    C     * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
    C     *                                                               *
    C     *                  copyright (c) 1999 by UCAR                   *
    C     *                                                               *
    C     *       UNIVERSITY CORPORATION for ATMOSPHERIC RESEARCH         *
    C     *                                                               *
    C     *                      all rights reserved                      *
    C     *                                                               *
    C     *                      FISHPACK version 4.1                     *
    C     *                                                               *
    C     *     A PACKAGE OF FORTRAN SUBPROGRAMS FOR THE SOLUTION OF      *
    C     *                                                               *
    C     *      SEPARABLE ELLIPTIC PARTIAL DIFFERENTIAL EQUATIONS        *
    C     *                                                               *
    C     *                             BY                                *
    C     *                                                               *
    C     *        JOHN ADAMS, PAUL SWARZTRAUBER AND ROLAND SWEET         *
    C     *                                                               *
    C     *                             OF                                *
    C     *                                                               *
    C     *         THE NATIONAL CENTER FOR ATMOSPHERIC RESEARCH          *
    C     *                                                               *
    C     *                BOULDER, COLORADO  (80307)  U.S.A.             *
    C     *                                                               *
    C     *                   WHICH IS SPONSORED BY                       *
    C     *                                                               *
    C     *              THE NATIONAL SCIENCE FOUNDATION                  *
    C     *                                                               *
    C     * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
    C
    C
    C
    C DIMENSION OF           BDA(N),      BDB(N),   BDC(M),BDD(M),
    C ARGUMENTS              F(IDIMF,N),  W(SEE ARGUMENT LIST)
    C
    C LATEST REVISION        NOVEMBER 1988
    C
    C PURPOSE                SOLVES THE STANDARD FIVE-POINT FINITE
    C                        DIFFERENCE APPROXIMATION TO THE HELMHOLTZ
    C                        EQUATION IN CARTESIAN COORDINATES.  THIS
    C                        EQUATION IS
    C
    C                          (D/DX)(DU/DX) + (D/DY)(DU/DY)
    C                          + LAMBDA*U = F(X,Y).
    C
    C USAGE                  CALL HWSCRT (A,B,M,MBDCND,BDA,BDB,C,D,N,
    C                                     NBDCND,BDC,BDD,ELMBDA,F,IDIMF,
    C                                     PERTRB,IERROR,W)
    C
    C ARGUMENTS
    C ON INPUT               A,B
    C
    C                          THE RANGE OF X, I.E., A .LE. X .LE. B.
    C                          A MUST BE LESS THAN B.
    C
    C                        M
    C                          THE NUMBER OF PANELS INTO WHICH THE
    C                          INTERVAL (A,B) IS SUBDIVIDED.
    C                          HENCE, THERE WILL BE M+1 GRID POINTS
    C                          IN THE X-DIRECTION GIVEN BY
    C                          X(I) = A+(I-1)DX FOR I = 1,2,...,M+1,
    C                          WHERE DX = (B-A)/M IS THE PANEL WIDTH.
    C                          M MUST BE GREATER THAN 3.
    C
    C                        MBDCND
    C                          INDICATES THE TYPE OF BOUNDARY CONDITIONS
    C                          AT X = A AND X = B.
    C
    C                          = 0  IF THE SOLUTION IS PERIODIC IN X,
    C                               I.E., U(I,J) = U(M+I,J).
    C                          = 1  IF THE SOLUTION IS SPECIFIED AT
    C                               X = A AND X = B.
    C                          = 2  IF THE SOLUTION IS SPECIFIED AT
    C                               X = A AND THE DERIVATIVE OF THE
    C                               SOLUTION WITH RESPECT TO X IS
    C                               SPECIFIED AT X = B.
    C                          = 3  IF THE DERIVATIVE OF THE SOLUTION
    C                               WITH RESPECT TO X IS SPECIFIED AT
    C                               AT X = A AND X = B.
    C                          = 4  IF THE DERIVATIVE OF THE SOLUTION
    C                               WITH RESPECT TO X IS SPECIFIED AT
    C                               X = A AND THE SOLUTION IS SPECIFIED
    C                               AT X = B.
    C
    C                        BDA
    C                          A ONE-DIMENSIONAL ARRAY OF LENGTH N+1 THAT
    C                          SPECIFIES THE VALUES OF THE DERIVATIVE
    C                          OF THE SOLUTION WITH RESPECT TO X AT X = A.
    C
    C                          WHEN MBDCND = 3 OR 4,
    C
    C                            BDA(J) = (D/DX)U(A,Y(J)), J = 1,2,...,N+1.
    C
    C                          WHEN MBDCND HAS ANY OTHER VALUE, BDA IS
    C                          A DUMMY VARIABLE.
    C
    C                        BDB
    C                          A ONE-DIMENSIONAL ARRAY OF LENGTH N+1
    C                          THAT SPECIFIES THE VALUES OF THE DERIVATIVE
    C                          OF THE SOLUTION WITH RESPECT TO X AT X = B.
    C
    C                          WHEN MBDCND = 2 OR 3,
    C
    C                            BDB(J) = (D/DX)U(B,Y(J)), J = 1,2,...,N+1
    C
    C                          WHEN MBDCND HAS ANY OTHER VALUE BDB IS A
    C                          DUMMY VARIABLE.
    C
    C                        C,D
    C                          THE RANGE OF Y, I.E., C .LE. Y .LE. D.
    C                          C MUST BE LESS THAN D.
    C
    C                        N
    C                          THE NUMBER OF PANELS INTO WHICH THE
    C                          INTERVAL (C,D) IS SUBDIVIDED.  HENCE,
    C                          THERE WILL BE N+1 GRID POINTS IN THE
    C                          Y-DIRECTION GIVEN BY Y(J) = C+(J-1)DY
    C                          FOR J = 1,2,...,N+1, WHERE
    C                          DY = (D-C)/N IS THE PANEL WIDTH.
    C                          N MUST BE GREATER THAN 3.
    C
    C                        NBDCND
    C                          INDICATES THE TYPE OF BOUNDARY CONDITIONS AT
    C                          Y = C AND Y = D.
    C
    C                          = 0  IF THE SOLUTION IS PERIODIC IN Y,
    C                               I.E., U(I,J) = U(I,N+J).
    C                          = 1  IF THE SOLUTION IS SPECIFIED AT
    C                               Y = C AND Y = D.
    C                          = 2  IF THE SOLUTION IS SPECIFIED AT
    C                               Y = C AND THE DERIVATIVE OF THE
    C                               SOLUTION WITH RESPECT TO Y IS
    C                               SPECIFIED AT Y = D.
    C                          = 3  IF THE DERIVATIVE OF THE SOLUTION
    C                               WITH RESPECT TO Y IS SPECIFIED AT
    C                               Y = C AND Y = D.
    C                          = 4  IF THE DERIVATIVE OF THE SOLUTION
    C                               WITH RESPECT TO Y IS SPECIFIED AT
    C                               Y = C AND THE SOLUTION IS SPECIFIED
    C                               AT Y = D.
    C
    C                        BDC
    C                          A ONE-DIMENSIONAL ARRAY OF LENGTH M+1 THAT
    C                          SPECIFIES THE VALUES OF THE DERIVATIVE
    C                          OF THE SOLUTION WITH RESPECT TO Y AT Y = C.
    C
    C                          WHEN NBDCND = 3 OR 4,
    C
    C                            BDC(I) = (D/DY)U(X(I),C), I = 1,2,...,M+1
    C
    C                          WHEN NBDCND HAS ANY OTHER VALUE, BDC IS
    C                          A DUMMY VARIABLE.
    C
    C                        BDD
    C                          A ONE-DIMENSIONAL ARRAY OF LENGTH M+1 THAT
    C                          SPECIFIES THE VALUES OF THE DERIVATIVE
    C                          OF THE SOLUTION WITH RESPECT TO Y AT Y = D.
    C
    C                          WHEN NBDCND = 2 OR 3,
    C
    C                            BDD(I) = (D/DY)U(X(I),D), I = 1,2,...,M+1
    C
    C                          WHEN NBDCND HAS ANY OTHER VALUE, BDD IS
    C                          A DUMMY VARIABLE.
    C
    C                        ELMBDA
    C                          THE CONSTANT LAMBDA IN THE HELMHOLTZ
    C                          EQUATION.  IF LAMBDA .GT. 0, A SOLUTION
    C                          MAY NOT EXIST.  HOWEVER, HWSCRT WILL
    C                          ATTEMPT TO FIND A SOLUTION.
    C
    C                        F
    C                          A TWO-DIMENSIONAL ARRAY, OF DIMENSION AT
    C                          LEAST (M+1)*(N+1), SPECIFYING VALUES OF THE
    C                          RIGHT SIDE OF THE HELMHOLTZ  EQUATION AND
    C                          BOUNDARY VALUES (IF ANY).
    C
    C                          ON THE INTERIOR, F IS DEFINED AS FOLLOWS:
    C                          FOR I = 2,3,...,M AND J = 2,3,...,N
    C                          F(I,J) = F(X(I),Y(J)).
    C
    C                          ON THE BOUNDARIES, F IS DEFINED AS FOLLOWS:
    C                          FOR J=1,2,...,N+1,  I=1,2,...,M+1,
    C
    C                          MBDCND     F(1,J)        F(M+1,J)
    C                          ------     ---------     --------
    C
    C                            0        F(A,Y(J))     F(A,Y(J))
    C                            1        U(A,Y(J))     U(B,Y(J))
    C                            2        U(A,Y(J))     F(B,Y(J))
    C                            3        F(A,Y(J))     F(B,Y(J))
    C                            4        F(A,Y(J))     U(B,Y(J))
    C
    C
    C                          NBDCND     F(I,1)        F(I,N+1)
    C                          ------     ---------     --------
    C
    C                            0        F(X(I),C)     F(X(I),C)
    C                            1        U(X(I),C)     U(X(I),D)
    C                            2        U(X(I),C)     F(X(I),D)
    C                            3        F(X(I),C)     F(X(I),D)
    C                            4        F(X(I),C)     U(X(I),D)
    C
    C                          NOTE:
    C                          IF THE TABLE CALLS FOR BOTH THE SOLUTION U
    C                          AND THE RIGHT SIDE F AT A CORNER THEN THE
    C                          SOLUTION MUST BE SPECIFIED.
    C
    C                        IDIMF
    C                          THE ROW (OR FIRST) DIMENSION OF THE ARRAY
    C                          F AS IT APPEARS IN THE PROGRAM CALLING
    C                          HWSCRT.  THIS PARAMETER IS USED TO SPECIFY
    C                          THE VARIABLE DIMENSION OF F.  IDIMF MUST
    C                          BE AT LEAST M+1  .
    C
    C                        W
    C                          A ONE-DIMENSIONAL ARRAY THAT MUST BE
    C                          PROVIDED BY THE USER FOR WORK SPACE.
    C                          W MAY REQUIRE UP TO 4*(N+1) +
    C                          (13 + INT(LOG2(N+1)))*(M+1) LOCATIONS.
    C                          THE ACTUAL NUMBER OF LOCATIONS USED IS
    C                          COMPUTED BY HWSCRT AND IS RETURNED IN
    C                          LOCATION W(1).
    C
    C
    C ON OUTPUT              F
    C                          CONTAINS THE SOLUTION U(I,J) OF THE FINITE
    C                          DIFFERENCE APPROXIMATION FOR THE GRID POINT
    C                          (X(I),Y(J)), I = 1,2,...,M+1,
    C                          J = 1,2,...,N+1  .
    C
    C                        PERTRB
    C                          IF A COMBINATION OF PERIODIC OR DERIVATIVE
    C                          BOUNDARY CONDITIONS IS SPECIFIED FOR A
    C                          POISSON EQUATION (LAMBDA = 0), A SOLUTION
    C                          MAY NOT EXIST.  PERTRB IS A CONSTANT,
    C                          CALCULATED AND SUBTRACTED FROM F, WHICH
    C                          ENSURES THAT A SOLUTION EXISTS.  HWSCRT
    C                          THEN COMPUTES THIS SOLUTION, WHICH IS A
    C                          LEAST SQUARES SOLUTION TO THE ORIGINAL
    C                          APPROXIMATION.  THIS SOLUTION PLUS ANY
    C                          CONSTANT IS ALSO A SOLUTION.  HENCE, THE
    C                          SOLUTION IS NOT UNIQUE.  THE VALUE OF
    C                          PERTRB SHOULD BE SMALL COMPARED TO THE
    C                          RIGHT SIDE F.  OTHERWISE, A SOLUTION IS
    C                          OBTAINED TO AN ESSENTIALLY DIFFERENT
    C                          PROBLEM. THIS COMPARISON SHOULD ALWAYS
    C                          BE MADE TO INSURE THAT A MEANINGFUL
    C                          SOLUTION HAS BEEN OBTAINED.
    C
    C                        IERROR
    C                          AN ERROR FLAG THAT INDICATES INVALID INPUT
    C                          PARAMETERS.  EXCEPT FOR NUMBERS 0 AND 6,
    C                          A SOLUTION IS NOT ATTEMPTED.
    C
    C                          = 0  NO ERROR
    C                          = 1  A .GE. B
    C                          = 2  MBDCND .LT. 0 OR MBDCND .GT. 4
    C                          = 3  C .GE. D
    C                          = 4  N .LE. 3
    C                          = 5  NBDCND .LT. 0 OR NBDCND .GT. 4
    C                          = 6  LAMBDA .GT. 0
    C                          = 7  IDIMF .LT. M+1
    C                          = 8  M .LE. 3
    C
    C                          SINCE THIS IS THE ONLY MEANS OF INDICATING
    C                          A POSSIBLY INCORRECT CALL TO HWSCRT, THE
    C                          USER SHOULD TEST IERROR AFTER THE CALL.
    C
    C                        W
    C                          W(1) CONTAINS THE REQUIRED LENGTH OF W.
    C
    C SPECIAL CONDITIONS     NONE
    C
    C I/O                    NONE
    C
    C PRECISION              SINGLE
    C
    C REQUIRED LIBRARY       GENBUN, GNBNAUX, AND COMF
    C FILES                  FROM FISHPAK
    C
    C LANGUAGE               FORTRAN
    C
    C HISTORY                WRITTEN BY ROLAND SWEET AT NCAR IN THE LATE
    C                        1970'S.  RELEASED ON NCAR'S PUBLIC SOFTWARE
    C                        LIBRARIES IN JANUARY 1980.
    C
    C PORTABILITY            FORTRAN 77
    C
    C ALGORITHM              THE ROUTINE DEFINES THE FINITE DIFFERENCE
    C                        EQUATIONS, INCORPORATES BOUNDARY DATA, AND
    C                        ADJUSTS THE RIGHT SIDE OF SINGULAR SYSTEMS
    C                        AND THEN CALLS GENBUN TO SOLVE THE SYSTEM.
    C
    C TIMING                 FOR LARGE  M AND N, THE OPERATION COUNT
    C                        IS ROUGHLY PROPORTIONAL TO
    C                          M*N*(LOG2(N)
    C                        BUT ALSO DEPENDS ON INPUT PARAMETERS NBDCND
    C                        AND MBDCND.
    C
    C ACCURACY               THE SOLUTION PROCESS EMPLOYED RESULTS IN A LOSS
    C                        OF NO MORE THAN THREE SIGNIFICANT DIGITS FOR N
    C                        AND M AS LARGE AS 64.  MORE DETAILS ABOUT
    C                        ACCURACY CAN BE FOUND IN THE DOCUMENTATION FOR
    C                        SUBROUTINE GENBUN WHICH IS THE ROUTINE THAT
    C                        SOLVES THE FINITE DIFFERENCE EQUATIONS.
    C
    C REFERENCES             SWARZTRAUBER,P. AND R. SWEET, "EFFICIENT
    C                        FORTRAN SUBPROGRAMS FOR THE SOLUTION OF
    C                        ELLIPTIC EQUATIONS"
    C                          NCAR TN/IA-109, JULY, 1975, 138 PP.
    C***********************************************************************
          DIMENSION       F(IDIMF,1)
          DIMENSION       BDA(*)     ,BDB(*)     ,BDC(*)     ,BDD(*)     ,
         1                W(*)
    C
    C     CHECK FOR INVALID PARAMETERS.
    C
          IERROR = 0
          IF (A .GE. B) IERROR = 1
          IF (MBDCND.LT.0 .OR. MBDCND.GT.4) IERROR = 2
          IF (C .GE. D) IERROR = 3
          IF (N .LE. 3) IERROR = 4
          IF (NBDCND.LT.0 .OR. NBDCND.GT.4) IERROR = 5
          IF (IDIMF .LT. M+1) IERROR = 7
          IF (M .LE. 3) IERROR = 8
          IF (IERROR .NE. 0) RETURN
          NPEROD = NBDCND
          MPEROD = 0
          IF (MBDCND .GT. 0) MPEROD = 1
          DELTAX = (B-A)/FLOAT(M)
          TWDELX = 2./DELTAX
          DELXSQ = 1./DELTAX**2
          DELTAY = (D-C)/FLOAT(N)
          TWDELY = 2./DELTAY
          DELYSQ = 1./DELTAY**2
          NP = NBDCND+1
          NP1 = N+1
          MP = MBDCND+1
          MP1 = M+1
          NSTART = 1
          NSTOP = N
          NSKIP = 1
          GO TO (104,101,102,103,104),NP
      101 NSTART = 2
          GO TO 104
      102 NSTART = 2
      103 NSTOP = NP1
          NSKIP = 2
      104 NUNK = NSTOP-NSTART+1
    C
    C     ENTER BOUNDARY DATA FOR X-BOUNDARIES.
    C
          MSTART = 1
          MSTOP = M
          MSKIP = 1
          GO TO (117,105,106,109,110),MP
      105 MSTART = 2
          GO TO 107
      106 MSTART = 2
          MSTOP = MP1
          MSKIP = 2
      107 DO 108 J=NSTART,NSTOP
             F(2,J) = F(2,J)-F(1,J)*DELXSQ
      108 CONTINUE
          GO TO 112
      109 MSTOP = MP1
          MSKIP = 2
      110 DO 111 J=NSTART,NSTOP
             F(1,J) = F(1,J)+BDA(J)*TWDELX
      111 CONTINUE
      112 GO TO (113,115),MSKIP
      113 DO 114 J=NSTART,NSTOP
             F(M,J) = F(M,J)-F(MP1,J)*DELXSQ
      114 CONTINUE
          GO TO 117
      115 DO 116 J=NSTART,NSTOP
             F(MP1,J) = F(MP1,J)-BDB(J)*TWDELX
      116 CONTINUE
      117 MUNK = MSTOP-MSTART+1
    C
    C     ENTER BOUNDARY DATA FOR Y-BOUNDARIES.
    C
          GO TO (127,118,118,120,120),NP
      118 DO 119 I=MSTART,MSTOP
             F(I,2) = F(I,2)-F(I,1)*DELYSQ
      119 CONTINUE
          GO TO 122
      120 DO 121 I=MSTART,MSTOP
             F(I,1) = F(I,1)+BDC(I)*TWDELY
      121 CONTINUE
      122 GO TO (123,125),NSKIP
      123 DO 124 I=MSTART,MSTOP
             F(I,N) = F(I,N)-F(I,NP1)*DELYSQ
      124 CONTINUE
          GO TO 127
      125 DO 126 I=MSTART,MSTOP
             F(I,NP1) = F(I,NP1)-BDD(I)*TWDELY
      126 CONTINUE
    C
    C    MULTIPLY RIGHT SIDE BY DELTAY**2.
    C
      127 DELYSQ = DELTAY*DELTAY
          DO 129 I=MSTART,MSTOP
             DO 128 J=NSTART,NSTOP
                F(I,J) = F(I,J)*DELYSQ
      128    CONTINUE
      129 CONTINUE
    C
    C     DEFINE THE A,B,C COEFFICIENTS IN W-ARRAY.
    C
          ID2 = MUNK
          ID3 = ID2+MUNK
          ID4 = ID3+MUNK
          S = DELYSQ*DELXSQ
          ST2 = 2.*S
          DO 130 I=1,MUNK
             W(I) = S
             J = ID2+I
             W(J) = -ST2+ELMBDA*DELYSQ
             J = ID3+I
             W(J) = S
      130 CONTINUE
          IF (MP .EQ. 1) GO TO 131
          W(1) = 0.
          W(ID4) = 0.
      131 CONTINUE
          GO TO (135,135,132,133,134),MP
      132 W(ID2) = ST2
          GO TO 135
      133 W(ID2) = ST2
      134 W(ID3+1) = ST2
      135 CONTINUE
          PERTRB = 0.
          IF (ELMBDA) 144,137,136
      136 IERROR = 6
          GO TO 144
      137 IF ((NBDCND.EQ.0 .OR. NBDCND.EQ.3) .AND.
         1    (MBDCND.EQ.0 .OR. MBDCND.EQ.3)) GO TO 138
          GO TO 144
    C
    C     FOR SINGULAR PROBLEMS MUST ADJUST DATA TO INSURE THAT A SOLUTION
    C     WILL EXIST.
    C
      138 A1 = 1.
          A2 = 1.
          IF (NBDCND .EQ. 3) A2 = 2.
          IF (MBDCND .EQ. 3) A1 = 2.
          S1 = 0.
          MSP1 = MSTART+1
          MSTM1 = MSTOP-1
          NSP1 = NSTART+1
          NSTM1 = NSTOP-1
          DO 140 J=NSP1,NSTM1
             S = 0.
             DO 139 I=MSP1,MSTM1
                S = S+F(I,J)
      139    CONTINUE
             S1 = S1+S*A1+F(MSTART,J)+F(MSTOP,J)
      140 CONTINUE
          S1 = A2*S1
          S = 0.
          DO 141 I=MSP1,MSTM1
             S = S+F(I,NSTART)+F(I,NSTOP)
      141 CONTINUE
          S1 = S1+S*A1+F(MSTART,NSTART)+F(MSTART,NSTOP)+F(MSTOP,NSTART)+
         1     F(MSTOP,NSTOP)
          S = (2.+FLOAT(NUNK-2)*A2)*(2.+FLOAT(MUNK-2)*A1)
          PERTRB = S1/S
          DO 143 J=NSTART,NSTOP
             DO 142 I=MSTART,MSTOP
                F(I,J) = F(I,J)-PERTRB
      142    CONTINUE
      143 CONTINUE
          PERTRB = PERTRB/DELYSQ
    C
    C     SOLVE THE EQUATION.
    C
      144 CALL GENBUN (NPEROD,NUNK,MPEROD,MUNK,W(1),W(ID2+1),W(ID3+1),
         1             IDIMF,F(MSTART,NSTART),IERR1,W(ID4+1))
          W(1) = W(ID4+1)+3.*FLOAT(MUNK)
    C
    C     FILL IN IDENTICAL VALUES WHEN HAVE PERIODIC BOUNDARY CONDITIONS.
    C
          IF (NBDCND .NE. 0) GO TO 146
          DO 145 I=MSTART,MSTOP
             F(I,NP1) = F(I,1)
      145 CONTINUE
      146 IF (MBDCND .NE. 0) GO TO 148
          DO 147 J=NSTART,NSTOP
             F(MP1,J) = F(1,J)
      147 CONTINUE
          IF (NBDCND .EQ. 0) F(MP1,NP1) = F(1,NP1)
      148 CONTINUE
          RETURN
    C
    C REVISION HISTORY---
    C
    C SEPTEMBER 1973    VERSION 1
    C APRIL     1976    VERSION 2
    C JANUARY   1978    VERSION 3
    C DECEMBER  1979    VERSION 3.1
    C FEBRUARY  1985    DOCUMENTATION UPGRADE
    C NOVEMBER  1988    VERSION 3.2, FORTRAN 77 CHANGES
    C-----------------------------------------------------------------------
          END

HWSCSP

          SUBROUTINE HWSCSP (INTL,TS,TF,M,MBDCND,BDTS,BDTF,RS,RF,N,NBDCND,
         1                   BDRS,BDRF,ELMBDA,F,IDIMF,PERTRB,IERROR,W)
    C
    C     * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
    C     *                                                               *
    C     *                  copyright (c) 1999 by UCAR                   *
    C     *                                                               *
    C     *       UNIVERSITY CORPORATION for ATMOSPHERIC RESEARCH         *
    C     *                                                               *
    C     *                      all rights reserved                      *
    C     *                                                               *
    C     *                      FISHPACK version 4.1                     *
    C     *                                                               *
    C     *     A PACKAGE OF FORTRAN SUBPROGRAMS FOR THE SOLUTION OF      *
    C     *                                                               *
    C     *      SEPARABLE ELLIPTIC PARTIAL DIFFERENTIAL EQUATIONS        *
    C     *                                                               *
    C     *                             BY                                *
    C     *                                                               *
    C     *        JOHN ADAMS, PAUL SWARZTRAUBER AND ROLAND SWEET         *
    C     *                                                               *
    C     *                             OF                                *
    C     *                                                               *
    C     *         THE NATIONAL CENTER FOR ATMOSPHERIC RESEARCH          *
    C     *                                                               *
    C     *                BOULDER, COLORADO  (80307)  U.S.A.             *
    C     *                                                               *
    C     *                   WHICH IS SPONSORED BY                       *
    C     *                                                               *
    C     *              THE NATIONAL SCIENCE FOUNDATION                  *
    C     *                                                               *
    C     * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
    C
    C
    C
    C DIMENSION OF           BDTS(N+1),     BDTF(N+1), BDRS(M+1), BDRF(M+1),
    C ARGUMENTS              F(IDIMF,N+1),  W(SEE ARGUMENT LIST)
    C
    C LATEST REVISION        NOVEMBER 1988
    C
    C PURPOSE                SOLVES A FINITE DIFFERENCE APPROXIMATION
    C                        TO THE MODIFIED HELMHOLTZ EQUATION IN
    C                        SPHERICAL COORDINATES ASSUMING AXISYMMETRY
    C                        (NO DEPENDENCE ON LONGITUDE).  THE EQUATION
    C                        IS
    C
    C                          (1/R**2)(D/DR)((R**2)(D/DR)U) +
    C
    C                          (1/(R**2)SIN(THETA))(D/DTHETA)
    C
    C                          (SIN(THETA)(D/DTHETA)U) +
    C
    C                          (LAMBDA/(RSIN(THETA))**2)U = F(THETA,R).
    C
    C                        THIS TWO DIMENSIONAL MODIFIED HELMHOLTZ
    C                        EQUATION RESULTS FROM THE FOURIER TRANSFORM
    C                        OF THE THREE DIMENSIONAL POISSON EQUATION.
    C
    C USAGE                  CALL HWSCSP (INTL,TS,TF,M,MBDCND,BDTS,BDTF,
    C                                     RS,RF,N,NBDCND,BDRS,BDRF,ELMBDA,
    C                                     F,IDIMF,PERTRB,IERROR,W)
    C
    C ARGUMENTS
    C ON INPUT               INTL
    C                          = 0  ON INITIAL ENTRY TO HWSCSP OR IF ANY
    C                               OF THE ARGUMENTS RS, RF, N, NBDCND
    C                               ARE CHANGED FROM A PREVIOUS CALL.
    C                          = 1  IF RS, RF, N, NBDCND ARE ALL UNCHANGED
    C                               FROM PREVIOUS CALL TO HWSCSP.
    C
    C                          NOTE:
    C                          A CALL WITH INTL=0 TAKES APPROXIMATELY
    C                          1.5 TIMES AS MUCH TIME AS A CALL WITH
    C                          INTL = 1  .  ONCE A CALL WITH INTL = 0
    C                          HAS BEEN MADE THEN SUBSEQUENT SOLUTIONS
    C                          CORRESPONDING TO DIFFERENT F, BDTS, BDTF,
    C                          BDRS, BDRF CAN BE OBTAINED FASTER WITH
    C                          INTL = 1 SINCE INITIALIZATION IS NOT
    C                          REPEATED.
    C
    C                        TS,TF
    C                          THE RANGE OF THETA (COLATITUDE), I.E.,
    C                          TS .LE. THETA .LE. TF. TS MUST BE LESS
    C                          THAN TF.  TS AND TF ARE IN RADIANS. A TS OF
    C                          ZERO CORRESPONDS TO THE NORTH POLE AND A
    C                          TF OF PI CORRESPONDS TO THE SOUTH POLE.
    C
    C                          **** IMPORTANT ****
    C
    C                          IF TF IS EQUAL TO PI THEN IT MUST BE
    C                          COMPUTED USING THE STATEMENT
    C                          TF = PIMACH(DUM). THIS INSURES THAT TF
    C                          IN THE USER'S PROGRAM IS EQUAL TO PI IN
    C                          THIS PROGRAM WHICH PERMITS SEVERAL TESTS
    C                          OF THE  INPUT PARAMETERS THAT OTHERWISE
    C                          WOULD NOT BE POSSIBLE.
    C
    C                        M
    C                          THE NUMBER OF PANELS INTO WHICH THE
    C                          INTERVAL (TS,TF) IS SUBDIVIDED.
    C                          HENCE, THERE WILL BE M+1 GRID POINTS
    C                          IN THE THETA-DIRECTION GIVEN BY
    C                          THETA(K) = (I-1)DTHETA+TS FOR
    C                          I = 1,2,...,M+1, WHERE DTHETA = (TF-TS)/M
    C                          IS THE PANEL WIDTH.
    C
    C                        MBDCND
    C                          INDICATES THE TYPE OF BOUNDARY CONDITION
    C                          AT THETA = TS AND  THETA = TF.
    C
    C                          = 1  IF THE SOLUTION IS SPECIFIED AT
    C                               THETA = TS AND THETA = TF.
    C                          = 2  IF THE SOLUTION IS SPECIFIED AT
    C                               THETA = TS AND THE DERIVATIVE OF THE
    C                               SOLUTION WITH RESPECT TO THETA IS
    C                               SPECIFIED AT THETA = TF
    C                               (SEE NOTE 2 BELOW).
    C                          = 3  IF THE DERIVATIVE OF THE SOLUTION
    C                               WITH RESPECT TO THETA IS SPECIFIED
    C                               AT THETA = TS AND THETA = TF
    C                               (SEE NOTES 1,2 BELOW).
    C                          = 4  IF THE DERIVATIVE OF THE SOLUTION
    C                               WITH RESPECT TO THETA IS SPECIFIED
    C                               AT THETA = TS (SEE NOTE 1 BELOW) AND
    C                               SOLUTION IS SPECIFIED AT THETA = TF.
    C                          = 5  IF THE SOLUTION IS UNSPECIFIED AT
    C                               THETA = TS = 0 AND THE SOLUTION IS
    C                                SPECIFIED AT THETA = TF.
    C                          = 6  IF THE SOLUTION IS UNSPECIFIED AT
    C                               THETA = TS = 0 AND THE DERIVATIVE
    C                               OF THE SOLUTION WITH RESPECT TO THETA
    C                               IS SPECIFIED AT THETA = TF
    C                               (SEE NOTE 2 BELOW).
    C                          = 7  IF THE SOLUTION IS SPECIFIED AT
    C                               THETA = TS AND THE SOLUTION IS
    C                                UNSPECIFIED AT THETA = TF = PI.
    C                          = 8  IF THE DERIVATIVE OF THE SOLUTION
    C                               WITH RESPECT TO THETA IS SPECIFIED
    C                               AT THETA = TS (SEE NOTE 1 BELOW)
    C                               AND THE SOLUTION IS UNSPECIFIED AT
    C                               THETA = TF = PI.
    C                          = 9  IF THE SOLUTION IS UNSPECIFIED AT
    C                               THETA = TS = 0 AND THETA = TF = PI.
    C
    C                          NOTE 1:
    C                          IF TS = 0, DO NOT USE MBDCND = 3,4, OR 8,
    C                          BUT INSTEAD USE MBDCND = 5,6, OR 9  .
    C
    C                          NOTE 2:
    C                          IF TF = PI, DO NOT USE MBDCND = 2,3, OR 6,
    C                          BUT INSTEAD USE MBDCND = 7,8, OR 9  .
    C
    C                        BDTS
    C                          A ONE-DIMENSIONAL ARRAY OF LENGTH N+1 THAT
    C                          SPECIFIES THE VALUES OF THE DERIVATIVE OF
    C                          THE SOLUTION WITH RESPECT TO THETA AT
    C                          THETA = TS.  WHEN MBDCND = 3,4, OR 8,
    C
    C                            BDTS(J) = (D/DTHETA)U(TS,R(J)),
    C                            J = 1,2,...,N+1  .
    C
    C                          WHEN MBDCND HAS ANY OTHER VALUE, BDTS IS
    C                          A DUMMY VARIABLE.
    C
    C                        BDTF
    C                          A ONE-DIMENSIONAL ARRAY OF LENGTH N+1 THAT
    C                          SPECIFIES THE VALUES OF THE DERIVATIVE OF
    C                          THE SOLUTION WITH RESPECT TO THETA AT
    C                          THETA = TF.  WHEN MBDCND = 2,3, OR 6,
    C
    C                          BDTF(J) = (D/DTHETA)U(TF,R(J)),
    C                          J = 1,2,...,N+1  .
    C
    C                          WHEN MBDCND HAS ANY OTHER VALUE, BDTF IS
    C                          A DUMMY VARIABLE.
    C
    C                        RS,RF
    C                          THE RANGE OF R, I.E., RS .LE. R .LT. RF.
    C                          RS MUST BE LESS THAN RF.  RS MUST BE
    C                          NON-NEGATIVE.
    C
    C                        N
    C                          THE NUMBER OF PANELS INTO WHICH THE
    C                          INTERVAL (RS,RF) IS SUBDIVIDED.
    C                          HENCE, THERE WILL BE N+1 GRID POINTS IN THE
    C                          R-DIRECTION GIVEN BY R(J) = (J-1)DR+RS
    C                          FOR J = 1,2,...,N+1, WHERE DR = (RF-RS)/N
    C                          IS THE PANEL WIDTH.
    C                          N MUST BE GREATER THAN 2
    C
    C                        NBDCND
    C                          INDICATES THE TYPE OF BOUNDARY CONDITION
    C                          AT R = RS AND R = RF.
    C
    C                          = 1  IF THE SOLUTION IS SPECIFIED AT
    C                               R = RS AND R = RF.
    C                          = 2  IF THE SOLUTION IS SPECIFIED AT
    C                               R = RS AND THE DERIVATIVE
    C                               OF THE SOLUTION WITH RESPECT TO R
    C                               IS SPECIFIED AT R = RF.
    C                          = 3  IF THE DERIVATIVE OF THE SOLUTION
    C                               WITH RESPECT TO R IS SPECIFIED AT
    C                               R = RS AND R = RF.
    C                          = 4  IF THE DERIVATIVE OF THE SOLUTION
    C                               WITH RESPECT TO R IS SPECIFIED AT
    C                               RS AND THE SOLUTION IS SPECIFIED AT
    C                               R = RF.
    C                          = 5  IF THE SOLUTION IS UNSPECIFIED AT
    C                               R = RS = 0 (SEE NOTE BELOW)  AND THE
    C                               SOLUTION IS SPECIFIED AT R = RF.
    C                          = 6  IF THE SOLUTION IS UNSPECIFIED AT
    C                               R = RS = 0 (SEE NOTE BELOW) AND THE
    C                               DERIVATIVE OF THE SOLUTION WITH
    C                               RESPECT TO R IS SPECIFIED AT R = RF.
    C
    C                          NOTE:
    C                          NBDCND = 5 OR 6 CANNOT BE USED WITH
    C                          MBDCND = 1,2,4,5, OR 7.  THE FORMER
    C                          INDICATES THAT THE SOLUTION IS UNSPECIFIED
    C                          AT R = 0, THE LATTER INDICATES THAT THE
    C                          SOLUTION IS SPECIFIED).
    C                          USE INSTEAD   NBDCND = 1 OR 2  .
    C
    C                        BDRS
    C                          A ONE-DIMENSIONAL ARRAY OF LENGTH M+1 THAT
    C                          SPECIFIES THE VALUES OF THE DERIVATIVE OF
    C                          THE SOLUTION WITH RESPECT TO R AT R = RS.
    C
    C                          WHEN NBDCND = 3 OR 4,
    C                            BDRS(I) = (D/DR)U(THETA(I),RS),
    C                            I = 1,2,...,M+1  .
    C
    C                          WHEN NBDCND HAS ANY OTHER VALUE, BDRS IS
    C                          A DUMMY VARIABLE.
    C
    C                        BDRF
    C                          A ONE-DIMENSIONAL ARRAY OF LENGTH M+1
    C                          THAT SPECIFIES THE VALUES OF THE
    C                          DERIVATIVE OF THE SOLUTION WITH RESPECT
    C                          TO R AT R = RF.
    C
    C                          WHEN NBDCND = 2,3, OR 6,
    C                            BDRF(I) = (D/DR)U(THETA(I),RF),
    C                            I = 1,2,...,M+1  .
    C
    C                          WHEN NBDCND HAS ANY OTHER VALUE, BDRF IS
    C                          A DUMMY VARIABLE.
    C
    C                        ELMBDA
    C                          THE CONSTANT LAMBDA IN THE HELMHOLTZ
    C                          EQUATION.  IF LAMBDA .GT. 0, A SOLUTION
    C                          MAY NOT EXIST.  HOWEVER, HWSCSP WILL
    C                          ATTEMPT TO FIND A SOLUTION.  IF NBDCND = 5
    C                          OR 6 OR  MBDCND = 5,6,7,8, OR 9, ELMBDA
    C                          MUST BE ZERO.
    C
    C                        F
    C                          A TWO-DIMENSIONAL ARRAY, OF DIMENSION AT
    C                          LEAST (M+1)*(N+1), SPECIFYING VALUES OF THE
    C                          RIGHT SIDE OF THE HELMHOLTZ EQUATION AND
    C                          BOUNDARY VALUES (IF ANY).
    C
    C                          ON THE INTERIOR, F IS DEFINED AS FOLLOWS:
    C                          FOR I = 2,3,...,M AND J = 2,3,...,N
    C                          F(I,J) = F(THETA(I),R(J)).
    C
    C                          ON THE BOUNDARIES, F IS DEFINED AS FOLLOWS:
    C                          FOR J=1,2,...,N+1,  I=1,2,...,M+1,
    C
    C                          MBDCND   F(1,J)            F(M+1,J)
    C                          ------   ----------        ----------
    C
    C                            1      U(TS,R(J))        U(TF,R(J))
    C                            2      U(TS,R(J))        F(TF,R(J))
    C                            3      F(TS,R(J))        F(TF,R(J))
    C                            4      F(TS,R(J))        U(TF,R(J))
    C                            5      F(0,R(J))         U(TF,R(J))
    C                            6      F(0,R(J))         F(TF,R(J))
    C                            7      U(TS,R(J))        F(PI,R(J))
    C                            8      F(TS,R(J))        F(PI,R(J))
    C                            9      F(0,R(J))         F(PI,R(J))
    C
    C                            NBDCND   F(I,1)            F(I,N+1)
    C                            ------   --------------    --------------
    C
    C                              1      U(THETA(I),RS)    U(THETA(I),RF)
    C                              2      U(THETA(I),RS)    F(THETA(I),RF)
    C                              3      F(THETA(I),RS)    F(THETA(I),RF)
    C                              4      F(THETA(I),RS)    U(THETA(I),RF)
    C                              5      F(TS,0)           U(THETA(I),RF)
    C                              6      F(TS,0)           F(THETA(I),RF)
    C
    C                          NOTE:
    C                          IF THE TABLE CALLS FOR BOTH THE SOLUTION
    C                          U AND THE RIGHT SIDE F AT A CORNER THEN
    C                          THE SOLUTION MUST BE SPECIFIED.
    C
    C                        IDIMF
    C                          THE ROW (OR FIRST) DIMENSION OF THE ARRAY
    C                          F AS IT APPEARS IN THE PROGRAM CALLING
    C                          HWSCSP.  THIS PARAMETER IS USED TO SPECIFY
    C                          THE VARIABLE DIMENSION OF F.  IDIMF MUST
    C                          BE AT LEAST M+1  .
    C
    C                        W
    C                          A ONE-DIMENSIONAL ARRAY THAT MUST BE
    C                          PROVIDED BY THE USER FOR WORK SPACE.
    C                          ITS LENGTH CAN BE COMPUTED FROM THE
    C                          FORMULA BELOW WHICH DEPENDS ON THE VALUE
    C                          OF NBDCND
    C
    C                          IF NBDCND=2,4 OR 6 DEFINE NUNK=N
    C                          IF NBDCND=1 OR 5   DEFINE NUNK=N-1
    C                          IF NBDCND=3        DEFINE NUNK=N+1
    C
    C                          NOW SET K=INT(LOG2(NUNK))+1 AND
    C                          L=2**(K+1) THEN W MUST BE DIMENSIONED
    C                          AT LEAST (K-2)*L+K+5*(M+N)+MAX(2*N,6*M)+23
    C
    C                          **IMPORTANT**
    C                          FOR PURPOSES OF CHECKING, THE REQUIRED
    C                          LENGTH OF W IS COMPUTED BY HWSCSP AND
    C                          STORED IN W(1) IN FLOATING POINT FORMAT.
    C
    C ON OUTPUT              F
    C                          CONTAINS THE SOLUTION U(I,J) OF THE FINITE
    C                          DIFFERENCE APPROXIMATION FOR THE GRID POINT
    C                          (THETA(I),R(J)),  I = 1,2,...,M+1,
    C                                            J = 1,2,...,N+1  .
    C
    C                        PERTRB
    C                          IF A COMBINATION OF PERIODIC OR DERIVATIVE
    C                          BOUNDARY CONDITIONS IS SPECIFIED FOR A
    C                          POISSON EQUATION (LAMBDA = 0), A SOLUTION
    C                          MAY NOT EXIST.  PERTRB IS A CONSTANT,
    C                          CALCULATED AND SUBTRACTED FROM F, WHICH
    C                          ENSURES THAT A SOLUTION EXISTS.  HWSCSP
    C                          THEN COMPUTES THIS SOLUTION, WHICH IS A
    C                          LEAST SQUARES SOLUTION TO THE ORIGINAL
    C                          APPROXIMATION. THIS SOLUTION IS NOT UNIQUE
    C                          AND IS UNNORMALIZED. THE VALUE OF PERTRB
    C                          SHOULD BE SMALL COMPARED TO THE RIGHT SIDE
    C                          F. OTHERWISE , A SOLUTION IS OBTAINED TO
    C                          AN ESSENTIALLY DIFFERENT PROBLEM. THIS
    C                          COMPARISON SHOULD ALWAYS BE MADE TO INSURE
    C                          THAT A MEANINGFUL SOLUTION HAS BEEN OBTAINED.
    C
    C                        IERROR
    C                          AN ERROR FLAG THAT INDICATES INVALID INPUT
    C                          PARAMETERS.  EXCEPT FOR NUMBERS 0 AND 10,
    C                          A SOLUTION IS NOT ATTEMPTED.
    C
    C                          = 1  TS.LT.0. OR TF.GT.PI
    C                          = 2  TS.GE.TF
    C                          = 3  M.LT.5
    C                          = 4  MBDCND.LT.1 OR MBDCND.GT.9
    C                          = 5  RS.LT.0
    C                          = 6  RS.GE.RF
    C                          = 7  N.LT.5
    C                          = 8  NBDCND.LT.1 OR NBDCND.GT.6
    C                          = 9  ELMBDA.GT.0
    C                          = 10 IDIMF.LT.M+1
    C                          = 11 ELMBDA.NE.0 AND MBDCND.GE.5
    C                          = 12 ELMBDA.NE.0 AND NBDCND EQUALS 5 OR 6
    C                          = 13 MBDCND EQUALS 5,6 OR 9 AND TS.NE.0
    C                          = 14 MBDCND.GE.7 AND TF.NE.PI
    C                          = 15 TS.EQ.0 AND MBDCND EQUALS 3,4 OR 8
    C                          = 16 TF.EQ.PI AND MBDCND EQUALS 2,3 OR 6
    C                          = 17 NBDCND.GE.5 AND RS.NE.0
    C                          = 18 NBDCND.GE.5 AND MBDCND EQUALS 1,2,4,5 OR
    C
    C                          SINCE THIS IS THE ONLY MEANS OF INDICATING
    C                          A POSSLIBY INCORRECT CALL TO HWSCSP, THE
    C                          USER SHOULD TEST IERROR AFTER A CALL.
    C
    C                        W
    C                          CONTAINS INTERMEDIATE VALUES THAT MUST NOT
    C                          BE DESTROYED IF HWSCSP WILL BE CALLED AGAIN
    C                          WITH INTL = 1.  W(1) CONTAINS THE NUMBER
    C                          OF LOCATIONS WHICH W MUST HAVE
    C
    C SPECIAL CONDITIONS     NONE
    C
    C I/O                    NONE
    C
    C PRECISION              SINGLE
    C
    C REQUIRED LIBRARY       BLKTRI, AND COMF FROM FISHPAK
    C FILES
    C
    C LANGUAGE               FORTRAN
    C
    C HISTORY                WRITTEN BY ROLAND SWEET AT NCAR IN THE LATE
    C                        1970'S.  RELEASED ON NCAR'S PUBLIC SOFTWARE
    C                        LIBRARIES IN JANUARY 1980.
    C
    C PORTABILITY            FORTRAN 77.
    C
    C ALGORITHM              THE ROUTINE DEFINES THE FINITE DIFFERENCE
    C                        EQUATIONS, INCORPORATES BOUNDARY DATA, AND
    C                        ADJUSTS THE RIGHT SIDE OF SINGULAR SYSTEMS
    C                        AND THEN CALLS BLKTRI TO SOLVE THE SYSTEM.
    C
    C REFERENCES             SWARZTRAUBER,P. AND R. SWEET, "EFFICIENT
    C                        FORTRAN SUBPROGRAMS FOR THE SOLUTION OF
    C                        ELLIPTIC EQUATIONS"
    C                          NCAR TN/IA-109, JULY, 1975, 138 PP.
    C***********************************************************************

HWSCYL

          SUBROUTINE HWSCYL (A,B,M,MBDCND,BDA,BDB,C,D,N,NBDCND,BDC,BDD,
         1                   ELMBDA,F,IDIMF,PERTRB,IERROR,W)
    C
    C     * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
    C     *                                                               *
    C     *                  copyright (c) 1999 by UCAR                   *
    C     *                                                               *
    C     *       UNIVERSITY CORPORATION for ATMOSPHERIC RESEARCH         *
    C     *                                                               *
    C     *                      all rights reserved                      *
    C     *                                                               *
    C     *                      FISHPACK version 4.1                     *
    C     *                                                               *
    C     *     A PACKAGE OF FORTRAN SUBPROGRAMS FOR THE SOLUTION OF      *
    C     *                                                               *
    C     *      SEPARABLE ELLIPTIC PARTIAL DIFFERENTIAL EQUATIONS        *
    C     *                                                               *
    C     *                             BY                                *
    C     *                                                               *
    C     *        JOHN ADAMS, PAUL SWARZTRAUBER AND ROLAND SWEET         *
    C     *                                                               *
    C     *                             OF                                *
    C     *                                                               *
    C     *         THE NATIONAL CENTER FOR ATMOSPHERIC RESEARCH          *
    C     *                                                               *
    C     *                BOULDER, COLORADO  (80307)  U.S.A.             *
    C     *                                                               *
    C     *                   WHICH IS SPONSORED BY                       *
    C     *                                                               *
    C     *              THE NATIONAL SCIENCE FOUNDATION                  *
    C     *                                                               *
    C     * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
    C
    C
    C
    C DIMENSION OF           BDA(N),BDB(N),BDC(M),BDD(M),F(IDIMF,N+1),
    C ARGUMENTS              W(SEE ARGUMENT LIST)
    C
    C LATEST REVISION        NOVEMBER 1988
    C
    C PURPOSE                SOLVES A FINITE DIFFERENCE APPROXIMATION
    C                        TO THE HELMHOLTZ EQUATION IN CYLINDRICAL
    C                        COORDINATES.  THIS MODIFIED HELMHOLTZ EQUATION
    C
    C                          (1/R)(D/DR)(R(DU/DR)) + (D/DZ)(DU/DZ)
    C
    C                          + (LAMBDA/R**2)U = F(R,Z)
    C
    C                        RESULTS FROM THE FOURIER TRANSFORM OF THE
    C                        THREE-DIMENSIONAL POISSON EQUATION.
    C
    C USAGE                  CALL HWSCYL (A,B,M,MBDCND,BDA,BDB,C,D,N,
    C                                     NBDCND,BDC,BDD,ELMBDA,F,IDIMF,
    C                                     PERTRB,IERROR,W)
    C
    C ARGUMENTS
    C ON INPUT               A,B
    C                          THE RANGE OF R, I.E., A .LE. R .LE. B.
    C                          A MUST BE LESS THAN B AND A MUST BE
    C                          NON-NEGATIVE.
    C
    C                        M
    C                          THE NUMBER OF PANELS INTO WHICH THE
    C                          INTERVAL (A,B) IS SUBDIVIDED.  HENCE,
    C                          THERE WILL BE M+1 GRID POINTS IN THE
    C                          R-DIRECTION GIVEN BY R(I) = A+(I-1)DR,
    C                          FOR I = 1,2,...,M+1, WHERE DR = (B-A)/M
    C                          IS THE PANEL WIDTH. M MUST BE GREATER
    C                          THAN 3.
    C
    C                        MBDCND
    C                          INDICATES THE TYPE OF BOUNDARY CONDITIONS
    C                          AT R = A AND R = B.
    C
    C                          = 1  IF THE SOLUTION IS SPECIFIED AT
    C                               R = A AND R = B.
    C                          = 2  IF THE SOLUTION IS SPECIFIED AT
    C                               R = A AND THE DERIVATIVE OF THE
    C                               SOLUTION WITH RESPECT TO R IS
    C                               SPECIFIED AT R = B.
    C                          = 3  IF THE DERIVATIVE OF THE SOLUTION
    C                               WITH RESPECT TO R IS SPECIFIED AT
    C                               R = A (SEE NOTE BELOW) AND R = B.
    C                          = 4  IF THE DERIVATIVE OF THE SOLUTION
    C                               WITH RESPECT TO R IS SPECIFIED AT
    C                               R = A (SEE NOTE BELOW) AND THE
    C                               SOLUTION IS SPECIFIED AT R = B.
    C                          = 5  IF THE SOLUTION IS UNSPECIFIED AT
    C                               R = A = 0 AND THE SOLUTION IS
    C                               SPECIFIED AT R = B.
    C                          = 6  IF THE SOLUTION IS UNSPECIFIED AT
    C                               R = A = 0 AND THE DERIVATIVE OF THE
    C                               SOLUTION WITH RESPECT TO R IS SPECIFIED
    C                               AT R = B.
    C
    C                          IF A = 0, DO NOT USE MBDCND = 3 OR 4,
    C                          BUT INSTEAD USE MBDCND = 1,2,5, OR 6  .
    C
    C                        BDA
    C                          A ONE-DIMENSIONAL ARRAY OF LENGTH N+1 THAT
    C                          SPECIFIES THE VALUES OF THE DERIVATIVE OF
    C                          THE SOLUTION WITH RESPECT TO R AT R = A.
    C
    C                          WHEN MBDCND = 3 OR 4,
    C                            BDA(J) = (D/DR)U(A,Z(J)), J = 1,2,...,N+1.
    C
    C                          WHEN MBDCND HAS ANY OTHER VALUE, BDA IS
    C                          A DUMMY VARIABLE.
    C
    C                        BDB
    C                          A ONE-DIMENSIONAL ARRAY OF LENGTH N+1 THAT
    C                          SPECIFIES THE VALUES OF THE DERIVATIVE
    C                          OF THE SOLUTION WITH RESPECT TO R AT R = B.
    C
    C                          WHEN MBDCND = 2,3, OR 6,
    C                            BDB(J) = (D/DR)U(B,Z(J)), J = 1,2,...,N+1.
    C
    C                          WHEN MBDCND HAS ANY OTHER VALUE, BDB IS
    C                          A DUMMY VARIABLE.
    C
    C                        C,D
    C                          THE RANGE OF Z, I.E., C .LE. Z .LE. D.
    C                          C MUST BE LESS THAN D.
    C
    C                        N
    C                          THE NUMBER OF PANELS INTO WHICH THE
    C                          INTERVAL (C,D) IS SUBDIVIDED.  HENCE,
    C                          THERE WILL BE N+1 GRID POINTS IN THE
    C                          Z-DIRECTION GIVEN BY Z(J) = C+(J-1)DZ,
    C                          FOR J = 1,2,...,N+1,
    C                          WHERE DZ = (D-C)/N IS THE PANEL WIDTH.
    C                          N MUST BE GREATER THAN 3.
    C
    C                        NBDCND
    C                          INDICATES THE TYPE OF BOUNDARY CONDITIONS
    C                          AT Z = C AND Z = D.
    C
    C                          = 0  IF THE SOLUTION IS PERIODIC IN Z,
    C                               I.E., U(I,1) = U(I,N+1).
    C                          = 1  IF THE SOLUTION IS SPECIFIED AT
    C                               Z = C AND Z = D.
    C                          = 2  IF THE SOLUTION IS SPECIFIED AT
    C                               Z = C AND THE DERIVATIVE OF
    C                               THE SOLUTION WITH RESPECT TO Z IS
    C                               SPECIFIED AT Z = D.
    C                          = 3  IF THE DERIVATIVE OF THE SOLUTION
    C                               WITH RESPECT TO Z IS
    C                               SPECIFIED AT Z = C AND Z = D.
    C                          = 4  IF THE DERIVATIVE OF THE SOLUTION
    C                               WITH RESPECT TO Z IS SPECIFIED AT
    C                               Z = C AND THE SOLUTION IS SPECIFIED
    C                               AT Z = D.
    C
    C                        BDC
    C                          A ONE-DIMENSIONAL ARRAY OF LENGTH M+1 THAT
    C                          SPECIFIES THE VALUES OF THE DERIVATIVE
    C                          OF THE SOLUTION WITH RESPECT TO Z AT Z = C.
    C
    C                          WHEN NBDCND = 3 OR 4,
    C                            BDC(I) = (D/DZ)U(R(I),C), I = 1,2,...,M+1.
    C
    C                          WHEN NBDCND HAS ANY OTHER VALUE, BDC IS
    C                          A DUMMY VARIABLE.
    C
    C                        BDD
    C                          A ONE-DIMENSIONAL ARRAY OF LENGTH M+1 THAT
    C                          SPECIFIES THE VALUES OF THE DERIVATIVE OF
    C                          THE SOLUTION WITH RESPECT TO Z AT Z = D.
    C
    C                          WHEN NBDCND = 2 OR 3,
    C                            BDD(I) = (D/DZ)U(R(I),D), I = 1,2,...,M+1
    C
    C                          WHEN NBDCND HAS ANY OTHER VALUE, BDD IS
    C                          A DUMMY VARIABLE.
    C
    C                        ELMBDA
    C                          THE CONSTANT LAMBDA IN THE HELMHOLTZ
    C                          EQUATION.  IF LAMBDA .GT. 0, A SOLUTION
    C                          MAY NOT EXIST.  HOWEVER, HWSCYL WILL
    C                          ATTEMPT TO FIND A SOLUTION.  LAMBDA MUST
    C                          BE ZERO WHEN MBDCND = 5 OR 6  .
    C
    C                        F
    C                          A TWO-DIMENSIONAL ARRAY, OF DIMENSION AT
    C                          LEAST (M+1)*(N+1), SPECIFYING VALUES
    C                          OF THE RIGHT SIDE OF THE HELMHOLTZ
    C                          EQUATION AND BOUNDARY DATA (IF ANY).
    C
    C                          ON THE INTERIOR, F IS DEFINED AS FOLLOWS:
    C                          FOR I = 2,3,...,M AND J = 2,3,...,N
    C                          F(I,J) = F(R(I),Z(J)).
    C
    C                          ON THE BOUNDARIES F IS DEFINED AS FOLLOWS:
    C                          FOR J = 1,2,...,N+1 AND I = 1,2,...,M+1
    C
    C                          MBDCND   F(1,J)            F(M+1,J)
    C                          ------   ---------         ---------
    C
    C                            1      U(A,Z(J))         U(B,Z(J))
    C                            2      U(A,Z(J))         F(B,Z(J))
    C                            3      F(A,Z(J))         F(B,Z(J))
    C                            4      F(A,Z(J))         U(B,Z(J))
    C                            5      F(0,Z(J))         U(B,Z(J))
    C                            6      F(0,Z(J))         F(B,Z(J))
    C
    C                          NBDCND   F(I,1)            F(I,N+1)
    C                          ------   ---------         ---------
    C
    C                            0      F(R(I),C)         F(R(I),C)
    C                            1      U(R(I),C)         U(R(I),D)
    C                            2      U(R(I),C)         F(R(I),D)
    C                            3      F(R(I),C)         F(R(I),D)
    C                            4      F(R(I),C)         U(R(I),D)
    C
    C                          NOTE:
    C                          IF THE TABLE CALLS FOR BOTH THE SOLUTION
    C                          U AND THE RIGHT SIDE F AT A CORNER THEN
    C                          THE SOLUTION MUST BE SPECIFIED.
    C
    C                        IDIMF
    C                          THE ROW (OR FIRST) DIMENSION OF THE ARRAY
    C                          F AS IT APPEARS IN THE PROGRAM CALLING
    C                          HWSCYL.  THIS PARAMETER IS USED TO SPECIFY
    C                          THE VARIABLE DIMENSION OF F.  IDIMF MUST
    C                          BE AT LEAST M+1  .
    C
    C                        W
    C                          A ONE-DIMENSIONAL ARRAY THAT MUST BE
    C                          PROVIDED BY THE USER FOR WORK SPACE.
    C                          W MAY REQUIRE UP TO 4*(N+1) +
    C                          (13 + INT(LOG2(N+1)))*(M+1) LOCATIONS.
    C                          THE ACTUAL NUMBER OF LOCATIONS USED IS
    C                          COMPUTED BY HWSCYL AND IS RETURNED IN
    C                          LOCATION W(1).
    C
    C
    C ON OUTPUT              F
    C                          CONTAINS THE SOLUTION U(I,J) OF THE FINITE
    C                          DIFFERENCE APPROXIMATION FOR THE GRID POINT
    C                          (R(I),Z(J)), I =1,2,...,M+1, J =1,2,...,N+1.
    C
    C                        PERTRB
    C                          IF ONE SPECIFIES A COMBINATION OF PERIODIC,
    C                          DERIVATIVE, AND UNSPECIFIED BOUNDARY
    C                          CONDITIONS FOR A POISSON EQUATION
    C                          (LAMBDA = 0), A SOLUTION MAY NOT EXIST.
    C                          PERTRB IS A CONSTANT, CALCULATED AND
    C                          SUBTRACTED FROM F, WHICH ENSURES THAT A
    C                          SOLUTION EXISTS.  HWSCYL THEN COMPUTES
    C                          THIS SOLUTION, WHICH IS A LEAST SQUARES
    C                          SOLUTION TO THE ORIGINAL APPROXIMATION.
    C                          THIS SOLUTION PLUS ANY CONSTANT IS ALSO
    C                          A SOLUTION.  HENCE, THE SOLUTION IS NOT
    C                          UNIQUE. THE VALUE OF PERTRB SHOULD BE
    C                          SMALL COMPARED TO THE RIGHT SIDE F.
    C                          OTHERWISE, A SOLUTION IS OBTAINED TO AN
    C                          ESSENTIALLY DIFFERENT PROBLEM.  THIS
    C                          COMPARISON SHOULD ALWAYS BE MADE TO INSURE
    C                          THAT A MEANINGFUL SOLUTION HAS BEEN OBTAINED.
    C
    C                        IERROR
    C                          AN ERROR FLAG WHICH INDICATES INVALID INPUT
    C                          PARAMETERS.  EXCEPT FOR NUMBERS 0 AND 11,
    C                          A SOLUTION IS NOT ATTEMPTED.
    C
    C                          =  0  NO ERROR.
    C                          =  1  A .LT. 0  .
    C                          =  2  A .GE. B.
    C                          =  3  MBDCND .LT. 1 OR MBDCND .GT. 6  .
    C                          =  4  C .GE. D.
    C                          =  5  N .LE. 3
    C                          =  6  NBDCND .LT. 0 OR NBDCND .GT. 4  .
    C                          =  7  A = 0, MBDCND = 3 OR 4  .
    C                          =  8  A .GT. 0, MBDCND .GE. 5  .
    C                          =  9  A = 0, LAMBDA .NE. 0, MBDCND .GE. 5  .
    C                          = 10  IDIMF .LT. M+1  .
    C                          = 11  LAMBDA .GT. 0  .
    C                          = 12  M .LE. 3
    C
    C                          SINCE THIS IS THE ONLY MEANS OF INDICATING
    C                          A POSSIBLY INCORRECT CALL TO HWSCYL, THE
    C                          USER SHOULD TEST IERROR AFTER THE CALL.
    C
    C                        W
    C                          W(1) CONTAINS THE REQUIRED LENGTH OF W.
    C
    C SPECIAL CONDITIONS     NONE
    C
    C I/O                    NONE
    C
    C PRECISION              SINGLE
    C
    C REQUIRED LIBRARY       GENBUN, GNBNAUX, AND COMF
    C FILES                  FROM FISHPAK
    C
    C LANGUAGE               FORTRAN
    C
    C HISTORY                WRITTEN BY ROLAND SWEET AT NCAR IN THE LATE
    C                        1970'S.  RELEASED ON NCAR'S PUBLIC SOFTWARE
    C                        LIBRARIES IN JANUARY 1980.
    C
    C PORTABILITY            FORTRAN 77
    C
    C ALGORITHM              THE ROUTINE DEFINES THE FINITE DIFFERENCE
    C                        EQUATIONS, INCORPORATES BOUNDARY DATA, AND
    C                        ADJUSTS THE RIGHT SIDE OF SINGULAR SYSTEMS
    C                        AND THEN CALLS GENBUN TO SOLVE THE SYSTEM.
    C
    C TIMING                 FOR LARGE  M AND N, THE OPERATION COUNT
    C                        IS ROUGHLY PROPORTIONAL TO
    C                          M*N*(LOG2(N)
    C                        BUT ALSO DEPENDS ON INPUT PARAMETERS NBDCND
    C                        AND MBDCND.
    C
    C ACCURACY               THE SOLUTION PROCESS EMPLOYED RESULTS IN A LOSS
    C                        OF NO MORE THAN THREE SIGNIFICANT DIGITS FOR N
    C                        AND M AS LARGE AS 64.  MORE DETAILS ABOUT
    C                        ACCURACY CAN BE FOUND IN THE DOCUMENTATION FOR
    C                        SUBROUTINE GENBUN WHICH IS THE ROUTINE THAT
    C                        SOLVES THE FINITE DIFFERENCE EQUATIONS.
    C
    C REFERENCES             SWARZTRAUBER,P. AND R. SWEET, "EFFICIENT
    C                        FORTRAN SUBPROGRAMS FOR THE SOLUTION OF
    C                        ELLIPTIC EQUATIONS"
    C                          NCAR TN/IA-109, JULY, 1975, 138 PP.
    C***********************************************************************

HWSPLR

          SUBROUTINE HWSPLR (A,B,M,MBDCND,BDA,BDB,C,D,N,NBDCND,BDC,BDD,
         1                   ELMBDA,F,IDIMF,PERTRB,IERROR,W)
    C
    C     * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
    C     *                                                               *
    C     *                  copyright (c) 1999 by UCAR                   *
    C     *                                                               *
    C     *       UNIVERSITY CORPORATION for ATMOSPHERIC RESEARCH         *
    C     *                                                               *
    C     *                      all rights reserved                      *
    C     *                                                               *
    C     *                      FISHPACK version 4.1                     *
    C     *                                                               *
    C     *     A PACKAGE OF FORTRAN SUBPROGRAMS FOR THE SOLUTION OF      *
    C     *                                                               *
    C     *      SEPARABLE ELLIPTIC PARTIAL DIFFERENTIAL EQUATIONS        *
    C     *                                                               *
    C     *                             BY                                *
    C     *                                                               *
    C     *        JOHN ADAMS, PAUL SWARZTRAUBER AND ROLAND SWEET         *
    C     *                                                               *
    C     *                             OF                                *
    C     *                                                               *
    C     *         THE NATIONAL CENTER FOR ATMOSPHERIC RESEARCH          *
    C     *                                                               *
    C     *                BOULDER, COLORADO  (80307)  U.S.A.             *
    C     *                                                               *
    C     *                   WHICH IS SPONSORED BY                       *
    C     *                                                               *
    C     *              THE NATIONAL SCIENCE FOUNDATION                  *
    C     *                                                               *
    C     * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
    C
    C
    C
    C DIMENSION OF           BDA(N),BDB(N),BDC(M),BDD(M),F(IDIMF,N+1),
    C ARGUMENTS              W(SEE ARGUMENT LIST)
    C
    C LATEST REVISION        NOVEMBER 1988
    C
    C PURPOSE                SOLVES A FINITE DIFFERENCE APPROXIMATION TO
    C                        THE HELMHOLTZ EQUATION IN POLAR COORDINATES.
    C                        THE EQUATION IS
    C
    C                            (1/R)(D/DR)(R(DU/DR)) +
    C                            (1/R**2)(D/DTHETA)(DU/DTHETA) +
    C                            LAMBDA*U = F(R,THETA).
    C
    C USAGE                  CALL HWSPLR (A,B,M,MBDCND,BDA,BDB,C,D,N,
    C                                     NBDCND,BDC,BDD,ELMBDA,F,IDIMF,
    C                                     PERTRB,IERROR,W)
    C
    C ARGUMENTS
    C ON INPUT               A,B
    C                          THE RANGE OF R, I.E., A .LE. R .LE. B.
    C                          A MUST BE LESS THAN B AND A MUST BE
    C                          NON-NEGATIVE.
    C
    C                        M
    C                          THE NUMBER OF PANELS INTO WHICH THE
    C                          INTERVAL (A,B) IS SUBDIVIDED.  HENCE,
    C                          THERE WILL BE M+1 GRID POINTS IN THE
    C                          R-DIRECTION GIVEN BY R(I) = A+(I-1)DR,
    C                          FOR I = 1,2,...,M+1,
    C                          WHERE DR = (B-A)/M IS THE PANEL WIDTH.
    C                          M MUST BE GREATER THAN 3.
    C
    C                        MBDCND
    C                          INDICATES THE TYPE OF BOUNDARY CONDITION
    C                          AT R = A AND R = B.
    C
    C                          = 1  IF THE SOLUTION IS SPECIFIED AT
    C                               R = A AND R = B.
    C                          = 2  IF THE SOLUTION IS SPECIFIED AT
    C                               R = A AND THE DERIVATIVE OF
    C                               THE SOLUTION WITH RESPECT TO R IS
    C                               SPECIFIED AT R = B.
    C                          = 3  IF THE DERIVATIVE OF THE SOLUTION
    C                               WITH RESPECT TO R IS SPECIFIED AT
    C                               R = A (SEE NOTE BELOW) AND R = B.
    C                          = 4  IF THE DERIVATIVE OF THE SOLUTION
    C                               WITH RESPECT TO R IS SPECIFIED AT
    C                               R = A (SEE NOTE BELOW) AND THE
    C                               SOLUTION IS SPECIFIED AT R = B.
    C                          = 5  IF THE SOLUTION IS UNSPECIFIED AT
    C                               R = A = 0 AND THE SOLUTION IS
    C                               SPECIFIED AT R = B.
    C                          = 6  IF THE SOLUTION IS UNSPECIFIED AT
    C                               R = A = 0 AND THE DERIVATIVE OF THE
    C                               SOLUTION WITH RESPECT TO R IS SPECIFIED
    C                               AT R = B.
    C
    C                          NOTE:
    C                          IF A = 0, DO NOT USE MBDCND = 3 OR 4, BUT
    C                          INSTEAD USE MBDCND = 1,2,5, OR 6  .
    C
    C                        BDA
    C                          A ONE-DIMENSIONAL ARRAY OF LENGTH N+1 THAT
    C                          SPECIFIES THE VALUES OF THE DERIVATIVE OF
    C                          THE SOLUTION WITH RESPECT TO R AT R = A.
    C
    C                          WHEN MBDCND = 3 OR 4,
    C                            BDA(J) = (D/DR)U(A,THETA(J)),
    C                            J = 1,2,...,N+1  .
    C
    C                          WHEN MBDCND HAS ANY OTHER VALUE, BDA IS
    C                          A DUMMY VARIABLE.
    C
    C                        BDB
    C                          A ONE-DIMENSIONAL ARRAY OF LENGTH N+1 THAT
    C                          SPECIFIES THE VALUES OF THE DERIVATIVE OF
    C                          THE SOLUTION WITH RESPECT TO R AT R = B.
    C
    C                          WHEN MBDCND = 2,3, OR 6,
    C                            BDB(J) = (D/DR)U(B,THETA(J)),
    C                            J = 1,2,...,N+1  .
    C
    C                          WHEN MBDCND HAS ANY OTHER VALUE, BDB IS
    C                          A DUMMY VARIABLE.
    C
    C                        C,D
    C                          THE RANGE OF THETA, I.E., C .LE.
    C                          THETA .LE. D.  C MUST BE LESS THAN D.
    C
    C                        N
    C                          THE NUMBER OF PANELS INTO WHICH THE
    C                          INTERVAL (C,D) IS SUBDIVIDED.  HENCE,
    C                          THERE WILL BE N+1 GRID POINTS IN THE
    C                          THETA-DIRECTION GIVEN BY
    C                          THETA(J) = C+(J-1)DTHETA FOR
    C                          J = 1,2,...,N+1, WHERE
    C                          DTHETA = (D-C)/N IS THE PANEL WIDTH.
    C                          N MUST BE GREATER THAN 3.
    C
    C                        NBDCND
    C                          INDICATES THE TYPE OF BOUNDARY CONDITIONS
    C                          AT THETA = C AND AT THETA = D.
    C
    C                          = 0  IF THE SOLUTION IS PERIODIC IN THETA,
    C                               I.E., U(I,J) = U(I,N+J).
    C                          = 1  IF THE SOLUTION IS SPECIFIED AT
    C                               THETA = C AND THETA = D
    C                               (SEE NOTE BELOW).
    C                          = 2  IF THE SOLUTION IS SPECIFIED AT
    C                               THETA = C AND THE DERIVATIVE OF THE
    C                               SOLUTION WITH RESPECT TO THETA IS
    C                               SPECIFIED AT THETA = D
    C                               (SEE NOTE BELOW).
    C                          = 4  IF THE DERIVATIVE OF THE SOLUTION
    C                               WITH RESPECT TO THETA IS SPECIFIED
    C                               AT THETA = C AND THE SOLUTION IS
    C                               SPECIFIED AT THETA = D
    C                               (SEE NOTE BELOW).
    C
    C                          NOTE:
    C                          WHEN NBDCND = 1,2, OR 4, DO NOT USE
    C                          MBDCND = 5 OR 6
    C                          (THE FORMER INDICATES THAT THE SOLUTION
    C                          IS SPECIFIED AT R = 0, THE LATTER INDICATES
    C                          THE SOLUTION IS UNSPECIFIED AT R = 0).
    C                          USE INSTEAD MBDCND = 1 OR 2  .
    C
    C                        BDC
    C                          A ONE-DIMENSIONAL ARRAY OF LENGTH M+1 THAT
    C                          SPECIFIES THE VALUES OF THE DERIVATIVE
    C                          OF THE SOLUTION WITH RESPECT TO THETA AT
    C                          THETA = C.  WHEN NBDCND = 3 OR 4,
    C
    C                            BDC(I) = (D/DTHETA)U(R(I),C),
    C                            I = 1,2,...,M+1  .
    C
    C                          WHEN NBDCND HAS ANY OTHER VALUE, BDC IS
    C                          A DUMMY VARIABLE.
    C
    C                        BDD
    C                          A ONE-DIMENSIONAL ARRAY OF LENGTH M+1 THAT
    C                          SPECIFIES THE VALUES OF THE DERIVATIVE
    C                          OF THE SOLUTION WITH RESPECT TO THETA AT
    C                          THETA = D.  WHEN NBDCND = 2 OR 3,
    C
    C                            BDD(I) = (D/DTHETA)U(R(I),D),
    C                            I = 1,2,...,M+1  .
    C
    C                          WHEN NBDCND HAS ANY OTHER VALUE, BDD IS
    C                          A DUMMY VARIABLE.
    C
    C                        ELMBDA
    C                          THE CONSTANT LAMBDA IN THE HELMHOLTZ
    C                          EQUATION.  IF LAMBDA .LT. 0, A SOLUTION
    C                          MAY NOT EXIST.  HOWEVER, HWSPLR WILL
    C                          ATTEMPT TO FIND A SOLUTION.
    C
    C                        F
    C                          A TWO-DIMENSIONAL ARRAY, OF DIMENSION AT
    C                          LEAST (M+1)*(N+1), SPECIFYING VALUES
    C                          OF THE RIGHT SIDE OF THE HELMHOLTZ
    C                          EQUATION AND BOUNDARY DATA (IF ANY).
    C
    C                          ON THE INTERIOR, F IS DEFINED AS FOLLOWS:
    C                          FOR I = 2,3,...,M AND J = 2,3,...,N
    C                          F(I,J) = F(R(I),THETA(J)).
    C
    C                          ON THE BOUNDARIES F IS DEFINED AS FOLLOWS:
    C                          FOR J = 1,2,...,N+1 AND I = 1,2,...,M+1
    C
    C                          MBDCND   F(1,J)            F(M+1,J)
    C                          ------   -------------     -------------
    C
    C                            1      U(A,THETA(J))     U(B,THETA(J))
    C                            2      U(A,THETA(J))     F(B,THETA(J))
    C                            3      F(A,THETA(J))     F(B,THETA(J))
    C                            4      F(A,THETA(J))     U(B,THETA(J))
    C                            5      F(0,0)            U(B,THETA(J))
    C                            6      F(0,0)            F(B,THETA(J))
    C
    C                          NBDCND   F(I,1)            F(I,N+1)
    C                          ------   ---------         ---------
    C
    C                            0      F(R(I),C)         F(R(I),C)
    C                            1      U(R(I),C)         U(R(I),D)
    C                            2      U(R(I),C)         F(R(I),D)
    C                            3      F(R(I),C)         F(R(I),D)
    C                            4      F(R(I),C)         U(R(I),D)
    C
    C                          NOTE:
    C                          IF THE TABLE CALLS FOR BOTH THE SOLUTION
    C                          U AND THE RIGHT SIDE F AT A CORNER THEN
    C                          THEN THE SOLUTION MUST BE SPECIFIED.
    C
    C                        IDIMF
    C                          THE ROW (OR FIRST) DIMENSION OF THE ARRAY
    C                          F AS IT APPEARS IN THE PROGRAM CALLING
    C                          HWSPLR.  THIS PARAMETER IS USED TO SPECIFY
    C                          THE VARIABLE DIMENSION OF F.  IDIMF MUST
    C                          BE AT LEAST M+1.
    C
    C                        W
    C                          A ONE-DIMENSIONAL ARRAY THAT MUST BE
    C                          PROVIDED BY THE USER FOR WORK SPACE.
    C                          W MAY REQUIRE UP TO 4*(N+1) +
    C                          (13 + INT(LOG2(N+1)))*(M+1) LOCATIONS.
    C                          THE ACTUAL NUMBER OF LOCATIONS USED IS
    C                          COMPUTED BY HWSPLR AND IS RETURNED IN
    C                          LOCATION W(I).
    C
    C
    C ON OUTPUT              F
    C                          CONTAINS THE SOLUTION U(I,J) OF THE FINITE
    C                          DIFFERENCE APPROXIMATION FOR THE GRID POINT
    C                          (R(I),THETA(J)),
    C                          I = 1,2,...,M+1, J = 1,2,...,N+1  .
    C
    C                        PERTRB
    C                          IF A COMBINATION OF PERIODIC, DERIVATIVE,
    C                          OR UNSPECIFIED BOUNDARY CONDITIONS IS
    C                          SPECIFIED FOR A POISSON EQUATION
    C                          (LAMBDA = 0), A SOLUTION MAY NOT EXIST.
    C                          PERTRB IS A CONSTANT, CALCULATED AND
    C                          SUBTRACTED FROM F, WHICH ENSURES THAT A
    C                          SOLUTION EXISTS.  HWSPLR THEN COMPUTES
    C                          THIS SOLUTION, WHICH IS A LEAST SQUARES
    C                          SOLUTION TO THE ORIGINAL APPROXIMATION.
    C                          THIS SOLUTION PLUS ANY CONSTANT IS ALSO
    C                          A SOLUTION.  HENCE, THE SOLUTION IS NOT
    C                          UNIQUE.  PERTRB SHOULD BE SMALL COMPARED
    C                          TO THE RIGHT SIDE. OTHERWISE, A SOLUTION
    C                          IS OBTAINED TO AN ESSENTIALLY DIFFERENT
    C                          PROBLEM.  THIS COMPARISON SHOULD ALWAYS
    C                          BE MADE TO INSURE THAT A MEANINGFUL
    C                          SOLUTION HAS BEEN OBTAINED.
    C
    C                        IERROR
    C                          AN ERROR FLAG THAT INDICATES INVALID INPUT
    C                          PARAMETERS.  EXCEPT FOR NUMBERS 0 AND 11,
    C                          A SOLUTION IS NOT ATTEMPTED.
    C
    C                          =  0  NO ERROR.
    C                          =  1  A .LT. 0  .
    C                          =  2  A .GE. B.
    C                          =  3  MBDCND .LT. 1 OR MBDCND .GT. 6  .
    C                          =  4  C .GE. D.
    C                          =  5  N .LE. 3
    C                          =  6  NBDCND .LT. 0 OR .GT. 4  .
    C                          =  7  A = 0, MBDCND = 3 OR 4  .
    C                          =  8  A .GT. 0, MBDCND .GE. 5  .
    C                          =  9  MBDCND .GE. 5, NBDCND .NE. 0
    C                                AND NBDCND .NE. 3  .
    C                          = 10  IDIMF .LT. M+1  .
    C                          = 11  LAMBDA .GT. 0  .
    C                          = 12  M .LE. 3
    C
    C                          SINCE THIS IS THE ONLY MEANS OF INDICATING
    C                          A POSSIBLY INCORRECT CALL TO HWSPLR, THE
    C                          USER SHOULD TEST IERROR AFTER THE CALL.
    C
    C                        W
    C                          W(1) CONTAINS THE REQUIRED LENGTH OF W.
    C
    C SPECIAL CONDITIONS     NONE
    C
    C I/O                    NONE
    C
    C PRECISION              SINGLE
    C
    C REQUIRED LIBRARY       GENBUN, GNBNAUX, AND COMF
    C FILES                  FROM FISHPAK
    C
    C LANGUAGE               FORTRAN
    C
    C HISTORY                WRITTEN BY ROLAND SWEET AT NCAR IN THE LATE
    C                        1970'S.  RELEASED ON NCAR'S PUBLIC SOFTWARE
    C                        LIBRARIES IN JANUARY 1980.
    C
    C PORTABILITY            FORTRAN 77
    C
    C ALGORITHM              THE ROUTINE DEFINES THE FINITE DIFFERENCE
    C                        EQUATIONS, INCORPORATES BOUNDARY DATA, AND
    C                        ADJUSTS THE RIGHT SIDE OF SINGULAR SYSTEMS
    C                        AND THEN CALLS GENBUN TO SOLVE THE SYSTEM.
    C
    C TIMING                 FOR LARGE  M AND N, THE OPERATION COUNT
    C                        IS ROUGHLY PROPORTIONAL TO
    C                          M*N*(LOG2(N)
    C                        BUT ALSO DEPENDS ON INPUT PARAMETERS NBDCND
    C                        AND MBDCND.
    C
    C ACCURACY               THE SOLUTION PROCESS EMPLOYED RESULTS IN A LOSS
    C                        OF NO MORE THAN THREE SIGNIFICANT DIGITS FOR N
    C                        AND M AS LARGE AS 64.  MORE DETAILS ABOUT
    C                        ACCURACY CAN BE FOUND IN THE DOCUMENTATION FOR
    C                        SUBROUTINE GENBUN WHICH IS THE ROUTINE THAT
    C                        SOLVES THE FINITE DIFFERENCE EQUATIONS.
    C
    C REFERENCES             SWARZTRAUBER,P. AND R. SWEET, "EFFICIENT
    C                        FORTRAN SUBPROGRAMS FOR THE SOLUTION OF
    C                        ELLIPTIC EQUATIONS"
    C                          NCAR TN/IA-109, JULY, 1975, 138 PP.
    C***********************************************************************

HWSSSP

          SUBROUTINE HWSSSP (TS,TF,M,MBDCND,BDTS,BDTF,PS,PF,N,NBDCND,BDPS,
         1                   BDPF,ELMBDA,F,IDIMF,PERTRB,IERROR,W)
    C
    C     * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
    C     *                                                               *
    C     *                  copyright (c) 1999 by UCAR                   *
    C     *                                                               *
    C     *       UNIVERSITY CORPORATION for ATMOSPHERIC RESEARCH         *
    C     *                                                               *
    C     *                      all rights reserved                      *
    C     *                                                               *
    C     *                      FISHPACK version 4.1                     *
    C     *                                                               *
    C     *     A PACKAGE OF FORTRAN SUBPROGRAMS FOR THE SOLUTION OF      *
    C     *                                                               *
    C     *      SEPARABLE ELLIPTIC PARTIAL DIFFERENTIAL EQUATIONS        *
    C     *                                                               *
    C     *                             BY                                *
    C     *                                                               *
    C     *        JOHN ADAMS, PAUL SWARZTRAUBER AND ROLAND SWEET         *
    C     *                                                               *
    C     *                             OF                                *
    C     *                                                               *
    C     *         THE NATIONAL CENTER FOR ATMOSPHERIC RESEARCH          *
    C     *                                                               *
    C     *                BOULDER, COLORADO  (80307)  U.S.A.             *
    C     *                                                               *
    C     *                   WHICH IS SPONSORED BY                       *
    C     *                                                               *
    C     *              THE NATIONAL SCIENCE FOUNDATION                  *
    C     *                                                               *
    C     * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
    C
    C
    C
    C DIMENSION OF           BDTS(N+1),    BDTF(N+1), BDPS(M+1), BDPF(M+1),
    C ARGUMENTS              F(IDIMF,N+1), W(SEE ARGUMENT LIST)
    C
    C LATEST REVISION        NOVEMBER 1988
    C
    C PURPOSE                SOLVES A FINITE DIFFERENCE APPROXIMATION TO
    C                        THE HELMHOLTZ EQUATION IN SPHERICAL
    C                        COORDINATES AND ON THE SURFACE OF THE UNIT
    C                        SPHERE (RADIUS OF 1).  THE EQUATION IS
    C
    C                          (1/SIN(THETA))(D/DTHETA)(SIN(THETA)
    C                          (DU/DTHETA)) + (1/SIN(THETA)**2)(D/DPHI)
    C                          (DU/DPHI)  + LAMBDA*U = F(THETA,PHI)
    C
    C                        WHERE THETA IS COLATITUDE AND PHI IS
    C                        LONGITUDE.
    C
    C USAGE                  CALL HWSSSP (TS,TF,M,MBDCND,BDTS,BDTF,PS,PF,
    C                                     N,NBDCND,BDPS,BDPF,ELMBDA,F,
    C                                     IDIMF,PERTRB,IERROR,W)
    C
    C ARGUMENTS
    C ON INPUT               TS,TF
    C
    C                          THE RANGE OF THETA (COLATITUDE), I.E.,
    C                          TS .LE. THETA .LE. TF. TS MUST BE LESS
    C                          THAN TF.  TS AND TF ARE IN RADIANS.
    C                          A TS OF ZERO CORRESPONDS TO THE NORTH
    C                          POLE AND A TF OF PI CORRESPONDS TO
    C                          THE SOUTH POLE.
    C
    C                          * * * IMPORTANT * * *
    C
    C                          IF TF IS EQUAL TO PI THEN IT MUST BE
    C                          COMPUTED USING THE STATEMENT
    C                          TF = PIMACH(DUM). THIS INSURES THAT TF
    C                          IN THE USER'S PROGRAM IS EQUAL TO PI IN
    C                          THIS PROGRAM WHICH PERMITS SEVERAL TESTS
    C                          OF THE INPUT PARAMETERS THAT OTHERWISE
    C                          WOULD NOT BE POSSIBLE.
    C
    C
    C                        M
    C                          THE NUMBER OF PANELS INTO WHICH THE
    C                          INTERVAL (TS,TF) IS SUBDIVIDED.
    C                          HENCE, THERE WILL BE M+1 GRID POINTS IN THE
    C                          THETA-DIRECTION GIVEN BY
    C                          THETA(I) = (I-1)DTHETA+TS FOR
    C                          I = 1,2,...,M+1, WHERE
    C                          DTHETA = (TF-TS)/M IS THE PANEL WIDTH.
    C                          M MUST BE GREATER THAN 5
    C
    C                        MBDCND
    C                          INDICATES THE TYPE OF BOUNDARY CONDITION
    C                          AT THETA = TS AND THETA = TF.
    C
    C                          = 1  IF THE SOLUTION IS SPECIFIED AT
    C                               THETA = TS AND THETA = TF.
    C                          = 2  IF THE SOLUTION IS SPECIFIED AT
    C                               THETA = TS AND THE DERIVATIVE OF
    C                               THE SOLUTION WITH RESPECT TO THETA IS
    C                               SPECIFIED AT THETA = TF
    C                               (SEE NOTE 2 BELOW).
    C                          = 3  IF THE DERIVATIVE OF THE SOLUTION
    C                               WITH RESPECT TO THETA IS SPECIFIED
    C                               SPECIFIED AT THETA = TS AND
    C                               THETA = TF (SEE NOTES 1,2 BELOW).
    C                          = 4  IF THE DERIVATIVE OF THE SOLUTION
    C                               WITH RESPECT TO THETA IS SPECIFIED
    C                               AT THETA = TS (SEE NOTE 1 BELOW)
    C                               AND THE SOLUTION IS SPECIFIED AT
    C                               THETA = TF.
    C                          = 5  IF THE SOLUTION IS UNSPECIFIED AT
    C                               THETA = TS = 0 AND THE SOLUTION
    C                               IS SPECIFIED AT THETA = TF.
    C                          = 6  IF THE SOLUTION IS UNSPECIFIED AT
    C                               THETA = TS = 0 AND THE DERIVATIVE
    C                               OF THE SOLUTION WITH RESPECT TO THETA
    C                               IS SPECIFIED AT THETA = TF
    C                               (SEE NOTE 2 BELOW).
    C                          = 7  IF THE SOLUTION IS SPECIFIED AT
    C                               THETA = TS AND THE SOLUTION IS
    C                               IS UNSPECIFIED AT THETA = TF = PI.
    C                          = 8  IF THE DERIVATIVE OF THE SOLUTION
    C                               WITH RESPECT TO THETA IS SPECIFIED
    C                               AT THETA = TS (SEE NOTE 1 BELOW) AND
    C                               THE SOLUTION IS UNSPECIFIED AT
    C                               THETA = TF = PI.
    C                          = 9  IF THE SOLUTION IS UNSPECIFIED AT
    C                               THETA = TS = 0 AND THETA = TF = PI.
    C
    C                          NOTES:
    C                          IF TS = 0, DO NOT USE MBDCND = 3,4, OR 8,
    C                          BUT INSTEAD USE MBDCND = 5,6, OR 9  .
    C
    C                          IF TF = PI, DO NOT USE MBDCND = 2,3, OR 6,
    C                          BUT INSTEAD USE MBDCND = 7,8, OR 9  .
    C
    C                        BDTS
    C                          A ONE-DIMENSIONAL ARRAY OF LENGTH N+1 THAT
    C                          SPECIFIES THE VALUES OF THE DERIVATIVE OF
    C                          THE SOLUTION WITH RESPECT TO THETA AT
    C                          THETA = TS.  WHEN MBDCND = 3,4, OR 8,
    C
    C                          BDTS(J) = (D/DTHETA)U(TS,PHI(J)),
    C                          J = 1,2,...,N+1  .
    C
    C                          WHEN MBDCND HAS ANY OTHER VALUE, BDTS IS
    C                          A DUMMY VARIABLE.
    C
    C                        BDTF
    C                          A ONE-DIMENSIONAL ARRAY OF LENGTH N+1
    C                          THAT SPECIFIES THE VALUES OF THE DERIVATIVE
    C                          OF THE SOLUTION WITH RESPECT TO THETA AT
    C                          THETA = TF.  WHEN MBDCND = 2,3, OR 6,
    C
    C                          BDTF(J) = (D/DTHETA)U(TF,PHI(J)),
    C                          J = 1,2,...,N+1  .
    C
    C                          WHEN MBDCND HAS ANY OTHER VALUE, BDTF IS
    C                          A DUMMY VARIABLE.
    C
    C                        PS,PF
    C                          THE RANGE OF PHI (LONGITUDE), I.E.,
    C                          PS .LE. PHI .LE. PF.  PS MUST BE LESS
    C                          THAN PF.  PS AND PF ARE IN RADIANS.
    C                          IF PS = 0 AND PF = 2*PI, PERIODIC
    C                          BOUNDARY CONDITIONS ARE USUALLY PRESCRIBED.
    C
    C                          * * * IMPORTANT * * *
    C
    C                          IF PF IS EQUAL TO 2*PI THEN IT MUST BE
    C                          COMPUTED USING THE STATEMENT
    C                          PF = 2.*PIMACH(DUM). THIS INSURES THAT
    C                          PF IN THE USERS PROGRAM IS EQUAL TO
    C                          2*PI IN THIS PROGRAM WHICH PERMITS TESTS
    C                          OF THE INPUT PARAMETERS THAT OTHERWISE
    C                          WOULD NOT BE POSSIBLE.
    C
    C                        N
    C                          THE NUMBER OF PANELS INTO WHICH THE
    C                          INTERVAL (PS,PF) IS SUBDIVIDED.
    C                          HENCE, THERE WILL BE N+1 GRID POINTS
    C                          IN THE PHI-DIRECTION GIVEN BY
    C                          PHI(J) = (J-1)DPHI+PS  FOR
    C                          J = 1,2,...,N+1, WHERE
    C                          DPHI = (PF-PS)/N IS THE PANEL WIDTH.
    C                          N MUST BE GREATER THAN 4
    C
    C                        NBDCND
    C                          INDICATES THE TYPE OF BOUNDARY CONDITION
    C                          AT PHI = PS AND PHI = PF.
    C
    C                          = 0  IF THE SOLUTION IS PERIODIC IN PHI,
    C                               I.U., U(I,J) = U(I,N+J).
    C                          = 1  IF THE SOLUTION IS SPECIFIED AT
    C                               PHI = PS AND PHI = PF
    C                               (SEE NOTE BELOW).
    C                          = 2  IF THE SOLUTION IS SPECIFIED AT
    C                               PHI = PS (SEE NOTE BELOW)
    C                               AND THE DERIVATIVE OF THE SOLUTION
    C                               WITH RESPECT TO PHI IS SPECIFIED
    C                               AT PHI = PF.
    C                          = 3  IF THE DERIVATIVE OF THE SOLUTION
    C                               WITH RESPECT TO PHI IS SPECIFIED
    C                               AT PHI = PS AND PHI = PF.
    C                          = 4  IF THE DERIVATIVE OF THE SOLUTION
    C                               WITH RESPECT TO PHI IS SPECIFIED
    C                               AT PS AND THE SOLUTION IS SPECIFIED
    C                               AT PHI = PF
    C
    C                          NOTE:
    C                          NBDCND = 1,2, OR 4 CANNOT BE USED WITH
    C                          MBDCND = 5,6,7,8, OR 9.  THE FORMER INDICATES
    C                          THAT THE SOLUTION IS SPECIFIED AT A POLE, THE
    C                          LATTER INDICATES THAT THE SOLUTION IS NOT
    C                          SPECIFIED.  USE INSTEAD  MBDCND = 1 OR 2.
    C
    C                        BDPS
    C                          A ONE-DIMENSIONAL ARRAY OF LENGTH M+1 THAT
    C                          SPECIFIES THE VALUES OF THE DERIVATIVE
    C                          OF THE SOLUTION WITH RESPECT TO PHI AT
    C                          PHI = PS.  WHEN NBDCND = 3 OR 4,
    C
    C                            BDPS(I) = (D/DPHI)U(THETA(I),PS),
    C                            I = 1,2,...,M+1  .
    C
    C                          WHEN NBDCND HAS ANY OTHER VALUE, BDPS IS
    C                          A DUMMY VARIABLE.
    C
    C                        BDPF
    C                          A ONE-DIMENSIONAL ARRAY OF LENGTH M+1 THAT
    C                          SPECIFIES THE VALUES OF THE DERIVATIVE
    C                          OF THE SOLUTION WITH RESPECT TO PHI AT
    C                          PHI = PF.  WHEN NBDCND = 2 OR 3,
    C
    C                            BDPF(I) = (D/DPHI)U(THETA(I),PF),
    C                            I = 1,2,...,M+1  .
    C
    C                          WHEN NBDCND HAS ANY OTHER VALUE, BDPF IS
    C                          A DUMMY VARIABLE.
    C
    C                        ELMBDA
    C                          THE CONSTANT LAMBDA IN THE HELMHOLTZ
    C                          EQUATION.  IF LAMBDA .GT. 0, A SOLUTION
    C                          MAY NOT EXIST.  HOWEVER, HWSSSP WILL
    C                          ATTEMPT TO FIND A SOLUTION.
    C
    C                        F
    C                          A TWO-DIMENSIONAL ARRAY THAT SPECIFIES THE
    C                          VALUE OF THE RIGHT SIDE OF THE HELMHOLTZ
    C                          EQUATION AND BOUNDARY VALUES (IF ANY).
    C                          F MUST BE DIMENSIONED AT LEAST (M+1)*(N+1).
    C
    C                          ON THE INTERIOR, F IS DEFINED AS FOLLOWS:
    C                          FOR I = 2,3,...,M AND J = 2,3,...,N
    C                          F(I,J) = F(THETA(I),PHI(J)).
    C
    C                          ON THE BOUNDARIES F IS DEFINED AS FOLLOWS:
    C                          FOR J = 1,2,...,N+1 AND I = 1,2,...,M+1
    C
    C                          MBDCND   F(1,J)            F(M+1,J)
    C                          ------   ------------      ------------
    C
    C                            1      U(TS,PHI(J))      U(TF,PHI(J))
    C                            2      U(TS,PHI(J))      F(TF,PHI(J))
    C                            3      F(TS,PHI(J))      F(TF,PHI(J))
    C                            4      F(TS,PHI(J))      U(TF,PHI(J))
    C                            5      F(0,PS)           U(TF,PHI(J))
    C                            6      F(0,PS)           F(TF,PHI(J))
    C                            7      U(TS,PHI(J))      F(PI,PS)
    C                            8      F(TS,PHI(J))      F(PI,PS)
    C                            9      F(0,PS)           F(PI,PS)
    C
    C                          NBDCND   F(I,1)            F(I,N+1)
    C                          ------   --------------    --------------
    C
    C                            0      F(THETA(I),PS)    F(THETA(I),PS)
    C                            1      U(THETA(I),PS)    U(THETA(I),PF)
    C                            2      U(THETA(I),PS)    F(THETA(I),PF)
    C                            3      F(THETA(I),PS)    F(THETA(I),PF)
    C                            4      F(THETA(I),PS)    U(THETA(I),PF)
    C
    C                          NOTE:
    C                          IF THE TABLE CALLS FOR BOTH THE SOLUTION U
    C                          AND THE RIGHT SIDE F AT A CORNER THEN THE
    C                          SOLUTION MUST BE SPECIFIED.
    C
    C                        IDIMF
    C                          THE ROW (OR FIRST) DIMENSION OF THE ARRAY
    C                          F AS IT APPEARS IN THE PROGRAM CALLING
    C                          HWSSSP.  THIS PARAMETER IS USED TO SPECIFY
    C                          THE VARIABLE DIMENSION OF F. IDIMF MUST BE
    C                          AT LEAST M+1  .
    C
    C                        W
    C                          A ONE-DIMENSIONAL ARRAY THAT MUST BE
    C                          PROVIDED BY THE USER FOR WORK SPACE.
    C                          W MAY REQUIRE UP TO
    C                          4*(N+1)+(16+INT(LOG2(N+1)))(M+1) LOCATIONS
    C                          THE ACTUAL NUMBER OF LOCATIONS USED IS
    C                          COMPUTED BY HWSSSP AND IS OUTPUT IN
    C                          LOCATION W(1). INT( ) DENOTES THE
    C                          FORTRAN INTEGER FUNCTION.
    C
    C
    C ON OUTPUT              F
    C                          CONTAINS THE SOLUTION U(I,J) OF THE FINITE
    C                          DIFFERENCE APPROXIMATION FOR THE GRID POINT
    C                          (THETA(I),PHI(J)),  I = 1,2,...,M+1  AND
    C                          J = 1,2,...,N+1  .
    C
    C                        PERTRB
    C                          IF ONE SPECIFIES A COMBINATION OF PERIODIC,
    C                          DERIVATIVE OR UNSPECIFIED BOUNDARY
    C                          CONDITIONS FOR A POISSON EQUATION
    C                          (LAMBDA = 0), A SOLUTION MAY NOT EXIST.
    C                          PERTRB IS A CONSTANT, CALCULATED AND
    C                          SUBTRACTED FROM F, WHICH ENSURES THAT A
    C                          SOLUTION EXISTS.  HWSSSP THEN COMPUTES
    C                          THIS SOLUTION, WHICH IS A LEAST SQUARES
    C                          SOLUTION TO THE ORIGINAL APPROXIMATION.
    C                          THIS SOLUTION IS NOT UNIQUE AND IS
    C                          UNNORMALIZED. THE VALUE OF PERTRB SHOULD
    C                          BE SMALL COMPARED TO THE RIGHT SIDE F.
    C                          OTHERWISE , A SOLUTION IS OBTAINED TO AN
    C                          ESSENTIALLY DIFFERENT PROBLEM. THIS
    C                          COMPARISON SHOULD ALWAYS BE MADE TO INSURE
    C                          THAT A MEANINGFUL SOLUTION HAS BEEN
    C                          OBTAINED
    C
    C                        IERROR
    C                          AN ERROR FLAG THAT INDICATES INVALID INPUT
    C                          PARAMETERS.  EXCEPT FOR NUMBERS 0 AND 8,
    C                          A SOLUTION IS NOT ATTEMPTED.
    C
    C                          = 0  NO ERROR
    C                          = 1  TS.LT.0 OR TF.GT.PI
    C                          = 2  TS.GE.TF
    C                          = 3  MBDCND.LT.1 OR MBDCND.GT.9
    C                          = 4  PS.LT.0 OR PS.GT.PI+PI
    C                          = 5  PS.GE.PF
    C                          = 6  N.LT.5
    C                          = 7  M.LT.5
    C                          = 8  NBDCND.LT.0 OR NBDCND.GT.4
    C                          = 9  ELMBDA.GT.0
    C                          = 10 IDIMF.LT.M+1
    C                          = 11 NBDCND EQUALS 1,2 OR 4 AND MBDCND.GE.5
    C                          = 12 TS.EQ.0 AND MBDCND EQUALS 3,4 OR 8
    C                          = 13 TF.EQ.PI AND MBDCND EQUALS 2,3 OR 6
    C                          = 14 MBDCND EQUALS 5,6 OR 9 AND TS.NE.0
    C                          = 15 MBDCND.GE.7 AND TF.NE.PI
    C
    C                          SINCE THIS IS THE ONLY MEANS OF INDICATING
    C                          A POSSIBLY INCORRECT CALL TO HWSSSP, THE
    C                          USER SHOULD TEST IERROR AFTER A CALL.
    C
    C                        W
    C                          CONTAINS INTERMEDIATE VALUES THAT MUST NOT
    C                          BE DESTROYED IF HWSSSP WILL BE CALLED AGAIN
    C                          WITH INTL = 1. W(1) CONTAINS THE REQUIRED
    C                          LENGTH OF W .
    C
    C SPECIAL CONDITIONS     NONE
    C
    C I/O                    NONE
    C
    C PRECISION              SINGLE
    C
    C REQUIRED LIBRARY       GENBUN, GNBNAUX, AND COMF
    C FILES                  FROM FISHPAK
    C
    C LANGUAGE               FORTRAN
    C
    C HISTORY                WRITTEN BY ROLAND SWEET AT NCAR IN THE LATE
    C                        1970'S.  RELEASED ON NCAR'S PUBLIC SOFTWARE
    C                        LIBRARIES IN JANUARY 1980.
    C
    C PORTABILITY            FORTRAN 77
    C
    C ALGORITHM              THE ROUTINE DEFINES THE FINITE DIFFERENCE
    C                        EQUATIONS, INCORPORATES BOUNDARY DATA, AND
    C                        ADJUSTS THE RIGHT SIDE OF SINGULAR SYSTEMS
    C                        AND THEN CALLS GENBUN TO SOLVE THE SYSTEM.
    C
    C TIMING                 FOR LARGE  M AND N, THE OPERATION COUNT
    C                        IS ROUGHLY PROPORTIONAL TO
    C                          M*N*(LOG2(N)
    C                        BUT ALSO DEPENDS ON INPUT PARAMETERS NBDCND
    C                        AND MBDCND.
    C
    C ACCURACY               THE SOLUTION PROCESS EMPLOYED RESULTS IN A LOSS
    C                        OF NO MORE THAN THREE SIGNIFICANT DIGITS FOR N
    C                        AND M AS LARGE AS 64.  MORE DETAILS ABOUT
    C                        ACCURACY CAN BE FOUND IN THE DOCUMENTATION FOR
    C                        SUBROUTINE GENBUN WHICH IS THE ROUTINE THAT
    C                        SOLVES THE FINITE DIFFERENCE EQUATIONS.
    C
    C REFERENCES             P. N. SWARZTRAUBER, "THE DIRECT SOLUTION OF
    C                        THE DISCRETE POISSON EQUATION ON THE SURFACE OF
    C                        A SPHERE", S.I.A.M. J. NUMER. ANAL.,15(1974),
    C                        PP 212-215.
    C
    C                        SWARZTRAUBER,P. AND R. SWEET, "EFFICIENT
    C                        FORTRAN SUBPROGRAMS FOR THE SOLUTION OF
    C                        ELLIPTIC EQUATIONS", NCAR TN/IA-109, JULY,
    C                        1975, 138 PP.
    C***********************************************************************

POIS3D

          SUBROUTINE POIS3D (LPEROD,L,C1,MPEROD,M,C2,NPEROD,N,A,B,C,LDIMF,
         1                   MDIMF,F,IERROR,W)
    C
    C     * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
    C     *                                                               *
    C     *                  copyright (c) 1999 by UCAR                   *
    C     *                                                               *
    C     *       UNIVERSITY CORPORATION for ATMOSPHERIC RESEARCH         *
    C     *                                                               *
    C     *                      all rights reserved                      *
    C     *                                                               *
    C     *                      FISHPACK version 4.1                     *
    C     *                                                               *
    C     *     A PACKAGE OF FORTRAN SUBPROGRAMS FOR THE SOLUTION OF      *
    C     *                                                               *
    C     *      SEPARABLE ELLIPTIC PARTIAL DIFFERENTIAL EQUATIONS        *
    C     *                                                               *
    C     *                             BY                                *
    C     *                                                               *
    C     *        JOHN ADAMS, PAUL SWARZTRAUBER AND ROLAND SWEET         *
    C     *                                                               *
    C     *                             OF                                *
    C     *                                                               *
    C     *         THE NATIONAL CENTER FOR ATMOSPHERIC RESEARCH          *
    C     *                                                               *
    C     *                BOULDER, COLORADO  (80307)  U.S.A.             *
    C     *                                                               *
    C     *                   WHICH IS SPONSORED BY                       *
    C     *                                                               *
    C     *              THE NATIONAL SCIENCE FOUNDATION                  *
    C     *                                                               *
    C     * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
    C
    C
    C
    C DIMENSION OF           A(N), B(N), C(N), F(LDIMF,MDIMF,N),
    C ARGUMENTS              W(SEE ARGUMENT LIST)
    C
    C LATEST REVISION        NOVEMBER 1988
    C
    C PURPOSE                SOLVES THE LINEAR SYSTEM OF EQUATIONS
    C                        FOR UNKNOWN X VALUES, WHERE I=1,2,...,L,
    C                        J=1,2,...,M, AND K=1,2,...,N
    C
    C                        C1*(X(I-1,J,K) -2.*X(I,J,K) +X(I+1,J,K)) +
    C                        C2*(X(I,J-1,K) -2.*X(I,J,K) +X(I,J+1,K)) +
    C                        A(K)*X(I,J,K-1) +B(K)*X(I,J,K)+ C(K)*X(I,J,K+1)
    C                        = F(I,J,K)
    C
    C                        THE INDICES K-1 AND K+1 ARE EVALUATED MODULO N,
    C                        I.E. X(I,J,0)=X(I,J,N) AND X(I,J,N+1)=X(I,J,1).
    C                        THE UNKNOWNS
    C                        X(0,J,K), X(L+1,J,K), X(I,0,K), AND X(I,M+1,K)
    C                        ARE ASSUMED TO TAKE ON CERTAIN PRESCRIBED
    C                        VALUES DESCRIBED BELOW.
    C
    C USAGE                  CALL POIS3D (LPEROD,L,C1,MPEROD,M,C2,NPEROD,
    C                        N,A,B,C,LDIMF,MDIMF,F,IERROR,W)
    C
    C ARGUMENTS
    C
    C ON INPUT
    C                        LPEROD
    C                          INDICATES THE VALUES THAT X(0,J,K) AND
    C                          X(L+1,J,K) ARE ASSUMED TO HAVE.
    C                          = 0  X(0,J,K)=X(L,J,K), X(L+1,J,K)=X(1,J,K)
    C                          = 1  X(0,J,K) = 0,      X(L+1,J,K) = 0
    C                          = 2  X(0,J,K)=0,        X(L+1,J,K)=X(L-1,J,K)
    C                          = 3  X(0,J,K)=X(2,J,K), X(L+1,J,K)=X(L-1,J,K)
    C                          = 4  X(0,J,K)=X(2,J,K), X(L+1,J,K) = 0.
    C
    C                        L
    C                          THE NUMBER OF UNKNOWNS IN THE I-DIRECTION.
    C                          L MUST BE AT LEAST 3.
    C
    C                        C1
    C                          REAL CONSTANT IN THE ABOVE LINEAR SYSTEM
    C                          OF EQUATIONS TO BE SOLVED.
    C
    C                        MPEROD
    C                          INDICATES THE VALUES THAT X(I,0,K) AND
    C                          X(I,M+1,K) ARE ASSUMED TO HAVE.
    C                          = 0  X(I,0,K)=X(I,M,K), X(I,M+1,K)=X(I,1,K)
    C                          = 1  X(I,0,K)=0,        X(I,M+1,K)=0
    C                          = 2  X(I,0,K)=0,        X(I,M+1,K)=X(I,M-1,K)
    C                          = 3  X(I,0,K)=X(I,2,K)  X(I,M+1,K)=X(I,M-1,K)
    C                          = 4  X(I,0,K)=X(I,2,K)  X(I,M+1,K)=0
    C
    C                        M
    C                          THE NUMBER OF UNKNOWNS IN THE J-DIRECTION.
    C                          M MUST BE AT LEAST 3.
    C
    C                        C2
    C                          REAL CONSTANT IN THE ABOVE LINEAR SYSTEM
    C                          OF EQUATIONS TO BE SOLVED.
    C
    C                        NPEROD
    C                          = 0  IF A(1) AND C(N) ARE NOT ZERO.
    C                          = 1  IF A(1) = C(N) = 0.
    C
    C                        N
    C                          THE NUMBER OF UNKNOWNS IN THE K-DIRECTION.
    C                          N MUST BE AT LEAST 3.
    C
    C                        A, B, C
    C                          ONE-DIMENSIONAL ARRAYS OF LENGTH N THAT
    C                          SPECIFY THE COEFFICIENTS IN THE LINEAR
    C                          EQUATIONS GIVEN ABOVE.
    C
    C                          IF NPEROD = 0 THE ARRAY ELEMENTS MUST NOT
    C                          DEPEND UPON INDEX K, BUT MUST BE CONSTANT.
    C                          SPECIFICALLY,THE SUBROUTINE CHECKS THE
    C                          FOLLOWING CONDITION
    C                            A(K) = C(1)
    C                            C(K) = C(1)
    C                            B(K) = B(1)
    C                          FOR K=1,2,...,N.
    C
    C                        LDIMF
    C                          THE ROW (OR FIRST) DIMENSION OF THE THREE-
    C                          DIMENSIONAL ARRAY F AS IT APPEARS IN THE
    C                          PROGRAM CALLING POIS3D.  THIS PARAMETER IS
    C                          USED TO SPECIFY THE VARIABLE DIMENSION
    C                          OF F.  LDIMF MUST BE AT LEAST L.
    C
    C                        MDIMF
    C                          THE COLUMN (OR SECOND) DIMENSION OF THE THREE
    C                          DIMENSIONAL ARRAY F AS IT APPEARS IN THE
    C                          PROGRAM CALLING POIS3D.  THIS PARAMETER IS
    C                          USED TO SPECIFY THE VARIABLE DIMENSION
    C                          OF F.  MDIMF MUST BE AT LEAST M.
    C
    C                        F
    C                          A THREE-DIMENSIONAL ARRAY THAT SPECIFIES THE
    C                          VALUES OF THE RIGHT SIDE OF THE LINEAR SYSTEM
    C                          OF EQUATIONS GIVEN ABOVE.  F MUST BE
    C                          DIMENSIONED AT LEAST L X M X N.
    C
    C                        W
    C                          A ONE-DIMENSIONAL ARRAY THAT MUST BE PROVIDED
    C                          BY THE USER FOR WORK SPACE.  THE LENGTH OF W
    C                          MUST BE AT LEAST
    C                            30 + L + M + 2*N + MAX(L,M,N) +
    C                            7*(INT((L+1)/2) + INT((M+1)/2)).
    C
    C ON OUTPUT
    C
    C                        F
    C                          CONTAINS THE SOLUTION X.
    C
    C                        IERROR
    C                          AN ERROR FLAG THAT INDICATES INVALID INPUT
    C                          PARAMETERS.  EXCEPT FOR NUMBER ZERO, A
    C                          SOLUTION IS NOT ATTEMPTED.
    C                          = 0  NO ERROR
    C                          = 1  IF LPEROD .LT. 0 OR .GT. 4
    C                          = 2  IF L .LT. 3
    C                          = 3  IF MPEROD .LT. 0 OR .GT. 4
    C                          = 4  IF M .LT. 3
    C                          = 5  IF NPEROD .LT. 0 OR .GT. 1
    C                          = 6  IF N .LT. 3
    C                          = 7  IF LDIMF .LT. L
    C                          = 8  IF MDIMF .LT. M
    C                          = 9  IF A(K) .NE. C(1) OR C(K) .NE. C(1)
    C                               OR B(I) .NE.B(1) FOR SOME K=1,2,...,N.
    C                          = 10 IF NPEROD = 1 AND A(1) .NE. 0
    C                               OR C(N) .NE. 0
    C
    C                          SINCE THIS IS THE ONLY MEANS OF INDICATING A
    C                          POSSIBLY INCORRECT CALL TO POIS3D, THE USER
    C                          SHOULD TEST IERROR AFTER THE CALL.
    C
    C SPECIAL CONDITIONS     NONE
    C
    C I/O                    NONE
    C
    C PRECISION              SINGLE
    C
    C REQUIRED LIBRARY       COMF AND FFTPACK FROM FISHPAK
    C FILES
    C
    C LANGUAGE               FORTRAN
    C
    C HISTORY                WRITTEN BY ROLAND SWEET AT NCAR IN THE LATE
    C                        1970'S.  RELEASED ON NCAR'S PUBLIC SOFTWARE
    C                        LIBRARIES IN JANUARY, 1980.
    C
    C PORTABILITY            FORTRAN 77
    C
    C ALGORITHM              THIS SUBROUTINE SOLVES THREE-DIMENSIONAL BLOCK
    C                        TRIDIAGONAL LINEAR SYSTEMS ARISING FROM FINITE
    C                        DIFFERENCE APPROXIMATIONS TO THREE-DIMENSIONAL
    C                        POISSON EQUATIONS USING THE FFT PACKAGE
    C                        FFTPACK WRITTEN BY PAUL SWARZTRAUBER.
    C
    C TIMING                 FOR LARGE L, M AND N, THE OPERATION COUNT
    C                        IS ROUGHLY PROPORTIONAL TO
    C                          L*M*N*(LOG2(L)+LOG2(M)+5)
    C                        BUT ALSO DEPENDS ON INPUT PARAMETERS LPEROD
    C                        AND MPEROD.
    C
    C ACCURACY               TO MEASURE THE ACCURACY OF THE ALGORITHM A
    C                        UNIFORM RANDOM NUMBER GENERATOR WAS USED TO
    C                        CREATE A SOLUTION ARRAY X FOR THE SYSTEM GIVEN
    C                        IN THE 'PURPOSE' SECTION WITH
    C                          A(K) = C(K) = -0.5*B(K) = 1,  K=1,2,...,N
    C                        AND, WHEN NPEROD = 1
    C                          A(1) = C(N) = 0
    C                          A(N) = C(1) = 2.
    C
    C                        THE SOLUTION X WAS SUBSTITUTED INTO THE GIVEN
    C                        SYSTEM AND, USING DOUBLE PRECISION, A RIGHT
    C                        SIDE Y WAS COMPUTED.  USING THIS ARRAY Y
    C                        SUBROUTINE POIS3D WAS CALLED TO PRODUCE AN
    C                        APPROXIMATE SOLUTION Z.  RELATIVE ERROR
    C
    C                        E = MAX(ABS(Z(I,J,K)-X(I,J,K)))/MAX(ABS(X(I,J,K
    C
    C                        WAS COMPUTED, WHERE THE TWO MAXIMA ARE TAKEN
    C                        OVER I=1,2,...,L, J=1,2,...,M AND K=1,2,...,N.
    C                        VALUES OF E ARE GIVEN IN THE TABLE BELOW FOR
    C                        SOME TYPICAL VALUES OF L,M AND N.
    C
    C                        L(=M=N)   LPEROD    MPEROD       E
    C                        ------    ------    ------     ------
    C
    C                          16        0         0        1.E-13
    C                          15        1         1        4.E-13
    C                          17        3         3        2.E-13
    C                          32        0         0        2.E-13
    C                          31        1         1        2.E-12
    C                          33        3         3        7.E-13
    C
    C REFERENCES              NONE
    C ********************************************************************

POISTG

          SUBROUTINE POISTG (NPEROD,N,MPEROD,M,A,B,C,IDIMY,Y,IERROR,W)
    C
    C     * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
    C     *                                                               *
    C     *                  copyright (c) 1999 by UCAR                   *
    C     *                                                               *
    C     *       UNIVERSITY CORPORATION for ATMOSPHERIC RESEARCH         *
    C     *                                                               *
    C     *                      all rights reserved                      *
    C     *                                                               *
    C     *                      FISHPACK version 4.1                     *
    C     *                                                               *
    C     *     A PACKAGE OF FORTRAN SUBPROGRAMS FOR THE SOLUTION OF      *
    C     *                                                               *
    C     *      SEPARABLE ELLIPTIC PARTIAL DIFFERENTIAL EQUATIONS        *
    C     *                                                               *
    C     *                             BY                                *
    C     *                                                               *
    C     *        JOHN ADAMS, PAUL SWARZTRAUBER AND ROLAND SWEET         *
    C     *                                                               *
    C     *                             OF                                *
    C     *                                                               *
    C     *         THE NATIONAL CENTER FOR ATMOSPHERIC RESEARCH          *
    C     *                                                               *
    C     *                BOULDER, COLORADO  (80307)  U.S.A.             *
    C     *                                                               *
    C     *                   WHICH IS SPONSORED BY                       *
    C     *                                                               *
    C     *              THE NATIONAL SCIENCE FOUNDATION                  *
    C     *                                                               *
    C     * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
    C
    C
    C
    C DIMENSION OF           A(M),  B(M),  C(M),  Y(IDIMY,N),
    C ARGUMENTS              W(SEE ARGUMENT LIST)
    C
    C LATEST REVISION        NOVEMBER 1988
    C
    C PURPOSE                SOLVES THE LINEAR SYSTEM OF EQUATIONS
    C                        FOR UNKNOWN X VALUES, WHERE I=1,2,...,M
    C                        AND J=1,2,...,N
    C
    C                        A(I)*X(I-1,J) + B(I)*X(I,J) + C(I)*X(I+1,J)
    C                        + X(I,J-1) - 2.*X(I,J) + X(I,J+1)
    C                        = Y(I,J)
    C
    C                        THE INDICES I+1 AND I-1 ARE EVALUATED MODULO M,
    C                        I.E. X(0,J) = X(M,J) AND X(M+1,J) = X(1,J), AND
    C                        X(I,0) MAY BE EQUAL TO X(I,1) OR -X(I,1), AND
    C                        X(I,N+1) MAY BE EQUAL TO X(I,N) OR -X(I,N),
    C                        DEPENDING ON AN INPUT PARAMETER.
    C
    C USAGE                  CALL POISTG (NPEROD,N,MPEROD,M,A,B,C,IDIMY,Y,
    C                                     IERROR,W)
    C
    C ARGUMENTS
    C
    C ON INPUT
    C
    C                        NPEROD
    C                          INDICATES VALUES WHICH X(I,0) AND X(I,N+1)
    C                          ARE ASSUMED TO HAVE.
    C                          = 1 IF X(I,0) = -X(I,1) AND X(I,N+1) = -X(I,N
    C                          = 2 IF X(I,0) = -X(I,1) AND X(I,N+1) =  X(I,N
    C                          = 3 IF X(I,0) =  X(I,1) AND X(I,N+1) =  X(I,N
    C                          = 4 IF X(I,0) =  X(I,1) AND X(I,N+1) = -X(I,N
    C
    C                        N
    C                          THE NUMBER OF UNKNOWNS IN THE J-DIRECTION.
    C                          N MUST BE GREATER THAN 2.
    C
    C                        MPEROD
    C                          = 0 IF A(1) AND C(M) ARE NOT ZERO
    C                          = 1 IF A(1) = C(M) = 0
    C
    C                        M
    C                          THE NUMBER OF UNKNOWNS IN THE I-DIRECTION.
    C                          M MUST BE GREATER THAN 2.
    C
    C                        A,B,C
    C                          ONE-DIMENSIONAL ARRAYS OF LENGTH M THAT
    C                          SPECIFY THE COEFFICIENTS IN THE LINEAR
    C                          EQUATIONS GIVEN ABOVE.  IF MPEROD = 0 THE
    C                          ARRAY ELEMENTS MUST NOT DEPEND ON INDEX I,
    C                          BUT MUST BE CONSTANT.  SPECIFICALLY, THE
    C                          SUBROUTINE CHECKS THE FOLLOWING CONDITION
    C                            A(I) = C(1)
    C                            B(I) = B(1)
    C                            C(I) = C(1)
    C                          FOR I = 1, 2, ..., M.
    C
    C                        IDIMY
    C                          THE ROW (OR FIRST) DIMENSION OF THE TWO-
    C                          DIMENSIONAL ARRAY Y AS IT APPEARS IN THE
    C                          PROGRAM CALLING POISTG.  THIS PARAMETER IS
    C                          USED TO SPECIFY THE VARIABLE DIMENSION OF Y.
    C                          IDIMY MUST BE AT LEAST M.
    C
    C                        Y
    C                          A TWO-DIMENSIONAL ARRAY THAT SPECIFIES THE
    C                          VALUES OF THE RIGHT SIDE OF THE LINEAR SYSTEM
    C                          OF EQUATIONS GIVEN ABOVE.
    C                          Y MUST BE DIMENSIONED AT LEAST M X N.
    C
    C                        W
    C                          A ONE-DIMENSIONAL WORK ARRAY THAT MUST BE
    C                          PROVIDED BY THE USER FOR WORK SPACE.  W MAY
    C                          REQUIRE UP TO 9M + 4N + M(INT(LOG2(N)))
    C                          LOCATIONS.  THE ACTUAL NUMBER OF LOCATIONS
    C                          USED IS COMPUTED BY POISTG AND RETURNED IN
    C                          LOCATION W(1).
    C
    C ON OUTPUT
    C
    C                        Y
    C                          CONTAINS THE SOLUTION X.
    C
    C                        IERROR
    C                          AN ERROR FLAG THAT INDICATES INVALID INPUT
    C                          PARAMETERS.  EXCEPT FOR NUMBER ZERO, A
    C                          SOLUTION IS NOT ATTEMPTED.
    C                          = 0  NO ERROR
    C                          = 1  IF M .LE. 2
    C                          = 2  IF N .LE. 2
    C                          = 3  IDIMY .LT. M
    C                          = 4  IF NPEROD .LT. 1 OR NPEROD .GT. 4
    C                          = 5  IF MPEROD .LT. 0 OR MPEROD .GT. 1
    C                          = 6  IF MPEROD = 0 AND A(I) .NE. C(1)
    C                               OR B(I) .NE. B(1) OR C(I) .NE. C(1)
    C                               FOR SOME I = 1, 2, ..., M.
    C                          = 7  IF MPEROD .EQ. 1 .AND.
    C                               (A(1).NE.0 .OR. C(M).NE.0)
    C
    C                        W
    C                          W(1) CONTAINS THE REQUIRED LENGTH OF W.
    C
    C
    C I/O                    NONE
    C
    C PRECISION              SINGLE
    C
    C REQUIRED LIBRARY       GNBNAUX AND COMF FROM FISHPAK
    C FILES
    C
    C LANGUAGE               FORTRAN
    C
    C HISTORY                WRITTEN BY ROLAND SWEET AT NCAR IN THE LATE
    C                        1970'S.  RELEASED ON NCAR'S PUBLIC SOFTWARE
    C                        LIBRARIES IN JANUARY, 1980.
    C
    C PORTABILITY            FORTRAN 77
    C
    C ALGORITHM              THIS SUBROUTINE IS AN IMPLEMENTATION OF THE
    C                        ALGORITHM PRESENTED IN THE REFERENCE BELOW.
    C
    C TIMING                 FOR LARGE M AND N, THE EXECUTION TIME IS
    C                        ROUGHLY PROPORTIONAL TO M*N*LOG2(N).
    C
    C ACCURACY               TO MEASURE THE ACCURACY OF THE ALGORITHM A
    C                        UNIFORM RANDOM NUMBER GENERATOR WAS USED TO
    C                        CREATE A SOLUTION ARRAY X FOR THE SYSTEM GIVEN
    C                        IN THE 'PURPOSE' SECTION ABOVE, WITH
    C                          A(I) = C(I) = -0.5*B(I) = 1,    I=1,2,...,M
    C                        AND, WHEN MPEROD = 1
    C                          A(1) = C(M) = 0
    C                          B(1) = B(M) =-1.
    C
    C                        THE SOLUTION X WAS SUBSTITUTED INTO THE GIVEN
    C                        SYSTEM AND, USING DOUBLE PRECISION, A RIGHT SID
    C                        Y WAS COMPUTED.  USING THIS ARRAY Y SUBROUTINE
    C                        POISTG WAS CALLED TO PRODUCE AN APPROXIMATE
    C                        SOLUTION Z.  THEN THE RELATIVE ERROR, DEFINED A
    C                          E = MAX(ABS(Z(I,J)-X(I,J)))/MAX(ABS(X(I,J)))
    C                        WHERE THE TWO MAXIMA ARE TAKEN OVER I=1,2,...,M
    C                        AND J=1,2,...,N, WAS COMPUTED.  VALUES OF E ARE
    C                        GIVEN IN THE TABLE BELOW FOR SOME TYPICAL VALUE
    C                        OF M AND N.
    C
    C                        M (=N)    MPEROD    NPEROD      E
    C                        ------    ------    ------    ------
    C
    C                          31        0-1       1-4     9.E-13
    C                          31        1         1       4.E-13
    C                          31        1         3       3.E-13
    C                          32        0-1       1-4     3.E-12
    C                          32        1         1       3.E-13
    C                          32        1         3       1.E-13
    C                          33        0-1       1-4     1.E-12
    C                          33        1         1       4.E-13
    C                          33        1         3       1.E-13
    C                          63        0-1       1-4     3.E-12
    C                          63        1         1       1.E-12
    C                          63        1         3       2.E-13
    C                          64        0-1       1-4     4.E-12
    C                          64        1         1       1.E-12
    C                          64        1         3       6.E-13
    C                          65        0-1       1-4     2.E-13
    C                          65        1         1       1.E-11
    C                          65        1         3       4.E-13
    C
    C REFERENCES             SCHUMANN, U. AND R. SWEET,"A DIRECT METHOD
    C                        FOR THE SOLUTION OF POISSON"S EQUATION WITH
    C                        NEUMANN BOUNDARY CONDITIONS ON A STAGGERED
    C                        GRID OF ARBITRARY SIZE," J. COMP. PHYS.
    C                        20(1976), PP. 171-182.
    C *********************************************************************

SEPELI

          SUBROUTINE SEPELI (INTL,IORDER,A,B,M,MBDCND,BDA,ALPHA,BDB,BETA,C,
         1                   D,N,NBDCND,BDC,GAMA,BDD,XNU,COFX,COFY,GRHS,
         2                   USOL,IDMN,W,PERTRB,IERROR)
    C
    C     * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
    C     *                                                               *
    C     *                  copyright (c) 1999 by UCAR                   *
    C     *                                                               *
    C     *       UNIVERSITY CORPORATION for ATMOSPHERIC RESEARCH         *
    C     *                                                               *
    C     *                      all rights reserved                      *
    C     *                                                               *
    C     *                      FISHPACK version 4.1                     *
    C     *                                                               *
    C     *     A PACKAGE OF FORTRAN SUBPROGRAMS FOR THE SOLUTION OF      *
    C     *                                                               *
    C     *      SEPARABLE ELLIPTIC PARTIAL DIFFERENTIAL EQUATIONS        *
    C     *                                                               *
    C     *                             BY                                *
    C     *                                                               *
    C     *        JOHN ADAMS, PAUL SWARZTRAUBER AND ROLAND SWEET         *
    C     *                                                               *
    C     *                             OF                                *
    C     *                                                               *
    C     *         THE NATIONAL CENTER FOR ATMOSPHERIC RESEARCH          *
    C     *                                                               *
    C     *                BOULDER, COLORADO  (80307)  U.S.A.             *
    C     *                                                               *
    C     *                   WHICH IS SPONSORED BY                       *
    C     *                                                               *
    C     *              THE NATIONAL SCIENCE FOUNDATION                  *
    C     *                                                               *
    C     * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
    C
    C
    C
    C DIMENSION OF           BDA(N+1), BDB(N+1), BDC(M+1), BDD(M+1),
    C ARGUMENTS              USOL(IDMN,N+1),GRHS(IDMN,N+1),
    C                        W (SEE ARGUMENT LIST)
    C
    C LATEST REVISION        NOVEMBER 1988
    C
    C PURPOSE                SEPELI SOLVES FOR EITHER THE SECOND-ORDER
    C                        FINITE DIFFERENCE APPROXIMATION OR A
    C                        FOURTH-ORDER APPROXIMATION TO A SEPARABLE
    C                        ELLIPTIC EQUATION
    C
    C                          2    2
    C                          AF(X)*D U/DX + BF(X)*DU/DX  + CF(X)*U +
    C                          2    2
    C                          DF(Y)*D U/DY  + EF(Y)*DU/DY + FF(Y)*U
    C
    C                          = G(X,Y)
    C
    C                        ON A RECTANGLE (X GREATER THAN OR EQUAL TO A
    C                        AND LESS THAN OR EQUAL TO B; Y GREATER THAN
    C                        OR EQUAL TO C AND LESS THAN OR EQUAL TO D).
    C                        ANY COMBINATION OF PERIODIC OR MIXED BOUNDARY
    C                        CONDITIONS IS ALLOWED.
    C
    C                        THE POSSIBLE BOUNDARY CONDITIONS ARE:
    C                        IN THE X-DIRECTION:
    C                        (0) PERIODIC, U(X+B-A,Y)=U(X,Y) FOR ALL
    C                            Y,X (1) U(A,Y), U(B,Y) ARE SPECIFIED FOR
    C                            ALL Y
    C                        (2) U(A,Y), DU(B,Y)/DX+BETA*U(B,Y) ARE
    C                            SPECIFIED FOR ALL Y
    C                        (3) DU(A,Y)/DX+ALPHA*U(A,Y),DU(B,Y)/DX+
    C                            BETA*U(B,Y) ARE SPECIFIED FOR ALL Y
    C                        (4) DU(A,Y)/DX+ALPHA*U(A,Y),U(B,Y) ARE
    C                            SPECIFIED FOR ALL Y
    C
    C                        IN THE Y-DIRECTION:
    C                        (0) PERIODIC, U(X,Y+D-C)=U(X,Y) FOR ALL X,Y
    C                        (1) U(X,C),U(X,D) ARE SPECIFIED FOR ALL X
    C                        (2) U(X,C),DU(X,D)/DY+XNU*U(X,D) ARE
    C                            SPECIFIED FOR ALL X
    C                        (3) DU(X,C)/DY+GAMA*U(X,C),DU(X,D)/DY+
    C                            XNU*U(X,D) ARE SPECIFIED FOR ALL X
    C                        (4) DU(X,C)/DY+GAMA*U(X,C),U(X,D) ARE
    C                            SPECIFIED FOR ALL X
    C
    C USAGE                  CALL SEPELI (INTL,IORDER,A,B,M,MBDCND,BDA,
    C                                     ALPHA,BDB,BETA,C,D,N,NBDCND,BDC,
    C                                     GAMA,BDD,XNU,COFX,COFY,GRHS,USOL,
    C                                     IDMN,W,PERTRB,IERROR)
    C
    C ARGUMENTS
    C ON INPUT               INTL
    C                          = 0 ON INITIAL ENTRY TO SEPELI OR IF ANY
    C                              OF THE ARGUMENTS C,D, N, NBDCND, COFY
    C                              ARE CHANGED FROM A PREVIOUS CALL
    C                          = 1 IF C, D, N, NBDCND, COFY ARE UNCHANGED
    C                              FROM THE PREVIOUS CALL.
    C
    C                        IORDER
    C                          = 2 IF A SECOND-ORDER APPROXIMATION
    C                              IS SOUGHT
    C                          = 4 IF A FOURTH-ORDER APPROXIMATION
    C                              IS SOUGHT
    C
    C                        A,B
    C                          THE RANGE OF THE X-INDEPENDENT VARIABLE,
    C                          I.E., X IS GREATER THAN OR EQUAL TO A
    C                          AND LESS THAN OR EQUAL TO B.  A MUST BE
    C                          LESS THAN B.
    C
    C                        M
    C                          THE NUMBER OF PANELS INTO WHICH THE
    C                          INTERVAL [A,B] IS SUBDIVIDED. HENCE,
    C                          THERE WILL BE M+1 GRID POINTS IN THE X-
    C                          DIRECTION GIVEN BY XI=A+(I-1)*DLX
    C                          FOR I=1,2,...,M+1 WHERE DLX=(B-A)/M IS
    C                          THE PANEL WIDTH.  M MUST BE LESS THAN
    C                          IDMN AND GREATER THAN 5.
    C
    C                        MBDCND
    C                          INDICATES THE TYPE OF BOUNDARY CONDITION
    C                          AT X=A AND X=B
    C
    C                          = 0 IF THE SOLUTION IS PERIODIC IN X, I.E.,
    C                              U(X+B-A,Y)=U(X,Y)  FOR ALL Y,X
    C                          = 1 IF THE SOLUTION IS SPECIFIED AT X=A
    C                              AND X=B, I.E., U(A,Y) AND U(B,Y) ARE
    C                              SPECIFIED FOR ALL Y
    C                          = 2 IF THE SOLUTION IS SPECIFIED AT X=A AND
    C                              THE BOUNDARY CONDITION IS MIXED AT X=B,
    C                              I.E., U(A,Y) AND DU(B,Y)/DX+BETA*U(B,Y)
    C                              ARE SPECIFIED FOR ALL Y
    C                          = 3 IF THE BOUNDARY CONDITIONS AT X=A AND
    C                              X=B ARE MIXED, I.E.,
    C                              DU(A,Y)/DX+ALPHA*U(A,Y) AND
    C                              DU(B,Y)/DX+BETA*U(B,Y) ARE SPECIFIED
    C                              FOR ALL Y
    C                          = 4 IF THE BOUNDARY CONDITION AT X=A IS
    C                              MIXED AND THE SOLUTION IS SPECIFIED
    C                              AT X=B, I.E., DU(A,Y)/DX+ALPHA*U(A,Y)
    C                              AND U(B,Y) ARE SPECIFIED FOR ALL Y
    C
    C                        BDA
    C                          A ONE-DIMENSIONAL ARRAY OF LENGTH N+1
    C                          THAT SPECIFIES THE VALUES OF
    C                          DU(A,Y)/DX+ ALPHA*U(A,Y) AT X=A, WHEN
    C                          MBDCND=3 OR 4.
    C                          BDA(J) = DU(A,YJ)/DX+ALPHA*U(A,YJ),
    C                          J=1,2,...,N+1. WHEN MBDCND HAS ANY OTHER
    C                          OTHER VALUE, BDA IS A DUMMY PARAMETER.
    C
    C                        ALPHA
    C                          THE SCALAR MULTIPLYING THE SOLUTION IN
    C                          CASE OF A MIXED BOUNDARY CONDITION AT X=A
    C                          (SEE ARGUMENT BDA).  IF MBDCND IS NOT
    C                          EQUAL TO 3 OR 4 THEN ALPHA IS A DUMMY
    C                          PARAMETER.
    C
    C                        BDB
    C                          A ONE-DIMENSIONAL ARRAY OF LENGTH N+1
    C                          THAT SPECIFIES THE VALUES OF
    C                          DU(B,Y)/DX+ BETA*U(B,Y) AT X=B.
    C                          WHEN MBDCND=2 OR 3
    C                          BDB(J) = DU(B,YJ)/DX+BETA*U(B,YJ),
    C                          J=1,2,...,N+1. WHEN MBDCND HAS ANY OTHER
    C                          OTHER VALUE, BDB IS A DUMMY PARAMETER.
    C
    C                        BETA
    C                          THE SCALAR MULTIPLYING THE SOLUTION IN
    C                          CASE OF A MIXED BOUNDARY CONDITION AT
    C                          X=B (SEE ARGUMENT BDB).  IF MBDCND IS
    C                          NOT EQUAL TO 2 OR 3 THEN BETA IS A DUMMY
    C                          PARAMETER.
    C
    C                        C,D
    C                          THE RANGE OF THE Y-INDEPENDENT VARIABLE,
    C                          I.E., Y IS GREATER THAN OR EQUAL TO C
    C                          AND LESS THAN OR EQUAL TO D.  C MUST BE
    C                          LESS THAN D.
    C
    C                        N
    C                          THE NUMBER OF PANELS INTO WHICH THE
    C                          INTERVAL [C,D] IS SUBDIVIDED.
    C                          HENCE, THERE WILL BE N+1 GRID POINTS
    C                          IN THE Y-DIRECTION GIVEN BY
    C                          YJ=C+(J-1)*DLY FOR J=1,2,...,N+1 WHERE
    C                          DLY=(D-C)/N IS THE PANEL WIDTH.
    C                          IN ADDITION, N MUST BE GREATER THAN 4.
    C
    C                        NBDCND
    C                          INDICATES THE TYPES OF BOUNDARY CONDITIONS
    C                          AT Y=C AND Y=D
    C
    C                          = 0 IF THE SOLUTION IS PERIODIC IN Y,
    C                              I.E., U(X,Y+D-C)=U(X,Y)  FOR ALL X,Y
    C                          = 1 IF THE SOLUTION IS SPECIFIED AT Y=C
    C                              AND Y = D, I.E., U(X,C) AND U(X,D)
    C                              ARE SPECIFIED FOR ALL X
    C                          = 2 IF THE SOLUTION IS SPECIFIED AT Y=C
    C                              AND THE BOUNDARY CONDITION IS MIXED
    C                              AT Y=D, I.E., U(X,C) AND
    C                              DU(X,D)/DY+XNU*U(X,D) ARE SPECIFIED
    C                              FOR ALL X
    C                          = 3 IF THE BOUNDARY CONDITIONS ARE MIXED
    C                              AT Y=C AND Y=D, I.E.,
    C                              DU(X,D)/DY+GAMA*U(X,C) AND
    C                              DU(X,D)/DY+XNU*U(X,D) ARE SPECIFIED
    C                              FOR ALL X
    C                          = 4 IF THE BOUNDARY CONDITION IS MIXED
    C                              AT Y=C AND THE SOLUTION IS SPECIFIED
    C                              AT Y=D, I.E. DU(X,C)/DY+GAMA*U(X,C)
    C                              AND U(X,D) ARE SPECIFIED FOR ALL X
    C
    C                        BDC
    C                          A ONE-DIMENSIONAL ARRAY OF LENGTH M+1
    C                          THAT SPECIFIES THE VALUE OF
    C                          DU(X,C)/DY+GAMA*U(X,C) AT Y=C.
    C                          WHEN NBDCND=3 OR 4 BDC(I) = DU(XI,C)/DY +
    C                          GAMA*U(XI,C), I=1,2,...,M+1.
    C                          WHEN NBDCND HAS ANY OTHER VALUE, BDC
    C                          IS A DUMMY PARAMETER.
    C
    C                        GAMA
    C                          THE SCALAR MULTIPLYING THE SOLUTION IN
    C                          CASE OF A MIXED BOUNDARY CONDITION AT
    C                          Y=C (SEE ARGUMENT BDC).  IF NBDCND IS
    C                          NOT EQUAL TO 3 OR 4 THEN GAMA IS A DUMMY
    C                          PARAMETER.
    C
    C                        BDD
    C                          A ONE-DIMENSIONAL ARRAY OF LENGTH M+1
    C                          THAT SPECIFIES THE VALUE OF
    C                          DU(X,D)/DY + XNU*U(X,D) AT Y=C.
    C                          WHEN NBDCND=2 OR 3 BDD(I) = DU(XI,D)/DY +
    C                          XNU*U(XI,D), I=1,2,...,M+1.
    C                          WHEN NBDCND HAS ANY OTHER VALUE, BDD
    C                          IS A DUMMY PARAMETER.
    C
    C                        XNU
    C                          THE SCALAR MULTIPLYING THE SOLUTION IN
    C                          CASE OF A MIXED BOUNDARY CONDITION AT
    C                          Y=D (SEE ARGUMENT BDD).  IF NBDCND IS
    C                          NOT EQUAL TO 2 OR 3 THEN XNU IS A
    C                          DUMMY PARAMETER.
    C
    C                        COFX
    C                          A USER-SUPPLIED SUBPROGRAM WITH
    C                          PARAMETERS X, AFUN, BFUN, CFUN WHICH
    C                          RETURNS THE VALUES OF THE X-DEPENDENT
    C                          COEFFICIENTS AF(X), BF(X), CF(X) IN THE
    C                          ELLIPTIC EQUATION AT X.
    C
    C                        COFY
    C                          A USER-SUPPLIED SUBPROGRAM WITH PARAMETERS
    C                          Y, DFUN, EFUN, FFUN WHICH RETURNS THE
    C                          VALUES OF THE Y-DEPENDENT COEFFICIENTS
    C                          DF(Y), EF(Y), FF(Y) IN THE ELLIPTIC
    C                          EQUATION AT Y.
    C
    C                          NOTE:  COFX AND COFY MUST BE DECLARED
    C                          EXTERNAL IN THE CALLING ROUTINE.
    C                          THE VALUES RETURNED IN AFUN AND DFUN
    C                          MUST SATISFY AFUN*DFUN GREATER THAN 0
    C                          FOR A LESS THAN X LESS THAN B, C LESS
    C                          THAN Y LESS THAN D (SEE IERROR=10).
    C                          THE COEFFICIENTS PROVIDED MAY LEAD TO A
    C                          MATRIX EQUATION WHICH IS NOT DIAGONALLY
    C                          DOMINANT IN WHICH CASE SOLUTION MAY FAIL
    C                          (SEE IERROR=4).
    C
    C                        GRHS
    C                          A TWO-DIMENSIONAL ARRAY THAT SPECIFIES THE
    C                          VALUES OF THE RIGHT-HAND SIDE OF THE
    C                          ELLIPTIC EQUATION, I.E.,
    C                          GRHS(I,J)=G(XI,YI), FOR I=2,...,M,
    C                          J=2,...,N.  AT THE BOUNDARIES, GRHS IS
    C                          DEFINED BY
    C
    C                          MBDCND   GRHS(1,J)   GRHS(M+1,J)
    C                          ------   ---------   -----------
    C                            0      G(A,YJ)     G(B,YJ)
    C                            1         *           *
    C                            2         *        G(B,YJ)  J=1,2,...,N+1
    C                            3      G(A,YJ)     G(B,YJ)
    C                            4      G(A,YJ)        *
    C
    C                          NBDCND   GRHS(I,1)   GRHS(I,N+1)
    C                          ------   ---------   -----------
    C                            0      G(XI,C)     G(XI,D)
    C                            1         *           *
    C                            2         *        G(XI,D)  I=1,2,...,M+1
    C                            3      G(XI,C)     G(XI,D)
    C                            4      G(XI,C)        *
    C
    C                          WHERE * MEANS THESE QUANTITIES ARE NOT USED.
    C                          GRHS SHOULD BE DIMENSIONED IDMN BY AT LEAST
    C                          N+1 IN THE CALLING ROUTINE.
    C
    C                        USOL
    C                          A TWO-DIMENSIONAL ARRAY THAT SPECIFIES THE
    C                          VALUES OF THE SOLUTION ALONG THE BOUNDARIES.
    C                          AT THE BOUNDARIES, USOL IS DEFINED BY
    C
    C                          MBDCND   USOL(1,J)   USOL(M+1,J)
    C                          ------   ---------   -----------
    C                            0         *           *
    C                            1      U(A,YJ)     U(B,YJ)
    C                            2      U(A,YJ)        *     J=1,2,...,N+1
    C                            3         *           *
    C                            4         *        U(B,YJ)
    C
    C                          NBDCND   USOL(I,1)   USOL(I,N+1)
    C                          ------   ---------   -----------
    C                            0         *           *
    C                            1      U(XI,C)     U(XI,D)
    C                            2      U(XI,C)        *     I=1,2,...,M+1
    C                            3         *           *
    C                            4         *        U(XI,D)
    C
    C                          WHERE * MEANS THE QUANTITIES ARE NOT USED
    C                          IN THE SOLUTION.
    C
    C                          IF IORDER=2, THE USER MAY EQUIVALENCE GRHS
    C                          AND USOL TO SAVE SPACE.  NOTE THAT IN THIS
    C                          CASE THE TABLES SPECIFYING THE BOUNDARIES
    C                          OF THE GRHS AND USOL ARRAYS DETERMINE THE
    C                          BOUNDARIES UNIQUELY EXCEPT AT THE CORNERS.
    C                          IF THE TABLES CALL FOR BOTH G(X,Y) AND
    C                          U(X,Y) AT A CORNER THEN THE SOLUTION MUST
    C                          BE CHOSEN.  FOR EXAMPLE, IF MBDCND=2 AND
    C                          NBDCND=4, THEN U(A,C), U(A,D), U(B,D) MUST
    C                          BE CHOSEN AT THE CORNERS IN ADDITION
    C                          TO G(B,C).
    C
    C                          IF IORDER=4, THEN THE TWO ARRAYS, USOL AND
    C                          GRHS, MUST BE DISTINCT.
    C
    C                          USOL SHOULD BE DIMENSIONED IDMN BY AT LEAST
    C                          N+1 IN THE CALLING ROUTINE.
    C
    C                        IDMN
    C                          THE ROW (OR FIRST) DIMENSION OF THE ARRAYS
    C                          GRHS AND USOL AS IT APPEARS IN THE PROGRAM
    C                          CALLING SEPELI.  THIS PARAMETER IS USED
    C                          TO SPECIFY THE VARIABLE DIMENSION OF GRHS
    C                          AND USOL.  IDMN MUST BE AT LEAST 7 AND
    C                          GREATER THAN OR EQUAL TO M+1.
    C
    C                        W
    C                          A ONE-DIMENSIONAL ARRAY THAT MUST BE
    C                          PROVIDED BY THE USER FOR WORK SPACE.
    C                          LET K=INT(LOG2(N+1))+1 AND SET L=2**(K+1).
    C                          THEN (K-2)*L+K+10*N+12*M+27 WILL SUFFICE
    C                          AS A LENGTH OF W.  THE ACTUAL LENGTH OF W
    C                          IN THE CALLING ROUTINE MUST BE SET IN W(1)
    C                          (SEE IERROR=11).
    C
    C ON OUTPUT              USOL
    C                          CONTAINS THE APPROXIMATE SOLUTION TO THE
    C                          ELLIPTIC EQUATION.
    C                          USOL(I,J) IS THE APPROXIMATION TO U(XI,YJ)
    C                          FOR I=1,2...,M+1 AND J=1,2,...,N+1.
    C                          THE APPROXIMATION HAS ERROR
    C                          O(DLX**2+DLY**2) IF CALLED WITH IORDER=2
    C                          AND O(DLX**4+DLY**4) IF CALLED WITH
    C                          IORDER=4.
    C
    C                        W
    C                          CONTAINS INTERMEDIATE VALUES THAT MUST NOT
    C                          BE DESTROYED IF SEPELI IS CALLED AGAIN WITH
    C                          INTL=1.  IN ADDITION W(1) CONTAINS THE
    C                          EXACT MINIMAL LENGTH (IN FLOATING POINT)
    C                          REQUIRED FOR THE WORK SPACE (SEE IERROR=11).
    C
    C                        PERTRB
    C                          IF A COMBINATION OF PERIODIC OR DERIVATIVE
    C                          BOUNDARY CONDITIONS
    C                          (I.E., ALPHA=BETA=0 IF MBDCND=3;
    C                          GAMA=XNU=0 IF NBDCND=3) IS SPECIFIED
    C                          AND IF THE COEFFICIENTS OF U(X,Y) IN THE
    C                          SEPARABLE ELLIPTIC EQUATION ARE ZERO
    C                          (I.E., CF(X)=0 FOR X GREATER THAN OR EQUAL
    C                          TO A AND LESS THAN OR EQUAL TO B;
    C                          FF(Y)=0 FOR Y GREATER THAN OR EQUAL TO C
    C                          AND LESS THAN OR EQUAL TO D) THEN A
    C                          SOLUTION MAY NOT EXIST.  PERTRB IS A
    C                          CONSTANT CALCULATED AND SUBTRACTED FROM
    C                          THE RIGHT-HAND SIDE OF THE MATRIX EQUATIONS
    C                          GENERATED BY SEPELI WHICH INSURES THAT A
    C                          SOLUTION EXISTS. SEPELI THEN COMPUTES THIS
    C                          SOLUTION WHICH IS A WEIGHTED MINIMAL LEAST
    C                          SQUARES SOLUTION TO THE ORIGINAL PROBLEM.
    C
    C                        IERROR
    C                          AN ERROR FLAG THAT INDICATES INVALID INPUT
    C                          PARAMETERS OR FAILURE TO FIND A SOLUTION
    C                          = 0 NO ERROR
    C                          = 1 IF A GREATER THAN B OR C GREATER THAN D
    C                          = 2 IF MBDCND LESS THAN 0 OR MBDCND GREATER
    C                              THAN 4
    C                          = 3 IF NBDCND LESS THAN 0 OR NBDCND GREATER
    C                              THAN 4
    C                          = 4 IF ATTEMPT TO FIND A SOLUTION FAILS.
    C                              (THE LINEAR SYSTEM GENERATED IS NOT
    C                              DIAGONALLY DOMINANT.)
    C                          = 5 IF IDMN IS TOO SMALL
    C                              (SEE DISCUSSION OF IDMN)
    C                          = 6 IF M IS TOO SMALL OR TOO LARGE
    C                              (SEE DISCUSSION OF M)
    C                          = 7 IF N IS TOO SMALL (SEE DISCUSSION OF N)
    C                          = 8 IF IORDER IS NOT 2 OR 4
    C                          = 9 IF INTL IS NOT 0 OR 1
    C                          = 10 IF AFUN*DFUN LESS THAN OR EQUAL TO 0
    C                               FOR SOME INTERIOR MESH POINT (XI,YJ)
    C                          = 11 IF THE WORK SPACE LENGTH INPUT IN W(1)
    C                               IS LESS THAN THE EXACT MINIMAL WORK
    C                               SPACE LENGTH REQUIRED OUTPUT IN W(1).
    C
    C                          NOTE (CONCERNING IERROR=4):  FOR THE
    C                          COEFFICIENTS INPUT THROUGH COFX, COFY,
    C                          THE DISCRETIZATION MAY LEAD TO A BLOCK
    C                          TRIDIAGONAL LINEAR SYSTEM WHICH IS NOT
    C                          DIAGONALLY DOMINANT (FOR EXAMPLE, THIS
    C                          HAPPENS IF CFUN=0 AND BFUN/(2.*DLX) GREATER
    C                          THAN AFUN/DLX**2).  IN THIS CASE SOLUTION
    C                          MAY FAIL.  THIS CANNOT HAPPEN IN THE LIMIT
    C                          AS DLX, DLY APPROACH ZERO.  HENCE, THE
    C                          CONDITION MAY BE REMEDIED BY TAKING LARGER
    C                          VALUES FOR M OR N.
    C
    C SPECIAL CONDITIONS     SEE COFX, COFY ARGUMENT DESCRIPTIONS ABOVE.
    C
    C I/O                    NONE
    C
    C PRECISION              SINGLE
    C
    C REQUIRED LIBRARY       BLKTRI, COMF, AND SEPAUX
    C FILES                  FROM FISHPAK
    C
    C LANGUAGE               FORTRAN
    C
    C HISTORY                DEVELOPED AT NCAR DURING 1975-76 BY
    C                        JOHN C. ADAMS OF THE SCIENTIFIC COMPUTING
    C                        DIVISION.  RELEASED ON NCAR'S PUBLIC SOFTWARE
    C                        LIBRARIES IN JANUARY 1980.
    C
    C PORTABILITY            FORTRAN 77
    C
    C ALGORITHM              SEPELI AUTOMATICALLY DISCRETIZES THE
    C                        SEPARABLE ELLIPTIC EQUATION WHICH IS THEN
    C                        SOLVED BY A GENERALIZED CYCLIC REDUCTION
    C                        ALGORITHM IN THE SUBROUTINE, BLKTRI.  THE
    C                        FOURTH-ORDER SOLUTION IS OBTAINED USING
    C                        'DEFERRED CORRECTIONS' WHICH IS DESCRIBED
    C                        AND REFERENCED IN SECTIONS, REFERENCES AND
    C                        METHOD.
    C
    C TIMING                 THE OPERATIONAL COUNT IS PROPORTIONAL TO
    C                        M*N*LOG2(N).
    C
    C ACCURACY               THE FOLLOWING ACCURACY RESULTS WERE OBTAINED
    C                        ON A CDC 7600.  NOTE THAT THE FOURTH-ORDER
    C                        ACCURACY IS NOT REALIZED UNTIL THE MESH IS
    C                        SUFFICIENTLY REFINED.
    C
    C                                     SECOND-ORDER  FOURTH-ORDER
    C                            M    N     ERROR         ERROR
    C
    C                             6    6    6.8E-1        1.2E0
    C                            14   14    1.4E-1        1.8E-1
    C                            30   30    3.2E-2        9.7E-3
    C                            62   62    7.5E-3        3.0E-4
    C                           126  126    1.8E-3        3.5E-6
    C
    C
    C REFERENCES             KELLER, H.B., NUMERICAL METHODS FOR TWO-POINT
    C                        BOUNDARY-VALUE PROBLEMS, BLAISDEL (1968),
    C                        WALTHAM, MASS.
    C
    C                        SWARZTRAUBER, P., AND R. SWEET (1975):
    C                        EFFICIENT FORTRAN SUBPROGRAMS FOR THE
    C                        SOLUTION OF ELLIPTIC PARTIAL DIFFERENTIAL
    C                        EQUATIONS.  NCAR TECHNICAL NOTE
    C                        NCAR-TN/IA-109, PP. 135-137.
    C***********************************************************************

SEPX4

          SUBROUTINE SEPX4 (IORDER,A,B,M,MBDCND,BDA,ALPHA,BDB,BETA,C,D,N,
         1                  NBDCND,BDC,BDD,COFX,GRHS,USOL,IDMN,W,PERTRB,
         2                  IERROR)
    C
    C     * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
    C     *                                                               *
    C     *                  copyright (c) 1999 by UCAR                   *
    C     *                                                               *
    C     *       UNIVERSITY CORPORATION for ATMOSPHERIC RESEARCH         *
    C     *                                                               *
    C     *                      all rights reserved                      *
    C     *                                                               *
    C     *                      FISHPACK version 4.1                     *
    C     *                                                               *
    C     *     A PACKAGE OF FORTRAN SUBPROGRAMS FOR THE SOLUTION OF      *
    C     *                                                               *
    C     *      SEPARABLE ELLIPTIC PARTIAL DIFFERENTIAL EQUATIONS        *
    C     *                                                               *
    C     *                             BY                                *
    C     *                                                               *
    C     *        JOHN ADAMS, PAUL SWARZTRAUBER AND ROLAND SWEET         *
    C     *                                                               *
    C     *                             OF                                *
    C     *                                                               *
    C     *         THE NATIONAL CENTER FOR ATMOSPHERIC RESEARCH          *
    C     *                                                               *
    C     *                BOULDER, COLORADO  (80307)  U.S.A.             *
    C     *                                                               *
    C     *                   WHICH IS SPONSORED BY                       *
    C     *                                                               *
    C     *              THE NATIONAL SCIENCE FOUNDATION                  *
    C     *                                                               *
    C     * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
    C
    C
    C
    C DIMENSION OF           BDA(N+1), BDB(N+1), BDC(M+1), BDD(M+1),
    C ARGUMENTS              USOL(IDMN,N+1),     GRHS(IDMN,N+1),
    C                        W (SEE ARGUMENT LIST)
    C
    C LATEST REVISION        NOVEMBER 1988
    C
    C PURPOSE                SEPX4 SOLVES FOR EITHER THE SECOND-ORDER
    C                        FINITE DIFFERENCE APPROXIMATION OR A
    C                        FOURTH-ORDER APPROXIMATION TO A SEPARABLE
    C                        ELLIPTIC EQUATION
    C
    C                          AF(X)*UXX+BF(X)*UX+CF(X)*U+UYY = G(X,Y)
    C
    C                        ON A RECTANGLE (X GREATER THAN OR EQUAL TO
    C                        A AND LESS THAN OR EQUAL TO B, Y GREATER THAN
    C                        OR EQUAL TO C AND LESS THAN OR EQUAL TO D).
    C                        ANY COMBINATION OF PERIODIC OR MIXED BOUNDARY
    C                        CONDITIONS IS ALLOWED.  IF BOUNDARY
    C                        CONDITIONS IN THE X DIRECTION ARE PERIODIC
    C                        (SEE MBDCND=0 BELOW) THEN THE COEFFICIENTS
    C                        MUST SATISFY
    C
    C                          AF(X)=C1,BF(X)=0,CF(X)=C2 FOR ALL X.
    C
    C                        HERE C1,C2 ARE CONSTANTS, C1.GT.0.
    C
    C                        THE POSSIBLE BOUNDARY CONDITIONS ARE:
    C                        IN THE X-DIRECTION:
    C                          (0) PERIODIC, U(X+B-A,Y)=U(X,Y) FOR
    C                              ALL Y,X
    C                          (1) U(A,Y), U(B,Y) ARE SPECIFIED FOR ALL Y
    C                          (2) U(A,Y), DU(B,Y)/DX+BETA*U(B,Y) ARE
    C                              SPECIFIED FOR ALL Y
    C                          (3) DU(A,Y)/DX+ALPHA*U(A,Y),DU(B,Y)/DX+
    C                              BETA*U(B,Y) ARE SPECIFIED FOR ALL Y
    C                          (4) DU(A,Y)/DX+ALPHA*U(A,Y),U(B,Y) ARE
    C                              SPECIFIED FOR ALL Y
    C
    C                        IN THE Y-DIRECTION:
    C                          (0) PERIODIC, U(X,Y+D-C)=U(X,Y) FOR ALL X,Y
    C                          (1) U(X,C),U(X,D) ARE SPECIFIED FOR ALL X
    C                          (2) U(X,C),DU(X,D)/DY ARE SPECIFIED FOR
    C                              ALL X
    C                          (3) DU(X,C)/DY,DU(X,D)/DY ARE SPECIFIED FOR
    C                              ALL X
    C                          (4) DU(X,C)/DY,U(X,D) ARE SPECIFIED FOR
    C                              ALL X
    C
    C USAGE                  CALL SEPX4(IORDER,A,B,M,MBDCND,BDA,ALPHA,BDB,
    C                                   BETA,C,D,N,NBDCND,BDC,BDD,COFX,
    C                                   GRHS,USOL,IDMN,W,PERTRB,IERROR)
    C
    C ARGUMENTS
    C ON INPUT               IORDER
    C                          = 2 IF A SECOND-ORDER APPROXIMATION IS
    C                              SOUGHT
    C                          = 4 IF A FOURTH-ORDER APPROXIMATION IS
    C                              SOUGHT
    C
    C                        A,B
    C                          THE RANGE OF THE X-INDEPENDENT VARIABLE,
    C                          I.E., X IS GREATER THAN OR EQUAL TO A
    C                          AND LESS THAN OR EQUAL TO B.  A MUST BE
    C                          LESS THAN B.
    C
    C                        M
    C                          THE NUMBER OF PANELS INTO WHICH THE
    C                          INTERVAL (A,B) IS SUBDIVIDED.  HENCE,
    C                          THERE WILL BE M+1 GRID POINTS IN THE X-
    C                          DIRECTION GIVEN BY XI=A+(I-1)*DLX
    C                          FOR I=1,2,...,M+1 WHERE DLX=(B-A)/M IS
    C                          THE PANEL WIDTH.  M MUST BE LESS THAN
    C                          IDMN AND GREATER THAN 5.
    C
    C                        MBDCND
    C                          INDICATES THE TYPE OF BOUNDARY CONDITION
    C                          AT X=A AND X=B
    C                          = 0 IF THE SOLUTION IS PERIODIC IN X, I.E.,
    C                              U(X+B-A,Y)=U(X,Y)  FOR ALL Y,X
    C                          = 1 IF THE SOLUTION IS SPECIFIED AT X=A
    C                              AND X=B, I.E., U(A,Y) AND U(B,Y) ARE
    C                              SPECIFIED FOR ALL Y
    C                          = 2 IF THE SOLUTION IS SPECIFIED AT X=A
    C                              AND THE BOUNDARY CONDITION IS MIXED AT
    C                              X=B, I.E., U(A,Y) AND
    C                              DU(B,Y)/DX+BETA*U(B,Y) ARE SPECIFIED
    C                              FOR ALL Y
    C                          = 3 IF THE BOUNDARY CONDITIONS AT X=A AND
    C                              X=B ARE MIXED, I.E.,
    C                              DU(A,Y)/DX+ALPHA*U(A,Y) AND
    C                              DU(B,Y)/DX+BETA*U(B,Y) ARE SPECIFIED
    C                              FOR ALL Y
    C                          = 4 IF THE BOUNDARY CONDITION AT X=A IS
    C                              MIXED AND THE SOLUTION IS SPECIFIED
    C                              AT X=B, I.E., DU(A,Y)/DX+ALPHA*U(A,Y)
    C                              AND U(B,Y) ARE SPECIFIED FOR ALL Y
    C
    C                        BDA
    C                          A ONE-DIMENSIONAL ARRAY OF LENGTH N+1 THAT
    C                          SPECIFIES THE VALUES OF
    C                          DU(A,Y)/DX+ ALPHA*U(A,Y) AT X=A, WHEN
    C                          MBDCND=3 OR 4.
    C                          BDA(J) = DU(A,YJ)/DX+ALPHA*U(A,YJ),
    C                          J=1,2,...,N+1
    C                          WHEN MBDCND HAS ANY OTHER VALUE, BDA IS
    C                          A DUMMY PARAMETER.
    C
    C                        ALPHA
    C                          THE SCALAR MULTIPLYING THE SOLUTION IN CASE
    C                          OF A MIXED BOUNDARY CONDITION AT X=A
    C                          (SEE ARGUMENT BDA).  IF MBDCND IS NOT EQUAL
    C                          TO EITHER 3 OR 4, THEN ALPHA IS A DUMMY
    C                          PARAMETER.
    C
    C                        BDB
    C                          A ONE-DIMENSIONAL ARRAY OF LENGTH N+1 THAT
    C                          SPECIFIES THE VALUES OF
    C                          DU(B,Y)/DX+ BETA*U(B,Y) AT X=B.
    C                          WHEN MBDCND=2 OR 3
    C                          BDB(J) = DU(B,YJ)/DX+BETA*U(B,YJ),
    C                          J=1,2,...,N+1
    C                          WHEN MBDCND HAS ANY OTHER VALUE, BDB IS
    C                          A DUMMY PARAMETER.
    C
    C                        BETA
    C                          THE SCALAR MULTIPLYING THE SOLUTION IN
    C                          CASE OF A MIXED BOUNDARY CONDITION AT X=B
    C                          (SEE ARGUMENT BDB).  IF MBDCND IS NOT EQUAL
    C                          TO 2 OR 3, THEN BETA IS A DUMMY PARAMETER.
    C
    C                        C,D
    C                          THE RANGE OF THE Y-INDEPENDENT VARIABLE,
    C                          I.E., Y IS GREATER THAN OR EQUAL TO C AND
    C                          LESS THAN OR EQUAL TO D.  C MUST BE LESS
    C                          THAN D.
    C
    C                        N
    C                          THE NUMBER OF PANELS INTO WHICH THE
    C                          INTERVAL (C,D) IS SUBDIVIDED.  HENCE,
    C                          THERE WILL BE N+1 GRID POINTS IN THE Y-
    C                          DIRECTION GIVEN BY YJ=C+(J-1)*DLY FOR
    C                          J=1,2,...,N+1 WHERE DLY=(D-C)/N IS THE
    C                          PANEL WIDTH.  IN ADDITION, N MUST BE
    C                          GREATER THAN 4.
    C
    C                        NBDCND
    C                          INDICATES THE TYPES OF BOUNDARY CONDITIONS
    C                          AT Y=C AND Y=D
    C                          = 0 IF THE SOLUTION IS PERIODIC IN Y,
    C                              I.E., U(X,Y+D-C)=U(X,Y) FOR ALL X,Y
    C                          = 1 IF THE SOLUTION IS SPECIFIED AT Y=C
    C                              AND Y = D, I.E., U(X,C)  AND U(X,D)
    C                              ARE SPECIFIED FOR ALL X
    C                          = 2 IF THE SOLUTION IS SPECIFIED AT Y=C
    C                              AND THE BOUNDARY CONDITION IS MIXED
    C                              AT Y=D, I.E., DU(X,C)/DY AND U(X,D)
    C                              ARE SPECIFIED FOR ALL X
    C                          = 3 IF THE BOUNDARY CONDITIONS ARE MIXED
    C                              AT Y=CAND Y=D I.E.,
    C                              DU(X,D)/DY AND DU(X,D)/DY ARE
    C                              SPECIFIED FOR ALL X
    C                          = 4 IF THE BOUNDARY CONDITION IS MIXED
    C                              AT Y=C AND THE SOLUTION IS SPECIFIED
    C                              AT Y=D, I.E. DU(X,C)/DY+GAMA*U(X,C)
    C                              AND U(X,D) ARE SPECIFIED FOR ALL X
    C
    C                        BDC
    C                          A ONE-DIMENSIONAL ARRAY OF LENGTH M+1 THAT
    C                          SPECIFIES THE VALUE DU(X,C)/DY AT Y=C.
    C
    C                          WHEN NBDCND=3 OR 4
    C                            BDC(I) = DU(XI,C)/DY I=1,2,...,M+1.
    C
    C                          WHEN NBDCND HAS ANY OTHER VALUE, BDC IS
    C                          A DUMMY PARAMETER.
    C
    C                        BDD
    C                          A ONE-DIMENSIONAL ARRAY OF LENGTH M+1 THAT
    C                          SPECIFIED THE VALUE OF DU(X,D)/DY AT Y=D.
    C
    C                          WHEN NBDCND=2 OR 3
    C                            BDD(I)=DU(XI,D)/DY I=1,2,...,M+1.
    C
    C                          WHEN NBDCND HAS ANY OTHER VALUE, BDD IS
    C                          A DUMMY PARAMETER.
    C
    C                        COFX
    C                          A USER-SUPPLIED SUBPROGRAM WITH PARAMETERS
    C                          X, AFUN, BFUN, CFUN WHICH RETURNS THE
    C                          VALUES OF THE X-DEPENDENT COEFFICIENTS
    C                          AF(X), BF(X), CF(X) IN THE ELLIPTIC
    C                          EQUATION AT X.  IF BOUNDARY CONDITIONS IN
    C                          THE X DIRECTION ARE PERIODIC THEN THE
    C                          COEFFICIENTS MUST SATISFY AF(X)=C1,BF(X)=0,
    C                          CF(X)=C2 FOR ALL X.  HERE C1.GT.0
    C                          AND C2 ARE CONSTANTS.
    C
    C                          NOTE THAT COFX MUST BE DECLARED EXTERNAL
    C                          IN THE CALLING ROUTINE.
    C
    C                        GRHS
    C                          A TWO-DIMENSIONAL ARRAY THAT SPECIFIES THE
    C                          VALUES OF THE RIGHT-HAND SIDE OF THE
    C                          ELLIPTIC EQUATION, I.E.,GRHS(I,J)=G(XI,YI),
    C                          FOR I=2,...,M, J=2,...,N.  AT THE
    C                          BOUNDARIES, GRHS IS DEFINED BY
    C
    C                          MBDCND   GRHS(1,J)   GRHS(M+1,J)
    C                          ------   ---------   -----------
    C                            0      G(A,YJ)     G(B,YJ)
    C                            1         *           *
    C                            2         *        G(B,YJ)  J=1,2,...,N+1
    C                            3      G(A,YJ)     G(B,YJ)
    C                            4      G(A,YJ)        *
    C
    C                          NBDCND   GRHS(I,1)   GRHS(I,N+1)
    C                          ------   ---------   -----------
    C                            0      G(XI,C)     G(XI,D)
    C                            1         *           *
    C                            2         *        G(XI,D)  I=1,2,...,M+1
    C                            3      G(XI,C)     G(XI,D)
    C                            4      G(XI,C)        *
    C
    C                          WHERE * MEANS THESE QUANTITES ARE NOT USED.
    C                          GRHS SHOULD BE DIMENSIONED IDMN BY AT LEAST
    C                          N+1 IN THE CALLING ROUTINE.
    C
    C                        USOL
    C                          A TWO-DIMENSIONAL ARRAY THAT SPECIFIES THE
    C                          VALUES OF THE SOLUTION ALONG THE BOUNDARIES.
    C                          AT THE BOUNDARIES, USOL IS DEFINED BY
    C
    C                          MBDCND   USOL(1,J)   USOL(M+1,J)
    C                          ------   ---------   -----------
    C                            0         *           *
    C                            1      U(A,YJ)     U(B,YJ)
    C                            2      U(A,YJ)        *     J=1,2,...,N+1
    C                            3         *           *
    C                            4         *        U(B,YJ)
    C
    C                          NBDCND   USOL(I,1)   USOL(I,N+1)
    C                          ------   ---------   -----------
    C                            0         *           *
    C                            1      U(XI,C)     U(XI,D)
    C                            2      U(XI,C)        *     I=1,2,...,M+1
    C                            3         *           *
    C                            4         *        U(XI,D)
    C
    C                          WHERE * MEANS THE QUANTITES ARE NOT USED
    C                          IN THE SOLUTION.
    C
    C                          IF IORDER=2, THE USER MAY EQUIVALENCE GRHS
    C                          AND USOL TO SAVE SPACE.  NOTE THAT IN THIS
    C                          CASE THE TABLES SPECIFYING THE BOUNDARIES
    C                          OF THE GRHS AND USOL ARRAYS DETERMINE THE
    C                          BOUNDARIES UNIQUELY EXCEPT AT THE CORNERS.
    C                          IF THE TABLES CALL FOR BOTH G(X,Y) AND
    C                          U(X,Y) AT A CORNER THEN THE SOLUTION MUST
    C                          BE CHOSEN.
    C                          FOR EXAMPLE, IF MBDCND=2 AND NBDCND=4,
    C                          THEN U(A,C), U(A,D),U(B,D) MUST BE CHOSEN
    C                          AT THE CORNERS IN ADDITION TO G(B,C).
    C
    C                          IF IORDER=4, THEN THE TWO ARRAYS, USOL AND
    C                          GRHS, MUST BE DISTINCT.
    C
    C                          USOL SHOULD BE DIMENSIONED IDMN BY AT LEAST
    C                          N+1 IN THE CALLING ROUTINE.
    C
    C                        IDMN
    C                          THE ROW (OR FIRST) DIMENSION OF THE ARRAYS
    C                          GRHS AND USOL AS IT APPEARS IN THE PROGRAM
    C                          CALLING SEPELI.  THIS PARAMETER IS USED
    C                          TO SPECIFY THE VARIABLE DIMENSION OF GRHS
    C                          AND USOL.  IDMN MUST BE AT LEAST 7 AND
    C                          GREATER THAN OR EQUAL TO M+1.
    C
    C                        W
    C                          A ONE-DIMENSIONAL ARRAY THAT MUST BE
    C                          PROVIDED BY THE USER FOR WORK SPACE.
    C                          10*N+(16+INT(LOG2(N+1)))*(M+1)+11 WILL
    C                          SUFFICE AS A LENGTH FOR W.  THE ACTUAL
    C                          LENGTH OF W IN THE CALLING ROUTINE
    C                          MUST BE SET IN W(1) (SEE IERROR=11).
    C
    C
    C ON OUTPUT              USOL
    C                          CONTAINS THE APPROXIMATE SOLUTION TO THE
    C                          ELLIPTIC EQUATION. USOL(I,J) IS THE
    C                          APPROXIMATION TO U(XI,YJ) FOR I=1,2...,M+1
    C                          AND J=1,2,...,N+1.  THE APPROXIMATION HAS
    C                          ERROR O(DLX**2+DLY**2) IF CALLED WITH
    C                          IORDER=2 AND O(DLX**4+DLY**4) IF CALLED
    C                          WITH IORDER=4.
    C
    C                        W
    C                          CONTAINS INTERMEDIATE VALUES THAT MUST NOT
    C                          BE DESTROYED IF SEPELI IS CALLED AGAIN
    C                          WITH INTL=1.  IN ADDITION W(1) CONTAINS
    C                          THE EXACT MINIMAL LENGTH (IN FLOATING POINT)
    C                          REQUIRED FOR THE WORK SPACE (SEE IERROR=11).
    C
    C                        PERTRB
    C                          IF A COMBINATION OF PERIODIC OR DERIVATIVE
    C                          BOUNDARY CONDITIONS (I.E., ALPHA=BETA=0 IF
    C                          MBDCND=3) IS SPECIFIED AND IF CF(X)=0 FOR
    C                          ALL X THEN A SOLUTION TO THE DISCRETIZED
    C                          MATRIX EQUATION MAY NOT EXIST
    C                          (REFLECTING THE NON-UNIQUENESS OF SOLUTIONS
    C                          TO THE PDE).
    C                          PERTRB IS A CONSTANT CALCULATED AND
    C                          SUBTRACTED FROM THE RIGHT HAND SIDE OF THE
    C                          MATRIX EQUATION INSURING THE EXISTENCE OF A
    C                          SOLUTION.  SEPX4 COMPUTES THIS SOLUTION
    C                          WHICH IS A WEIGHTED MINIMAL LEAST SQUARES
    C                          SOLUTION TO THE ORIGINAL PROBLEM.  IF
    C                          SINGULARITY IS NOT DETECTED PERTRB=0.0 IS
    C                          RETURNED BY SEPX4.
    C
    C                        IERROR
    C                          AN ERROR FLAG THAT INDICATES INVALID INPUT
    C                          PARAMETERS OR FAILURE TO FIND A SOLUTION
    C
    C                          =  0 NO ERROR
    C                          =  1 IF A GREATER THAN B OR C GREATER
    C                               THAN D
    C                          =  2 IF MBDCND LESS THAN 0 OR MBDCND
    C                               GREATER THAN 4
    C                          =  3 IF NBDCND LESS THAN 0 OR NBDCND
    C                               GREATER THAN 4
    C                          =  4 IF ATTEMPT TO FIND A SOLUTION FAILS.
    C                               (THE LINEAR SYSTEM GENERATED IS NOT
    C                               DIAGONALLY DOMINANT.)
    C                          =  5 IF IDMN IS TOO SMALL (SEE DISCUSSION
    C                               OF IDMN)
    C                          =  6 IF M IS TOO SMALL OR TOO LARGE
    C                               (SEE DISCUSSION OF M)
    C                          =  7 IF N IS TOO SMALL (SEE DISCUSSION OF N)
    C                          =  8 IF IORDER IS NOT 2 OR 4
    C                          =  9 IF INTL IS NOT 0 OR 1
    C                          = 10 IF AFUN IS LESS THAN OR EQUAL TO ZERO
    C                               FOR SOME INTERIOR MESH POINT XI SOME
    C                               INTERIOR MESH POINT (XI,YJ)
    C                          = 11 IF THE WORK SPACE LENGTH INPUT IN W(1)
    C                               IS LESS THAN THE EXACT MINIMAL WORK
    C                               SPACE LENGTH REQUIRED OUTPUT IN W(1).
    C                          = 12 IF MBDCND=0 AND AF(X)=CF(X)=CONSTANT
    C                               OR BF(X)=0 FOR ALL X IS NOT TRUE.
    C
    C SPECIAL CONDITIONS     NONE
    C
    C I/O                    NONE
    C
    C REQUIRED LIBRARY       COMF, GENBUN, GNBNAUX, AND SEPAUX
    C FILES                  FROM FISHPAK
    C
    C
    C PRECISION              SINGLE
    C
    C REQUIRED LIBRARY       NONE
    C FILES
    C
    C LANGUAGE               FORTRAN
    C
    C HISTORY                SEPX4 WAS DEVELOPED AT NCAR BY JOHN C.
    C                        ADAMS OF THE SCIENTIFIC COMPUTING DIVISION
    C                        IN OCTOBER 1978.  THE BASIS OF THIS CODE IS
    C                        NCAR ROUTINE SEPELI.  BOTH PACKAGES WERE
    C                        RELEASED ON NCAR'S PUBLIC LIBRARIES IN
    C                        JANUARY 1980.
    C
    C PORTABILITY            FORTRAN 77
    C
    C ALGORITHM              SEPX4 AUTOMATICALLY DISCRETIZES THE SEPARABLE
    C                        ELLIPTIC EQUATION WHICH IS THEN SOLVED BY A
    C                        GENERALIZED CYCLIC REDUCTION ALGORITHM IN THE
    C                        SUBROUTINE POIS.  THE FOURTH ORDER SOLUTION
    C                        IS OBTAINED USING THE TECHNIQUE OF DEFFERRED
    C                        CORRECTIONS REFERENCED BELOW.
    C
    C TIMING                 WHEN POSSIBLE, SEPX4 SHOULD BE USED INSTEAD
    C                        OF PACKAGE SEPELI.  THE INCREASE IN SPEED
    C                        IS AT LEAST A FACTOR OF THREE.
    C
    C REFERENCES             KELLER, H.B., NUMERICAL METHODS FOR TWO-POINT
    C                        BOUNDARY-VALUE PROBLEMS, BLAISDEL (1968),
    C                        WALTHAM, MASS.
    C
    C                        SWARZTRAUBER, P., AND R. SWEET (1975):
    C                        EFFICIENT FORTRAN SUBPROGRAMS FOR THE
    C                        SOLUTION OF ELLIPTIC PARTIAL DIFFERENTIAL
    C                        EQUATIONS.  NCAR TECHNICAL NOTE
    C                          NCAR-TN/IA-109, PP. 135-137.
    C***********************************************************************

TBLKTRI

    C
    C     file tblktri.f
    C
    C     * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
    C     *                                                               *
    C     *                  copyright (c) 1999 by UCAR                   *
    C     *                                                               *
    C     *       UNIVERSITY CORPORATION for ATMOSPHERIC RESEARCH         *
    C     *                                                               *
    C     *                      all rights reserved                      *
    C     *                                                               *
    C     *                      FISHPACK version 4.1                     *
    C     *                                                               *
    C     *     A PACKAGE OF FORTRAN SUBPROGRAMS FOR THE SOLUTION OF      *
    C     *                                                               *
    C     *      SEPARABLE ELLIPTIC PARTIAL DIFFERENTIAL EQUATIONS        *
    C     *                                                               *
    C     *                             BY                                *
    C     *                                                               *
    C     *        JOHN ADAMS, PAUL SWARZTRAUBER AND ROLAND SWEET         *
    C     *                                                               *
    C     *                             OF                                *
    C     *                                                               *
    C     *         THE NATIONAL CENTER FOR ATMOSPHERIC RESEARCH          *
    C     *                                                               *
    C     *                BOULDER, COLORADO  (80307)  U.S.A.             *
    C     *                                                               *
    C     *                   WHICH IS SPONSORED BY                       *
    C     *                                                               *
    C     *              THE NATIONAL SCIENCE FOUNDATION                  *
    C     *                                                               *
    C     * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
    C
    C
    C
    C     PROGRAM TO ILLUSTRATE THE USE OF SUBROUTINE BLKTRI TO
    C     SOLVE THE EQUATION
    C
    C     .5/S*(D/DS)(.5/S*DU/DS)+.5/T*(D/DT)(.5/T*DU/DT)
    C                                                          (1)
    C                   = 15/4*S*T*(S**4+T**4)
    C
    C     ON THE RECTANGLE 0 .LT. S .LT. 1 AND 0 .LT. T .LT. 1
    C     WITH THE BOUNDARY CONDITIONS
    C
    C     U(0,T) = 0
    C                            0 .LE. T .LE. 1
    C     U(1,T) = T**5
    C
    C     AND
    C
    C     U(S,0) = 0
    C                            0 .LE. S .LE. 1
    C     U(S,1) = S**5
    C
    C     THE EXACT SOLUTION OF THIS PROBLEM IS U(S,T) = (S*T)**5
    C
    C     DEFINE THE INTEGERS M = 50 AND N = 63. THEN DEFINE THE
    C     GRID INCREMENTS DELTAS = 1/(M+1) AND DELTAT = 1/(N+1).
    C
    C     THE GRID IS THEN GIVEN BY S(I) = I*DELTAS FOR I = 1,...,M
    C     AND T(J) = J*DELTAT FOR J = 1,...,N.
    C
    C     THE APPROXIMATE SOLUTION IS GIVEN AS THE SOLUTION TO
    C     THE FOLLOWING FINITE DIFFERENCE APPROXIMATION OF EQUATION (1).
    C
    C     .5/(S(I)*DELTAS)*((U(I+1,J)-U(I,J))/(2*S(I+.5)*DELTAS)
    C                     -(U(I,J)-U(I-1,J))/(2*S(I-.5)*DELTAS))
    C     +.5/(T(I)*DELTAT)*((U(I,J+1)-U(I,J))/(2*T(I+.5)*DELTAT) (2)
    C                     -(U(I,J)-U(I,J-1))/(2*T(I-.5)*DELTAT))
    C               = 15/4*S(I)*T(J)*(S(I)**4+T(J)**4)
    C
    C             WHERE S(I+.5) = .5*(S(I+1)+S(I))
    C                   S(I-.5) = .5*(S(I)+S(I-1))
    C                   T(I+.5) = .5*(T(I+1)+T(I))
    C                   T(I-.5) = .5*(T(I)+T(I-1))
    C
    C     THE APPROACH IS TO WRITE EQUATION (2) IN THE FORM
    C
    C     AM(I)*U(I-1,J)+BM(I,J)*U(I,J)+CM(I)*U(I+1,J)
    C       +AN(J)*U(I,J-1)+BN(J)*U(I,J)+CN(J)*U(I,J+1)      (3)
    C           = Y(I,J)
    C
    C     AND THEN CALL SUBROUTINE BLKTRI TO DETERMINE U(I,J)
    C
    C
    C
          DIMENSION       Y(75,105)  ,AM(75)     ,BM(75)     ,CM(75)     ,
         1                AN(105)    ,BN(105)    ,CN(105)    ,W(823)     ,
         2                S(75)      ,T(105)
    C
          IFLG = 0
          NP = 1
          N = 63
          MP = 1
          M = 50
          IDIMY = 75
    C
    C     GENERATE AND STORE GRID POINTS FOR THE PURPOSE OF COMPUTING THE
    C     COEFFICIENTS AND THE ARRAY Y.
    C
          DELTAS = 1./FLOAT(M+1)
          DO 101 I=1,M
             S(I) = FLOAT(I)*DELTAS
      101 CONTINUE
          DELTAT = 1./FLOAT(N+1)
          DO 102 J=1,N
             T(J) = FLOAT(J)*DELTAT
      102 CONTINUE
    C
    C     COMPUTE THE COEFFICIENTS AM,BM,CM CORRESPONDING TO THE S DIRECTION
    C
          HDS = DELTAS/2.
          TDS = DELTAS+DELTAS
          DO 103 I=1,M
             TEMP1 = 1./(S(I)*TDS)
             TEMP2 = 1./((S(I)-HDS)*TDS)
             TEMP3 = 1./((S(I)+HDS)*TDS)
             AM(I) = TEMP1*TEMP2
             CM(I) = TEMP1*TEMP3
             BM(I) = -(AM(I)+CM(I))
      103 CONTINUE
    C
    C     COMPUTE THE COEFFICIENTS AN,BN,CN CORRESPONDING TO THE T DIRECTION
    C
          HDT = DELTAT/2.
          TDT = DELTAT+DELTAT
          DO 104 J=1,N
             TEMP1 = 1./(T(J)*TDT)
             TEMP2 = 1./((T(J)-HDT)*TDT)
             TEMP3 = 1./((T(J)+HDT)*TDT)
             AN(J) = TEMP1*TEMP2
             CN(J) = TEMP1*TEMP3
             BN(J) = -(AN(J)+CN(J))
      104 CONTINUE
    C
    C     COMPUTE RIGHT SIDE OF EQUATION
    C
          DO 106 J=1,N
             DO 105 I=1,M
                Y(I,J) = 3.75*S(I)*T(J)*(S(I)**4+T(J)**4)
      105    CONTINUE
      106 CONTINUE
    C
    C     THE NONZERO BOUNDARY CONDITIONS ENTER THE LINEAR SYSTEM VIA
    C     THE RIGHT SIDE Y(I,J). IF THE EQUATIONS (3) GIVEN ABOVE
    C     ARE EVALUATED AT I=M AND J=1,...,N THEN THE TERM CM(M)*U(M+1,J)
    C     IS KNOWN FROM THE BOUNDARY CONDITION TO BE CM(M)*T(J)**5.
    C     THEREFORE THIS TERM CAN BE INCLUDED IN THE RIGHT SIDE Y(M,J).
    C     THE SAME ANALYSIS APPLIES AT J=N AND I=1,..,M. NOTE THAT THE
    C     CORNER AT J=N,I=M INCLUDES CONTRIBUTIONS FROM BOTH BOUNDARIES.
    C
          DO 107 J=1,N
             Y(M,J) = Y(M,J)-CM(M)*T(J)**5
      107 CONTINUE
          DO 108 I=1,M
             Y(I,N) = Y(I,N)-CN(N)*S(I)**5
      108 CONTINUE
    C
    C     DETERMINE THE APPROXIMATE SOLUTION U(I,J)
    C
      109 CALL BLKTRI (IFLG,NP,N,AN,BN,CN,MP,M,AM,BM,CM,IDIMY,Y,IERROR,W)
          IFLG = IFLG+1
          IF (IFLG-1) 109,109,110
    C
    C     COMPUTE DISCRETIZATION ERROR
    C
      110 ERR = 0.
          DO 112 J=1,N
             DO 111 I=1,M
                Z = ABS(Y(I,J)-(S(I)*T(J))**5)
                IF (Z .GT. ERR) ERR = Z
      111    CONTINUE
      112 CONTINUE
          IW = INT(W(1))
          PRINT 1001 , IERROR,ERR,IW
          STOP
    C
     1001 FORMAT (1H1,20X,25HSUBROUTINE BLKTRI EXAMPLE///
         1        10X,46HTHE OUTPUT FROM THE NCAR CONTROL DATA 7600 WAS//
         2        32X,10HIERROR = 0/
         3        18X,34HDISCRETIZATION ERROR = 1.64478E-05/
         4        12X,32HREQUIRED LENGTH OF W ARRAY = 823//
         5        10X,32HTHE OUTPUT FROM YOUR COMPUTER IS//
         6        32X,8HIERROR =,I2/18X,22HDISCRETIZATION ERROR =,E12.5/
         7        12X,28HREQUIRED LENGTH OF W ARRAY =,I4)
    C
          END

TCBLKTRI

    C
    C     file tcblktri.f
    C
    C     * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
    C     *                                                               *
    C     *                  copyright (c) 1999 by UCAR                   *
    C     *                                                               *
    C     *       UNIVERSITY CORPORATION for ATMOSPHERIC RESEARCH         *
    C     *                                                               *
    C     *                      all rights reserved                      *
    C     *                                                               *
    C     *                      FISHPACK version 4.1                     *
    C     *                                                               *
    C     *     A PACKAGE OF FORTRAN SUBPROGRAMS FOR THE SOLUTION OF      *
    C     *                                                               *
    C     *      SEPARABLE ELLIPTIC PARTIAL DIFFERENTIAL EQUATIONS        *
    C     *                                                               *
    C     *                             BY                                *
    C     *                                                               *
    C     *        JOHN ADAMS, PAUL SWARZTRAUBER AND ROLAND SWEET         *
    C     *                                                               *
    C     *                             OF                                *
    C     *                                                               *
    C     *         THE NATIONAL CENTER FOR ATMOSPHERIC RESEARCH          *
    C     *                                                               *
    C     *                BOULDER, COLORADO  (80307)  U.S.A.             *
    C     *                                                               *
    C     *                   WHICH IS SPONSORED BY                       *
    C     *                                                               *
    C     *              THE NATIONAL SCIENCE FOUNDATION                  *
    C     *                                                               *
    C     * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
    C
    C     THIS PROGRAM ILLUSTRATES THE USE OF SUBROUTINE CBLKTR WHICH IS
    C     THE COMPLEX VERSION OF BLKTRI. THE PROGRAM SOLVES THE EQUATION
    C
    C     .5/S*(D/DS)(.5/S*DU/DS)+.5/T*(D/DT)(.5/T*DU/DT)-SQRT(-1)*U
    C                                                          (1)
    C            = 15/4*S*T*(S**4+T**4)-SQRT(-1)*(S*T)**5
    C
    C     ON THE RECTANGLE 0 .LT. S .LT. 1 AND 0 .LT. T .LT. 1
    C     WITH THE BOUNDARY CONDITIONS
    C
    C     U(0,T) = 0
    C                            0 .LE. T .LE. 1
    C     U(1,T) = T**5
    C
    C     AND
    C
    C     U(S,0) = 0
    C                            0 .LE. S .LE. 1
    C     U(S,1) = S**5
    C
    C     THE EXACT SOLUTION OF THIS PROBLEM IS U(S,T) = (S*T)**5
    C
    C     DEFINE THE INTEGERS M = 50 AND N = 63. THEN DEFINE THE
    C     GRID INCREMENTS DELTAS = 1/(M+1) AND DELTAT = 1/(N+1).
    C
    C     THE GRID IS THEN GIVEN BY S(I) = I*DELTAS FOR I = 1,...,M
    C     AND T(J) = J*DELTAT FOR J = 1,...,N.
    C
    C     THE APPROXIMATE SOLUTION IS GIVEN AS THE SOLUTION TO
    C     THE FOLLOWING FINITE DIFFERENCE APPROXIMATION OF EQUATION (1).
    C
    C     .5/(S(I)*DELTAS)*((U(I+1,J)-U(I,J))/(2*S(I+.5)*DELTAS)
    C                     -(U(I,J)-U(I-1,J))/(2*S(I-.5)*DELTAS))
    C     +.5/(T(I)*DELTAT)*((U(I,J+1)-U(I,J))/(2*T(I+.5)*DELTAT) (2)
    C                     -(U(I,J)-U(I,J-1))/(2*T(I-.5)*DELTAT))
    C                        -SQRT(-1)*U(I,J)
    C               = 15/4*S(I)*T(J)*(S(I)**4+T(J)**4)
    C                        -SQRT(-1)*(S(I)*T(J))**5
    C
    C             WHERE S(I+.5) = .5*(S(I+1)+S(I))
    C                   S(I-.5) = .5*(S(I)+S(I-1))
    C                   T(I+.5) = .5*(T(I+1)+T(I))
    C                   T(I-.5) = .5*(T(I)+T(I-1))
    C
    C     THE APPROACH IS TO WRITE EQUATION (2) IN THE FORM
    C
    C     AM(I)*U(I-1,J)+BM(I,J)*U(I,J)+CM(I)*U(I+1,J)
    C       +AN(J)*U(I,J-1)+BN(J)*U(I,J)+CN(J)*U(I,J+1)      (3)
    C           = Y(I,J)
    C
    C     AND THEN CALL SUBROUTINE CBLKTR TO DETERMINE U(I,J)
    C
    C
    C
    C
          DIMENSION       Y(75,105)  ,AM(75)     ,BM(75)     ,CM(75)     ,
         1                AN(105)    ,BN(105)    ,CN(105)    ,S(75)      ,
         2                T(105)     ,W(1123)
          COMPLEX         Y          ,AM         ,BM         ,CM
    C
          IFLG = 0
          NP = 1
          N = 63
          MP = 1
          M = 50
          IDIMY = 75
    C
    C     GENERATE AND STORE GRID POINTS FOR THE PURPOSE OF COMPUTING THE
    C     COEFFICIENTS AND THE ARRAY Y.
    C
          DELTAS = 1./FLOAT(M+1)
          DO 101 I=1,M
             S(I) = FLOAT(I)*DELTAS
      101 CONTINUE
          DELTAT = 1./FLOAT(N+1)
          DO 102 J=1,N
             T(J) = FLOAT(J)*DELTAT
      102 CONTINUE
    C
    C     COMPUTE THE COEFFICIENTS AM,BM,CM CORRESPONDING TO THE S DIRECTION
    C
          HDS = DELTAS/2.
          TDS = DELTAS+DELTAS
          DO 103 I=1,M
             TEMP1 = 1./(S(I)*TDS)
             TEMP2 = 1./((S(I)-HDS)*TDS)
             TEMP3 = 1./((S(I)+HDS)*TDS)
             AM(I) = CMPLX(TEMP1*TEMP2,0.)
             CM(I) = CMPLX(TEMP1*TEMP3,0.)
             BM(I) = -(AM(I)+CM(I))-(0.,1.)
      103 CONTINUE
    C
    C     COMPUTE THE COEFFICIENTS AN,BN,CN CORRESPONDING TO THE T DIRECTION
    C
          HDT = DELTAT/2.
          TDT = DELTAT+DELTAT
          DO 104 J=1,N
             TEMP1 = 1./(T(J)*TDT)
             TEMP2 = 1./((T(J)-HDT)*TDT)
             TEMP3 = 1./((T(J)+HDT)*TDT)
             AN(J) = TEMP1*TEMP2
             CN(J) = TEMP1*TEMP3
             BN(J) = -(AN(J)+CN(J))
      104 CONTINUE
    C
    C     COMPUTE RIGHT SIDE OF EQUATION
    C
          DO 106 J=1,N
             DO 105 I=1,M
                Y(I,J) = 3.75*S(I)*T(J)*(S(I)**4+T(J)**4)-
         1               (0.,1.)*(S(I)*T(J))**5
      105    CONTINUE
      106 CONTINUE
    C
    C     THE NONZERO BOUNDARY CONDITIONS ENTER THE LINEAR SYSTEM VIA
    C     THE RIGHT SIDE Y(I,J). IF THE EQUATIONS (3) GIVEN ABOVE
    C     ARE EVALUATED AT I=M AND J=1,...,N THEN THE TERM CM(M)*U(M+1,J)
    C     IS KNOWN FROM THE BOUNDARY CONDITION TO BE CM(M)*T(J)**5.
    C     THEREFORE THIS TERM CAN BE INCLUDED IN THE RIGHT SIDE Y(M,J).
    C     THE SAME ANALYSIS APPLIES AT J=N AND I=1,..,M. NOTE THAT THE
    C     CORNER AT J=N,I=M INCLUDES CONTRIBUTIONS FROM BOTH BOUNDARIES.
    C
          DO 107 J=1,N
             Y(M,J) = Y(M,J)-CM(M)*T(J)**5
      107 CONTINUE
          DO 108 I=1,M
             Y(I,N) = Y(I,N)-CN(N)*S(I)**5
      108 CONTINUE
    C
      109 CALL CBLKTR (IFLG,NP,N,AN,BN,CN,MP,M,AM,BM,CM,IDIMY,Y,IERROR,W)
          IFLG = IFLG+1
          IF (IFLG-1) 109,109,110
    C
    C     COMPUTE DISCRETIZATION ERROR
    C
      110 ERR = 0.
          DO 112 J=1,N
             DO 111 I=1,M
                Z = CABS(Y(I,J)-(S(I)*T(J))**5)
                IF (Z .GT. ERR) ERR = Z
      111    CONTINUE
      112 CONTINUE
          IW = INT(W(1))
          PRINT 1001 , IERROR,ERR,IW
          STOP
    C
     1001 FORMAT (1H1,20X,25HSUBROUTINE CBLKTR EXAMPLE///
         1        10X,46HTHE OUTPUT FROM THE NCAR CONTROL DATA 7600 WAS//
         2        32X,10HIERROR = 0/
         3        18X,34HDISCRETIZATION ERROR = 1.64572E-05/
         4        12X,33HREQUIRED LENGTH OF W ARRAY = 1123//
         5        10X,32HTHE OUTPUT FROM YOUR COMPUTER IS//
         6        32X,8HIERROR =,I2/18X,22HDISCRETIZATION ERROR =,E12.5/
         7        12X,28HREQUIRED LENGTH OF W ARRAY =,I5)
    C
          END

TCMGNBN

    C
    C file tcmgnbn.f
    C
    C     * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
    C     *                                                               *
    C     *                  copyright (c) 1999 by UCAR                   *
    C     *                                                               *
    C     *       UNIVERSITY CORPORATION for ATMOSPHERIC RESEARCH         *
    C     *                                                               *
    C     *                      all rights reserved                      *
    C     *                                                               *
    C     *                      FISHPACK version 4.1                     *
    C     *                                                               *
    C     *     A PACKAGE OF FORTRAN SUBPROGRAMS FOR THE SOLUTION OF      *
    C     *                                                               *
    C     *      SEPARABLE ELLIPTIC PARTIAL DIFFERENTIAL EQUATIONS        *
    C     *                                                               *
    C     *                             BY                                *
    C     *                                                               *
    C     *        JOHN ADAMS, PAUL SWARZTRAUBER AND ROLAND SWEET         *
    C     *                                                               *
    C     *                             OF                                *
    C     *                                                               *
    C     *         THE NATIONAL CENTER FOR ATMOSPHERIC RESEARCH          *
    C     *                                                               *
    C     *                BOULDER, COLORADO  (80307)  U.S.A.             *
    C     *                                                               *
    C     *                   WHICH IS SPONSORED BY                       *
    C     *                                                               *
    C     *              THE NATIONAL SCIENCE FOUNDATION                  *
    C     *                                                               *
    C     * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
    C
    C     PROGRAM TO ILLUSTRATE THE USE OF SUBROUTINE CMGNBN TO SOLVE
    C     THE EQUATION
    C
    C     (1+X)**2*(D/DX)(DU/DX) - 2(1+X)(DU/DX) + (D/DY)(DU/DY)
    C
    C             - SQRT(-1)*U = (3 - SQRT(-1))*(1+X)**4*SIN(Y)         (1)
    C
    C     ON THE RECTANGLE 0 .LT. X .LT. 1 AND -PI .LT. Y .LT. PI
    C     WITH THE BOUNDARY CONDITIONS
    C
    C     (DU/DX)(0,Y) = 4SIN(Y)                               (2)
    C                                -PI .LE. Y .LE. PI
    C     U(1,Y) = 16SIN(Y)                                    (3)
    C
    C     AND WITH U PERIODIC IN Y USING FINITE DIFFERENCES ON A
    C     GRID WITH DELTAX (= DX) = 1/20 AND DELTAY (= DY) = PI/20.
    C        TO SET UP THE FINITE DIFFERENCE EQUATIONS WE DEFINE
    C     THE GRID POINTS
    C
    C     X(I) = (I-1)DX            I=1,2,...,21
    C
    C     Y(J) = -PI + (J-1)DY      J=1,2,...,41
    C
    C     AND LET V(I,J) BE AN APPROXIMATION TO U(X(I),Y(J)).
    C     NUMBERING THE GRID POINTS IN THIS FASHION GIVES THE SET
    C     OF UNKNOWNS AS V(I,J) FOR I=1,2,...,20 AND J=1,2,...,40.
    C     HENCE, IN THE PROGRAM M = 20 AND N = 40.  AT THE INTERIOR
    C     GRID POINT (X(I),Y(J)), WE REPLACE ALL DERIVATIVES IN
    C     EQUATION (1) BY SECOND ORDER CENTRAL FINITE DIFFERENCES,
    C     MULTIPLY BY DY**2, AND COLLECT COEFFICIENTS OF V(I,J) TO
    C     GET THE FINITE DIFFERENCE EQUATION
    C
    C     A(I)V(I-1,J) + B(I)V(I,J) + C(I)V(I+1,J)
    C
    C     + V(I,J-1) - 2V(I,J) + V(I,J+1) = F(I,J)            (4)
    C
    C     WHERE S = (DY/DX)**2, AND FOR I=2,3,...,19
    C
    C     A(I) = (1+X(I))**2*S + (1+X(I))*S*DX
    C
    C     B(I) = -2(1+X(I))**2*S - SQRT(-1)*DY**2
    C
    C     C(I) = (1+X(I))**2*S - (1+X(I))*S*DX
    C
    C     F(I,J) = (3 - SQRT(-1))*(1+X(I))**4*DY**2*SIN(Y(J))
    C              FOR J=1,2,...,40.
    C
    C        TO OBTAIN EQUATIONS FOR I = 1, WE REPLACE THE
    C     DERIVATIVE IN EQUATION (2) BY A SECOND ORDER CENTRAL
    C     FINITE DIFFERENCE APPROXIMATION, USE THIS EQUATION TO
    C     ELIMINATE THE VIRTUAL UNKNOWN V(0,J) IN EQUATION (4)
    C     AND ARRIVE AT THE EQUATION
    C
    C     B(1)V(1,J) + C(1)V(2,J) + V(1,J-1) - 2V(1,J) + V(1,J+1)
    C
    C                       = F(1,J)
    C
    C     WHERE
    C
    C     B(1) = -2S - SQRT(-1)*DY**2 , C(1) = 2S
    C
    C     F(1,J) = (11-SQRT(-1)+8/DX)*DY**2*SIN(Y(J)),  J=1,2,...,40.
    C
    C     FOR COMPLETENESS, WE SET A(1) = 0.
    C        TO OBTAIN EQUATIONS FOR I = 20, WE INCORPORATE
    C     EQUATION (3) INTO EQUATION (4) BY SETTING
    C
    C     V(21,J) = 16SIN(Y(J))
    C
    C     AND ARRIVE AT THE EQUATION
    C
    C     A(20)V(19,J) + B(20)V(20,J)
    C
    C     + V(20,J-1) - 2V(20,J) + V(20,J+1) = F(20,J)
    C
    C     WHERE
    C
    C     A(20) = (1+X(20))**2*S + (1+X(20))*S*DX
    C
    C     B(20) = -2*(1+X(20))**2*S - SQRT(-1)*DY**2
    C
    C     F(20,J) = ((3-SQRT(-1))*(1+X(20))**4*DY**2 - 16(1+X(20))**2*S
    C                + 16(1+X(20))*S*DX)*SIN(Y(J))
    C
    C                    FOR J=1,2,...,40.
    C
    C     FOR COMPLETENESS, WE SET C(20) = 0.  HENCE, IN THE
    C     PROGRAM MPEROD = 1.
    C        THE PERIODICITY CONDITION ON U GIVES THE CONDITIONS
    C
    C     V(I,0) = V(I,40) AND V(I,41) = V(I,1) FOR I=1,2,...,20.
    C
    C     HENCE, IN THE PROGRAM NPEROD = 0.
    C
    C          THE EXACT SOLUTION TO THIS PROBLEM IS
    C
    C                  U(X,Y) = (1+X)**4*SIN(Y) .
    C
          COMPLEX         F          ,A          ,B          ,C          ,W
          DIMENSION       F(22,40)   ,A(20)      ,B(20)      ,C(20)      ,
         1                X(21)      ,Y(41)      ,W(380)
    C
    C     FROM THE DIMENSION STATEMENT WE GET THAT IDIMF = 22 AND THAT W
    C     HAS BEEN DIMENSIONED
    C
    C     4N + (10+INT(LOG2(N)))M = 4*20 + (10+5)*20 = 380 .
    C
          IDIMF = 22
          M = 20
          MP1 = M+1
          MPEROD = 1
          DX = 0.05
          N = 40
          NPEROD = 0
          PI = PIMACH(DUM)
          DY = PI/20.
    C
    C     GENERATE GRID POINTS FOR LATER USE.
    C
          DO 101 I=1,MP1
             X(I) = FLOAT(I-1)*DX
      101 CONTINUE
          DO 102 J=1,N
             Y(J) = -PI+FLOAT(J-1)*DY
      102 CONTINUE
    C
    C     GENERATE COEFFICIENTS.
    C
          S = (DY/DX)**2
          DO 103 I=2,19
             T = 1.+X(I)
             TSQ = T**2
             A(I) = CMPLX((TSQ+T*DX)*S,0.)
             B(I) = -2.*TSQ*S-(0.,1.)*DY**2
             C(I) = CMPLX((TSQ-T*DX)*S,0.)
      103 CONTINUE
          A(1) = (0.,0.)
          B(1) = -2.*S-(0.,1.)*DY**2
          C(1) = CMPLX(2.*S,0.)
          B(20) = -2.*S*(1.+X(20))**2-(0.,1.)*DY**2
          A(20) = CMPLX(S*(1.+X(20))**2+(1.+X(20))*DX*S,0.)
          C(20) = (0.,0.)
    C
    C     GENERATE RIGHT SIDE.
    C
          DO 105 I=2,19
             DO 104 J=1,N
                F(I,J) = (3.,-1.)*(1.+X(I))**4*DY**2*SIN(Y(J))
      104    CONTINUE
      105 CONTINUE
          T = 1.+X(20)
          TSQ = T**2
          T4 = TSQ**2
          DO 106 J=1,N
             F(1,J) = ((11.,-1.)+8./DX)*DY**2*SIN(Y(J))
             F(20,J) = ((3.,-1.)*T4*DY**2-16.*TSQ*S+16.*T*S*DX)*SIN(Y(J))
      106 CONTINUE
          CALL CMGNBN (NPEROD,N,MPEROD,M,A,B,C,IDIMF,F,IERROR,W)
    C
    C     COMPUTE DISCRETIAZATION ERROR.  THE EXACT SOLUTION IS
    C
    C            U(X,Y) = (1+X)**4*SIN(Y) .
    C
          ERR = 0.
          DO 108 I=1,M
             DO 107 J=1,N
                T = CABS(F(I,J)-(1.+X(I))**4*SIN(Y(J)))
                IF (T .GT. ERR) ERR = T
      107    CONTINUE
      108 CONTINUE
          T = REAL(W(1))
          PRINT 1001 , IERROR,ERR,T
          STOP
    C
     1001 FORMAT (1H1,20X,25HSUBROUTINE CMGNBN EXAMPLE///
         1        10X,46HTHE OUTPUT FROM THE NCAR CONTROL DATA 7600 WAS//
         2        32X,10HIERROR = 0/
         3        18X,34HDISCRETIZATION ERROR = 9.16200E-03/
         4        12X,32HREQUIRED LENGTH OF W ARRAY = 380//
         5        10X,32HTHE OUTPUT FROM YOUR COMPUTER IS//
         6        32X,8HIERROR =,I2/18X,22HDISCRETIZATION ERROR =,E12.5/
         7        12X,28HREQUIRED LENGTH OF W ARRAY =,F4.0)
    C
          END

TGENBUN

    C
    C file tgenbun.f
    C
    C     * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
    C     *                                                               *
    C     *                  copyright (c) 1999 by UCAR                   *
    C     *                                                               *
    C     *       UNIVERSITY CORPORATION for ATMOSPHERIC RESEARCH         *
    C     *                                                               *
    C     *                      all rights reserved                      *
    C     *                                                               *
    C     *                      FISHPACK version 4.1                     *
    C     *                                                               *
    C     *     A PACKAGE OF FORTRAN SUBPROGRAMS FOR THE SOLUTION OF      *
    C     *                                                               *
    C     *      SEPARABLE ELLIPTIC PARTIAL DIFFERENTIAL EQUATIONS        *
    C     *                                                               *
    C     *                             BY                                *
    C     *                                                               *
    C     *        JOHN ADAMS, PAUL SWARZTRAUBER AND ROLAND SWEET         *
    C     *                                                               *
    C     *                             OF                                *
    C     *                                                               *
    C     *         THE NATIONAL CENTER FOR ATMOSPHERIC RESEARCH          *
    C     *                                                               *
    C     *                BOULDER, COLORADO  (80307)  U.S.A.             *
    C     *                                                               *
    C     *                   WHICH IS SPONSORED BY                       *
    C     *                                                               *
    C     *              THE NATIONAL SCIENCE FOUNDATION                  *
    C     *                                                               *
    C     * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
    C
    C     PROGRAM TO ILLUSTRATE THE USE OF SUBROUTINE GENBUN TO
    C     SOLVE THE EQUATION
    C
    C     (1+X)**2*(D/DX)(DU/DX) - 2(1+X)(DU/DX) + (D/DY)(DU/DY)
    C
    C                  = 3(1+X)**4*SIN(Y)                      (1)
    C
    C     ON THE RECTANGLE 0 .LT. X .LT. 1 AND -PI .LT. Y .LT. PI
    C     WITH THE BOUNDARY CONDITIONS
    C
    C     (DU/DX)(0,Y) = 4SIN(Y)                               (2)
    C                                -PI .LE. Y .LE. PI
    C     U(1,Y) = 16SIN(Y)                                    (3)
    C
    C     AND WITH U PERIODIC IN Y USING FINITE DIFFERENCES ON A
    C     GRID WITH DELTAX (= DX) = 1/20 AND DELTAY (= DY) = PI/20.
    C        TO SET UP THE FINITE DIFFERENCE EQUATIONS WE DEFINE
    C     THE GRID POINTS
    C
    C     X(I) = (I-1)DX            I=1,2,...,21
    C
    C     Y(J) = -PI + (J-1)DY      J=1,2,...,41
    C
    C     AND LET V(I,J) BE AN APPROXIMATION TO U(X(I),Y(J)).
    C     NUMBERING THE GRID POINTS IN THIS FASHION GIVES THE SET
    C     OF UNKNOWNS AS V(I,J) FOR I=1,2,...,20 AND J=1,2,...,40.
    C     HENCE, IN THE PROGRAM M = 20 AND N = 40.  AT THE INTERIOR
    C     GRID POINT (X(I),Y(J)), WE REPLACE ALL DERIVATIVES IN
    C     EQUATION (1) BY SECOND ORDER CENTRAL FINITE DIFFERENCES,
    C     MULTIPLY BY DY**2, AND COLLECT COEFFICIENTS OF V(I,J) TO
    C     GET THE FINITE DIFFERENCE EQUATION
    C
    C     A(I)V(I-1,J) + B(I)V(I,J) + C(I)V(I+1,J)
    C
    C     + V(I,J-1) - 2V(I,J) + V(I,J+1) = F(I,J)            (4)
    C
    C     WHERE S = (DY/DX)**2, AND FOR I=2,3,...,19
    C
    C     A(I) = (1+X(I))**2*S + (1+X(I))*S*DX
    C
    C     B(I) = -2(1+X(I))**2*S
    C
    C     C(I) = (1+X(I))**2*S - (1+X(I))*S*DX
    C
    C     F(I,J) = 3(1+X(I))**4*DY**2*SIN(Y(J))  FOR J=1,2,...,40.
    C
    C        TO OBTAIN EQUATIONS FOR I = 1, WE REPLACE THE
    C     DERIVATIVE IN EQUATION (2) BY A SECOND ORDER CENTRAL
    C     FINITE DIFFERENCE APPROXIMATION, USE THIS EQUATION TO
    C     ELIMINATE THE VIRTUAL UNKNOWN V(0,J) IN EQUATION (4)
    C     AND ARRIVE AT THE EQUATION
    C
    C     B(1)V(1,J) + C(1)V(2,J) + V(1,J-1) - 2V(1,J) + V(1,J+1)
    C
    C                       = F(1,J)
    C
    C     WHERE
    C
    C     B(1) = -2S , C(1) = 2S
    C
    C     F(1,J) = (11+8/DX)*DY**2*SIN(Y(J)),  J=1,2,...,40.
    C
    C     FOR COMPLETENESS, WE SET A(1) = 0.
    C        TO OBTAIN EQUATIONS FOR I = 20, WE INCORPORATE
    C     EQUATION (3) INTO EQUATION (4) BY SETTING
    C
    C     V(21,J) = 16SIN(Y(J))
    C
    C     AND ARRIVE AT THE EQUATION
    C
    C     A(20)V(19,J) + B(20)V(20,J)
    C
    C     + V(20,J-1) - 2V(20,J) + V(20,J+1) = F(20,J)
    C
    C     WHERE
    C
    C     A(20) = (1+X(20))**2*S + (1+X(20))*S*DX
    C
    C     B(20) = -2*(1+X(20))**2*S
    C
    C     F(20,J) = (3(1+X(20))**4*DY**2 - 16(1+X(20))**2*S
    C                + 16(1+X(20))*S*DX)*SIN(Y(J))
    C
    C                    FOR J=1,2,...,40.
    C
    C     FOR COMPLETENESS, WE SET C(20) = 0.  HENCE, IN THE
    C     PROGRAM MPEROD = 1.
    C        THE PERIODICITY CONDITION ON U GIVES THE CONDITIONS
    C
    C     V(I,0) = V(I,40) AND V(I,41) = V(I,1) FOR I=1,2,...,20.
    C
    C     HENCE, IN THE PROGRAM NPEROD = 0.
    C
    C          THE EXACT SOLUTION TO THIS PROBLEM IS
    C
    C                  U(X,Y) = (1+X)**4*SIN(Y) .
    C
          DIMENSION       F(22,40)   ,A(20)      ,B(20)      ,C(20)      ,
         1                X(21)      ,Y(41)      ,W(380)
    C
    C     FROM THE DIMENSION STATEMENT WE GET THAT IDIMF = 22 AND THAT W
    C     HAS BEEN DIMENSIONED
    C
    C     4N + (10+INT(LOG2(N)))M = 4*20 + (10+5)*20 = 380 .
    C
          IDIMF = 22
          M = 20
          MP1 = M+1
          MPEROD = 1
          DX = 0.05
          N = 40
          NPEROD = 0
          PI = PIMACH(DUM)
          DY = PI/20.
    C
    C     GENERATE GRID POINTS FOR LATER USE.
    C
          DO 101 I=1,MP1
             X(I) = FLOAT(I-1)*DX
      101 CONTINUE
          DO 102 J=1,N
             Y(J) = -PI+FLOAT(J-1)*DY
      102 CONTINUE
    C
    C     GENERATE COEFFICIENTS.
    C
          S = (DY/DX)**2
          DO 103 I=2,19
             T = 1.+X(I)
             TSQ = T**2
             A(I) = (TSQ+T*DX)*S
             B(I) = -2.*TSQ*S
             C(I) = (TSQ-T*DX)*S
      103 CONTINUE
          A(1) = 0.
          B(1) = -2.*S
          C(1) = -B(1)
          B(20) = -2.*S*(1.+X(20))**2
          A(20) = -B(20)/2.+(1.+X(20))*DX*S
          C(20) = 0.
    C
    C     GENERATE RIGHT SIDE.
    C
          DO 105 I=2,19
             DO 104 J=1,N
                F(I,J) = 3.*(1.+X(I))**4*DY**2*SIN(Y(J))
      104    CONTINUE
      105 CONTINUE
          T = 1.+X(20)
          TSQ = T**2
          T4 = TSQ**2
          DO 106 J=1,N
             F(1,J) = (11.+8./DX)*DY**2*SIN(Y(J))
             F(20,J) = (3.*T4*DY**2-16.*TSQ*S+16.*T*S*DX)*SIN(Y(J))
      106 CONTINUE
          CALL GENBUN (NPEROD,N,MPEROD,M,A,B,C,IDIMF,F,IERROR,W)
    C
    C     COMPUTE DISCRETIAZATION ERROR.  THE EXACT SOLUTION IS
    C
    C            U(X,Y) = (1+X)**4*SIN(Y) .
    C
          ERR = 0.
          DO 108 I=1,M
             DO 107 J=1,N
                T = ABS(F(I,J)-(1.+X(I))**4*SIN(Y(J)))
                IF (T .GT. ERR) ERR = T
      107    CONTINUE
      108 CONTINUE
          PRINT 1001 , IERROR,ERR,W(1)
          STOP
    C
     1001 FORMAT (1H1,20X,25HSUBROUTINE GENBUN EXAMPLE///
         1        10X,46HTHE OUTPUT FROM THE NCAR CONTROL DATA 7600 WAS//
         2        32X,10HIERROR = 0/
         3        18X,34HDISCRETIZATION ERROR = 9.64063E-03/
         4        12X,32HREQUIRED LENGTH OF W ARRAY = 380//
         5        10X,32HTHE OUTPUT FROM YOUR COMPUTER IS//
         6        32X,8HIERROR =,I2/18X,22HDISCRETIZATION ERROR =,E12.5/
         7        12X,28HREQUIRED LENGTH OF W ARRAY =,F4.0)
    C
          END

THSTCRT

    C
    C file thstcrt.f
    C
    C     * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
    C     *                                                               *
    C     *                  copyright (c) 1999 by UCAR                   *
    C     *                                                               *
    C     *       UNIVERSITY CORPORATION for ATMOSPHERIC RESEARCH         *
    C     *                                                               *
    C     *                      all rights reserved                      *
    C     *                                                               *
    C     *                      FISHPACK version 4.1                     *
    C     *                                                               *
    C     *     A PACKAGE OF FORTRAN SUBPROGRAMS FOR THE SOLUTION OF      *
    C     *                                                               *
    C     *      SEPARABLE ELLIPTIC PARTIAL DIFFERENTIAL EQUATIONS        *
    C     *                                                               *
    C     *                             BY                                *
    C     *                                                               *
    C     *        JOHN ADAMS, PAUL SWARZTRAUBER AND ROLAND SWEET         *
    C     *                                                               *
    C     *                             OF                                *
    C     *                                                               *
    C     *         THE NATIONAL CENTER FOR ATMOSPHERIC RESEARCH          *
    C     *                                                               *
    C     *                BOULDER, COLORADO  (80307)  U.S.A.             *
    C     *                                                               *
    C     *                   WHICH IS SPONSORED BY                       *
    C     *                                                               *
    C     *              THE NATIONAL SCIENCE FOUNDATION                  *
    C     *                                                               *
    C     * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
    C
    C
    C     PROGRAM TO ILLUSTRATE THE USE OF SUBROUTINE HSTCRT TO SOLVE
    C     THE EQUATION
    C
    C    (D/DX)(DU/DX) + (D/DY)(DU/DY) - 2*U = -2(PI**2+1)SIN(PI*X)COS(PI*Y)
    C
    C     WHERE  1 .LE. X .LE. 3 AND -1 .LE. Y .LE. 1 AND THE BOUNDARY
    C     CONDITIONS ARE
    C
    C     U = 0 ON X = 1,  DU/DX = -PI*COS(PI*Y) ON X = 3
    C
    C     AND U IS PERIODIC IN Y .
    C
    C     WE WANT TO HAVE 48 UNKNOWNS IN THE X-INTERVAL AND 53 UNKNOWNS
    C     IN THE Y-INTERVAL.
    C
          DIMENSION       F(50,53)   ,BDA(53)    ,BDB(53)    ,W(1076)    ,
         1                X(48)      ,Y(53)
    C
    C     FROM THE DIMENSION STATEMENT WE GET IDIMF = 50.  ALSO NOTE THAT
    C     W IS DIMENSIONED (13 + INT(LOG2(N))*M + 4*N.
    C
          IDIMF = 50
          A = 1.
          B = 3.
          M = 48
          DX = (B-A)/FLOAT(M)
          MBDCND = 2
          C = -1.
          D = 1.
          N = 53
          DY = (D-C)/FLOAT(N)
          NBDCND = 0
          ELMBDA = -2.
    C
    C     AUXILIARY QUANTITIES
    C
          PI = PIMACH(DUM)
          PISQ = PI*PI
    C
    C     GENERATE AND STORE GRID POINTS FOR COMPUTATION OF BOUNDARY DATA
    C     AND THE RIGHT SIDE OF THE HELMHOLTZ EQUATION.
    C
          DO 101 I=1,M
             X(I) = A+(FLOAT(I)-0.5)*DX
      101 CONTINUE
          DO 102 J=1,N
             Y(J) = C+(FLOAT(J)-0.5)*DY
      102 CONTINUE
    C
    C     GENERATE BOUNDARY DATA.
    C
          DO 103 J=1,N
             BDA(J) = 0.
             BDB(J) = -PI*COS(PI*Y(J))
      103 CONTINUE
    C
    C     BDC AND BDD ARE DUMMY ARGUMENTS IN THIS EXAMPLE.
    C
    C     GENERATE RIGHT SIDE OF EQUATION.
    C
          T = -2.*(PISQ+1.)
          DO 105 I=1,M
             DO 104 J=1,N
                F(I,J) = T*SIN(PI*X(I))*COS(PI*Y(J))
      104    CONTINUE
      105 CONTINUE
          CALL HSTCRT (A,B,M,MBDCND,BDA,BDB,C,D,N,NBDCND,BDC,BDD,ELMBDA,F,
         1             IDIMF,PERTRB,IERROR,W)
    C
    C     COMPUTE DISCRETIZATION ERROR.  THE EXACT SOLUTION IS
    C
    C               U(X,Y) = SIN(PI*X)*COS(PI*Y) .
    C
          ERR = 0.
          DO 107 I=1,M
             DO 106 J=1,N
                T = ABS(F(I,J)-SIN(PI*X(I))*COS(PI*Y(J)))
                IF (T .GT. ERR) ERR = T
      106    CONTINUE
      107 CONTINUE
          PRINT 1001 , IERROR,ERR,W(1)
          STOP
    C
     1001 FORMAT (1H1,20X,25HSUBROUTINE HSTCRT EXAMPLE///
         1        10X,46HTHE OUTPUT FROM THE NCAR CONTROL DATA 7600 WAS//
         2        32X,10HIERROR = 0/
         3        18X,34HDISCRETIZATION ERROR = 1.26001E-03/
         4        12X,32HREQUIRED LENGTH OF W ARRAY = 884//
         5        10X,32HTHE OUTPUT FROM YOUR COMPUTER IS//
         6        32X,8HIERROR =,I2/18X,22HDISCRETIZATION ERROR =,E12.5/
         7        12X,28HREQUIRED LENGTH OF W ARRAY =,F4.0)
    C
          END

THSTCSP

    C
    C file thstcsp.f
    C
    C     * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
    C     *                                                               *
    C     *                  copyright (c) 1999 by UCAR                   *
    C     *                                                               *
    C     *       UNIVERSITY CORPORATION for ATMOSPHERIC RESEARCH         *
    C     *                                                               *
    C     *                      all rights reserved                      *
    C     *                                                               *
    C     *                      FISHPACK version 4.1                     *
    C     *                                                               *
    C     *     A PACKAGE OF FORTRAN SUBPROGRAMS FOR THE SOLUTION OF      *
    C     *                                                               *
    C     *      SEPARABLE ELLIPTIC PARTIAL DIFFERENTIAL EQUATIONS        *
    C     *                                                               *
    C     *                             BY                                *
    C     *                                                               *
    C     *        JOHN ADAMS, PAUL SWARZTRAUBER AND ROLAND SWEET         *
    C     *                                                               *
    C     *                             OF                                *
    C     *                                                               *
    C     *         THE NATIONAL CENTER FOR ATMOSPHERIC RESEARCH          *
    C     *                                                               *
    C     *                BOULDER, COLORADO  (80307)  U.S.A.             *
    C     *                                                               *
    C     *                   WHICH IS SPONSORED BY                       *
    C     *                                                               *
    C     *              THE NATIONAL SCIENCE FOUNDATION                  *
    C     *                                                               *
    C     * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
    C
    C
    C     THIS PROGRAM ILLUSTRATES THE USE OF SUBROUTINE HSTCSP TO SOLVE
    C     THE EQUATION
    C
    C               (1/R**2)(D/DR)(R**2(DU/DR)) +
    C
    C     (1/R**2*SIN(THETA))(D/DTHETA)(SIN(THETA)(DU/DTHETA))
    C
    C                     = 12*(R*COS(THETA))**2
    C
    C     ON THE RECTANGLE 0 .LT. THETA .LT. PI , 0 .LT. R .LT. 1
    C     WITH THE BOUNDARY CONDITIONS
    C
    C     U(THETA,1) = COS(THETA)**4 , O .LE. THETA .LE. PI
    C
    C     AND THE SOLUTION UNSPECIFIED ON THE REMAINING BOUNDARIES.
    C     WE WILL USE 45 UNKNOWNS IN THE THETA-INTERVAL AND 15 UNKNOWNS
    C     IN THE R-INTERVAL.
    C
          DIMENSION       F(47,16)   ,BDD(45)    ,W(615)     ,THETA(45)  ,
         1                R(15)      ,COST(45)
    C
    C     NOTE THAT FROM DIMENSION STATEMENT WE GET THAT IDIMF = 47  AND
    C     THAT W IS DIMENSIONED ACCORDING TO THE STATEMENT IN THE
    C     DESCRIPTION OF W.
    C
          IDIMF = 47
          A = 0.
          B = PIMACH(DUM)
    C
    C     NOTE THAT B IS SET TO PI USING THE FUNCTION PIMACH AS REQUIRED.
    C
          M = 45
          MBDCND = 9
          DT = (B-A)/FLOAT(M)
    C
    C     DEFINE GRID POINTS THETA(I) AND COS(THETA(I))
    C
          DO 101 I=1,M
             THETA(I) = A+(FLOAT(I)-0.5)*DT
             COST(I) = COS(THETA(I))
      101 CONTINUE
          C = 0.
          D = 1.
          N = 15
          NBDCND = 5
          DR = (D-C)/FLOAT(N)
    C
    C     DEFINE GRID POINTS R(J)
    C
          DO 102 J=1,N
             R(J) = C+(FLOAT(J)-0.5)*DR
      102 CONTINUE
    C
    C     DEFINE BOUNDARY ARRAY BDD.  BDA, BDB, AND BDC ARE DUMMY
    C     VARIABLES IN THIS EXAMPLE.
    C
          DO 103 I=1,M
             BDD(I) = COST(I)**4
      103 CONTINUE
          ELMBDA = 0.
    C
    C     DEFINE RIGHT SIDE F
    C
          DO 105 I=1,M
             DO 104 J=1,N
                F(I,J) = 12.*(R(J)*COST(I))**2
      104    CONTINUE
      105 CONTINUE
          INTL = 0
          CALL HSTCSP (INTL,A,B,M,MBDCND,BDA,BDB,C,D,N,NBDCND,BDC,BDD,
         1             ELMBDA,F,IDIMF,PERTRB,IERROR,W)
    C
    C     COMPUTE DISCRETIZATION ERROR.  THE EXACT SOLUTION IS
    C
    C     U(THETA,R) = (R*COS(THETA))**4
    C
          ERR = 0.
          DO 107 I=1,M
             DO 106 J=1,N
                Z = ABS(F(I,J)-(R(J)*COST(I))**4)
                IF (Z .GT. ERR) ERR = Z
      106    CONTINUE
      107 CONTINUE
          PRINT 1001 , IERROR,ERR,W(1)
          STOP
    C
     1001 FORMAT (1H1,20X,25HSUBROUTINE HSTCSP EXAMPLE///
         1        10X,46HTHE OUTPUT FROM THE NCAR CONTROL DATA 7600 WAS//
         2        32X,10HIERROR = 0/
         3        18X,34HDISCRETIZATION ERROR = 5.58432E-03/
         4        12X,32HREQUIRED LENGTH OF W ARRAY = 583//
         5        10X,32HTHE OUTPUT FROM YOUR COMPUTER IS//
         6        32X,8HIERROR =,I2/18X,22HDISCRETIZATION ERROR =,E12.5/
         7        12X,28HREQUIRED LENGTH OF W ARRAY =,F4.0)
    C
          END

THSTCYL

    C
    C file thstcyl.f
    C
    C     * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
    C     *                                                               *
    C     *                  copyright (c) 1999 by UCAR                   *
    C     *                                                               *
    C     *       UNIVERSITY CORPORATION for ATMOSPHERIC RESEARCH         *
    C     *                                                               *
    C     *                      all rights reserved                      *
    C     *                                                               *
    C     *                      FISHPACK version 4.1                     *
    C     *                                                               *
    C     *     A PACKAGE OF FORTRAN SUBPROGRAMS FOR THE SOLUTION OF      *
    C     *                                                               *
    C     *      SEPARABLE ELLIPTIC PARTIAL DIFFERENTIAL EQUATIONS        *
    C     *                                                               *
    C     *                             BY                                *
    C     *                                                               *
    C     *        JOHN ADAMS, PAUL SWARZTRAUBER AND ROLAND SWEET         *
    C     *                                                               *
    C     *                             OF                                *
    C     *                                                               *
    C     *         THE NATIONAL CENTER FOR ATMOSPHERIC RESEARCH          *
    C     *                                                               *
    C     *                BOULDER, COLORADO  (80307)  U.S.A.             *
    C     *                                                               *
    C     *                   WHICH IS SPONSORED BY                       *
    C     *                                                               *
    C     *              THE NATIONAL SCIENCE FOUNDATION                  *
    C     *                                                               *
    C     * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
    C
    C     PROGRAM TO ILLUSTRATE THE USE OF HSTCYL TO SOLVE THE EQUATION
    C
    C    (1/R)(D/DR)(R*DU/DR) + (D/DZ)(DU/DZ) = (2*R*Z)**2*(4*Z**2 + 3*R**2)
    C
    C     ON THE RECTANGLE 0 .LT. R .LT. 1 , 0 .LT. Z .LT. 1 WITH THE
    C     BOUNDARY CONDITIONS
    C
    C     (DU/DR)(1,Z) = 4*Z**2  FOR  0 .LE. Z .LE. 1
    C
    C     AND
    C
    C     (DU/DZ)(R,0) = 0 AND (DU/DZ)(R,1) = 4*R**2  FOR  0 .LE. R .LE. 1 .
    C
    C     THE SOLUTION TO THIS PROBLEM IS NOT UNIQUE.  IT IS A
    C     ONE-PARAMETER FAMILY OF SOLUTIONS GIVEN BY
    C
    C            U(R,Z) = (R*Z)**4 + ARBITRARY CONSTANT .
    C
    C     THE R-INTERVAL WILL CONTAIN 50 UNKNOWNS AND THE Z-INTERVAL WILL
    C     CONTAIN 52 UNKNOWNS.
    C
          DIMENSION       F(51,52)   ,BDB(52)    ,BDC(50)    ,BDD(50)    ,
         1                W(1108)    ,R(50)      ,Z(52)
    C
    C     FROM DIMENSION STATEMENT WE GET VALUE OF IDIMF.  ALSO NOTE THAT W
    C     IS DIMENSIONED (13 + INT(LOG2(N)))*M + 4*N .
    C
          IDIMF = 51
          A = 0.
          B = 1.
          M = 50
          MBDCND = 6
          C = 0.
          D = 1.
          N = 52
          NBDCND = 3
          ELMBDA = 0.
    C
    C     GENERATE AND STORE GRID POINTS FOR THE PURPOSE OF COMPUTING
    C     BOUNDARY DATA AND THE RIGHT SIDE OF THE POISSON EQUATION.
    C
          DO 101 I=1,M
             R(I) = (FLOAT(I)-0.5)/50.
      101 CONTINUE
          DO 102 J=1,N
             Z(J) = (FLOAT(J)-0.5)/52.
      102 CONTINUE
    C
    C     GENERATE BOUNDARY DATA.
    C
          DO 103 J=1,N
             BDB(J) = 4.*Z(J)**4
      103 CONTINUE
          DO 104 I=1,M
             BDC(I) = 0.
             BDD(I) = 4.*R(I)**4
      104 CONTINUE
    C
    C     BDA IS A DUMMY VARIABLE.
    C
    C     GENERATE RIGHT SIDE OF EQUATION.
    C
          DO 106 I=1,M
             DO 105 J=1,N
                F(I,J) = 4.*R(I)**2*Z(J)**2*(4.*Z(J)**2+3.*R(I)**2)
      105    CONTINUE
      106 CONTINUE
          CALL HSTCYL (A,B,M,MBDCND,BDA,BDB,C,D,N,NBDCND,BDC,BDD,ELMBDA,F,
         1             IDIMF,PERTRB,IERROR,W)
    C
    C     COMPUTE DISCRETIZATION ERROR BY MINIMIZING OVER ALL A THE FUNCTION
    C     NORM(F(I,J) - A*1 - U(R(I),Z(J))).  THE EXACT SOLUTION IS
    C                U(R,Z) = (R*Z)**4 + ARBITRARY CONSTANT.
    C
          X = 0.
          DO 108 I=1,M
             DO 107 J=1,N
                X = X+F(I,J)-(R(I)*Z(J))**4
      107    CONTINUE
      108 CONTINUE
          X = X/FLOAT(M*N)
          DO 110 I=1,M
             DO 109 J=1,N
                F(I,J) = F(I,J)-X
      109    CONTINUE
      110 CONTINUE
          ERR = 0.
          DO 112 I=1,M
             DO 111 J=1,N
                X = ABS(F(I,J)-(R(I)*Z(J))**4)
                IF (X .GT. ERR) ERR = X
      111    CONTINUE
      112 CONTINUE
          PRINT 1001 , IERROR,PERTRB,ERR,W(1)
          STOP
    C
     1001 FORMAT (1H1,20X,25HSUBROUTINE HSTCYL EXAMPLE///
         1        10X,46HTHE OUTPUT FROM THE NCAR CONTROL DATA 7600 WAS//
         2        32X,10HIERROR = 0/32X,20HPERTRB =-4.43114E-04/
         3        18X,34HDISCRETIZATION ERROR = 7.52796E-05/
         4        12X,32HREQUIRED LENGTH OF W ARRAY = 958//
         5        10X,32HTHE OUTPUT FROM YOUR COMPUTER IS//
         6        32X,8HIERROR =,I2/32X,8HPERTRB =,E12.5/
         7        18X,22HDISCRETIZATION ERROR =,E12.5/
         8        12X,28HREQUIRED LENGTH OF W ARRAY =,F4.0)
    C
          END

THSTPLR

    C
    C file thstplr.f
    C
    C     * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
    C     *                                                               *
    C     *                  copyright (c) 1999 by UCAR                   *
    C     *                                                               *
    C     *       UNIVERSITY CORPORATION for ATMOSPHERIC RESEARCH         *
    C     *                                                               *
    C     *                      all rights reserved                      *
    C     *                                                               *
    C     *                      FISHPACK version 4.1                     *
    C     *                                                               *
    C     *     A PACKAGE OF FORTRAN SUBPROGRAMS FOR THE SOLUTION OF      *
    C     *                                                               *
    C     *      SEPARABLE ELLIPTIC PARTIAL DIFFERENTIAL EQUATIONS        *
    C     *                                                               *
    C     *                             BY                                *
    C     *                                                               *
    C     *        JOHN ADAMS, PAUL SWARZTRAUBER AND ROLAND SWEET         *
    C     *                                                               *
    C     *                             OF                                *
    C     *                                                               *
    C     *         THE NATIONAL CENTER FOR ATMOSPHERIC RESEARCH          *
    C     *                                                               *
    C     *                BOULDER, COLORADO  (80307)  U.S.A.             *
    C     *                                                               *
    C     *                   WHICH IS SPONSORED BY                       *
    C     *                                                               *
    C     *              THE NATIONAL SCIENCE FOUNDATION                  *
    C     *                                                               *
    C     * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
    C
    C
    C     PROGRAM TO ILLUSTRATE THE USE OF HSTPLR TO SOLVE THE EQUATION
    C
    C     (1/R)(D/DR)(R*DU/DR) + (1/R**2)(D/DTHETA)(DU/DTHETA) = 16*R**2
    C
    C     ON THE QUARTER-DISK 0 .LT. R .LT. 1 AND 0 .LT. THETA .LT. PI/2
    C     WITH THE BOUNDARY CONDITIONS
    C
    C     U(1,THETA) = 1 - COS(4*THETA)  FOR  0 .LE. THETA .LE. PI/2
    C
    C     AND
    C
    C     (DU/DR)(R,0) = (DU/DR)(R,PI/2) = 0  FOR  O .LT. R .LT. 1 .
    C
    C     NOTE THAT U AT THE ORIGIN IS UNSPECIFIED.  THE EXACT SOLUTION TO
    C     THIS PROBLEM IS
    C
    C               U(R,THETA) = (R**4)(1-COS(4*THETA)) .
    C
    C     WE WILL USE 50 UNKNOWNS IN THE R-INTERVAL AND 48 UNKNOWNS IN
    C     THE THETA-INTERVAL.
    C
          DIMENSION       F(51,50)   ,BDB(48)    ,BDC(50)    ,BDD(50)    ,
         1                W(1092)    ,R(50)      ,THETA(48)
    C
    C     FROM DIMENSION STATEMENT WE GET VALUE OF IDIMF.  ALSO NOTE THAT W
    C     IS DIMENSIONED (13 + LOG2(N))*M + 4*N .
    C
          IDIMF = 51
          A = 0.
          B = 1.
          M = 50
          MBDCND = 5
          C = 0.
          PI = PIMACH(DUM)
          D = PI/2.
          N = 48
          NBDCND = 3
          ELMBDA = 0.
    C
    C     GENERATE AND STORE GRID POINTS FOR THE PURPOSE OF COMPUTING
    C     BOUNDARY DATA AND THE RIGHT SIDE OF THE POISSON EQUATION.
    C
          DO 101 I=1,M
             R(I) = (FLOAT(I)-0.5)/50.
      101 CONTINUE
          DO 102 J=1,N
             THETA(J) = (FLOAT(J)-0.5)*PI/96.
      102 CONTINUE
    C
    C     GENERATE BOUNDARY DATA.
    C
          DO 103 J=1,N
             BDB(J) = 1.-COS(4.*THETA(J))
      103 CONTINUE
          DO 104 I=1,M
             BDC(I) = 0.
             BDD(I) = 0.
      104 CONTINUE
    C
    C     BDA IS A DUMMY VARIABLE.
    C
    C
    C     GENERATE RIGHT SIDE OF EQUATION.
    C
          DO 106 I=1,M
             DO 105 J=1,N
                F(I,J) = 16.*R(I)**2
      105    CONTINUE
      106 CONTINUE
          CALL HSTPLR (A,B,M,MBDCND,BDA,BDB,C,D,N,NBDCND,BDC,BDD,ELMBDA,F,
         1             IDIMF,PERTRB,IERROR,W)
    C
    C     COMPUTE DISCRETIZATION ERROR.  THE EXACT SOLUTION IS
    C
    C                U(R,THETA) = R**4*(1 - COS(4*THETA))
    C
          ERR = 0.
          DO 108 I=1,M
             DO 107 J=1,N
                Z = ABS(F(I,J)-R(I)**4*(1.-COS(4.*THETA(J))))
                IF (Z .GT. ERR) ERR = Z
      107    CONTINUE
      108 CONTINUE
          PRINT 1001 , IERROR,ERR,W(1)
          STOP
    C
     1001 FORMAT (1H1,20X,25HSUBROUTINE HSTPLR EXAMPLE///
         1        10X,46HTHE OUTPUT FROM THE NCAR CONTROL DATA 7600 WAS//
         2        32X,10HIERROR = 0/
         3        18X,34HDISCRETIZATION ERROR = 1.13038E-03/
         4        12X,33HREQUIRED LENGTH OF W ARRAY = 1042//
         5        10X,32HTHE OUTPUT FROM YOUR COMPUTER IS//
         6        32X,8HIERROR =,I2/18X,22HDISCRETIZATION ERROR =,E12.5/
         7        12X,28HREQUIRED LENGTH OF W ARRAY =,F5.0)
    C
          END

THSTSSP

    C
    C file thstssp.f
    C
    C     * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
    C     *                                                               *
    C     *                  copyright (c) 1999 by UCAR                   *
    C     *                                                               *
    C     *       UNIVERSITY CORPORATION for ATMOSPHERIC RESEARCH         *
    C     *                                                               *
    C     *                      all rights reserved                      *
    C     *                                                               *
    C     *                      FISHPACK version 4.1                     *
    C     *                                                               *
    C     *     A PACKAGE OF FORTRAN SUBPROGRAMS FOR THE SOLUTION OF      *
    C     *                                                               *
    C     *      SEPARABLE ELLIPTIC PARTIAL DIFFERENTIAL EQUATIONS        *
    C     *                                                               *
    C     *                             BY                                *
    C     *                                                               *
    C     *        JOHN ADAMS, PAUL SWARZTRAUBER AND ROLAND SWEET         *
    C     *                                                               *
    C     *                             OF                                *
    C     *                                                               *
    C     *         THE NATIONAL CENTER FOR ATMOSPHERIC RESEARCH          *
    C     *                                                               *
    C     *                BOULDER, COLORADO  (80307)  U.S.A.             *
    C     *                                                               *
    C     *                   WHICH IS SPONSORED BY                       *
    C     *                                                               *
    C     *              THE NATIONAL SCIENCE FOUNDATION                  *
    C     *                                                               *
    C     * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
    C
    C     PROGRAM TO ILLUSTRATE THE USE OF HSTSSP TO SOLVE POISSON"S
    C     EQUATION
    C
    C             (1/SIN(THETA))(D/DTHETA)(SIN(THETA)*DU/DTHETA) +
    C
    C    (1/SIN(THETA)**2)(D/DPHI)(DU/DPHI) = 2 - 6*(SIN(THETA)*SIN(PHI))**2
    C     ON THE NORTHERN HEMISPHERE SUBJECT TO EQUATORIAL SYMMETRY, I.E.
    C     THE DERIVATIVE OF THE SOLUTION AT THETA = PI/2 IS ZERO.  A
    C     5-DEGREE GRID IS TO BE USED.
    C
    C     THE EXACT SOLUTION IS NOT UNIQUE.  ANY FUNCTION OF THE FORM
    C
    C           U(THETA,PHI) = (SIN(THETA)*SIN(PHI))**2 + CONSTANT
    C
    C     IS A SOLUTION.
    C
          DIMENSION       F(18,72)   ,BDB(72)    ,SINT(18)   ,SINP(72)   ,
         1                W(630)
    C
    C     THE VALUE OF IDIMF IS THE FIRST DIMENSION OF F. W IS DIMENSIONED
    C     (13 + INT(LOG2(N)))*M + 4*N
    C
          PI = PIMACH(DUM)
          A = 0.
          B = PI/2.
          M = 18
          MBDCND = 6
          C = 0.
          D = 2.*PI
          N = 72
          NBDCND = 0
          ELMBDA = 0.
          IDIMF = 18
    C
    C     GENERATE SINES FOR USE IN SUBSEQUENT COMPUTATIONS
    C
          DTHETA = B/FLOAT(M)
          DO 101 I=1,M
             SINT(I) = SIN((FLOAT(I)-0.5)*DTHETA)
      101 CONTINUE
          DPHI = D/FLOAT(N)
          DO 102 J=1,N
             SINP(J) = SIN((FLOAT(J)-0.5)*DPHI)
      102 CONTINUE
    C
    C     COMPUTE RIGHT SIDE OF EQUATION AND STORE IN F
    C
          DO 104 J=1,N
             DO 103 I=1,M
                F(I,J) = 2.-6.*(SINT(I)*SINP(J))**2
      103    CONTINUE
      104 CONTINUE
    C
    C     STORE DERIVATIVE DATA AT THE EQUATOR
    C
          DO 105 J=1,N
             BDB(J) = 0.
      105 CONTINUE
    C
    C     BDA, BDC, AND BDD ARE DUMMY VARIABLES.
    C
          CALL HSTSSP (A,B,M,MBDCND,BDA,BDB,C,D,N,NBDCND,BDC,BDD,ELMBDA,F,
         1             IDIMF,PERTRB,IERROR,W)
    C
    C     COMPUTE DISCRETIZATION ERROR. SINCE PROBLEM IS SINGULAR, THE
    C     SOLUTION MUST BE NORMALIZED.
    C
          ERR = 0.
          DO 107 J=1,N
             DO 106 I=1,M
                Z = ABS(F(I,J)-(SINT(I)*SINP(J))**2-F(1,1))
                IF (Z .GT. ERR) ERR = Z
      106    CONTINUE
      107 CONTINUE
    C
          PRINT 1001 , IERROR,PERTRB,ERR,W(1)
          STOP
    C
     1001 FORMAT (1H1,20X,25HSUBROUTINE HSTSSP EXAMPLE///
         1        10X,46HTHE OUTPUT FROM THE NCAR CONTROL DATA 7600 WAS//
         2        32X,10HIERROR = 0/32X,20HPERTRB = 6.35830E-04/
         3        18X,34HDISCRETIZATION ERROR = 3.37523E-03/
         4        12X,32HREQUIRED LENGTH OF W ARRAY = 540//
         5        10X,32HTHE OUTPUT FROM YOUR COMPUTER IS//
         6        32X,8HIERROR =,I2/32X,8HPERTRB =,E12.5/
         7        18X,22HDISCRETIZATION ERROR =,E12.5/
         8        12X,28HREQUIRED LENGTH OF W ARRAY =,F4.0)
    C
          END

THW3CRT

    C
    C file thw3crt.f
    C
    C     * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
    C     *                                                               *
    C     *                  copyright (c) 1999 by UCAR                   *
    C     *                                                               *
    C     *       UNIVERSITY CORPORATION for ATMOSPHERIC RESEARCH         *
    C     *                                                               *
    C     *                      all rights reserved                      *
    C     *                                                               *
    C     *                      FISHPACK version 4.1                     *
    C     *                                                               *
    C     *     A PACKAGE OF FORTRAN SUBPROGRAMS FOR THE SOLUTION OF      *
    C     *                                                               *
    C     *      SEPARABLE ELLIPTIC PARTIAL DIFFERENTIAL EQUATIONS        *
    C     *                                                               *
    C     *                             BY                                *
    C     *                                                               *
    C     *        JOHN ADAMS, PAUL SWARZTRAUBER AND ROLAND SWEET         *
    C     *                                                               *
    C     *                             OF                                *
    C     *                                                               *
    C     *         THE NATIONAL CENTER FOR ATMOSPHERIC RESEARCH          *
    C     *                                                               *
    C     *                BOULDER, COLORADO  (80307)  U.S.A.             *
    C     *                                                               *
    C     *                   WHICH IS SPONSORED BY                       *
    C     *                                                               *
    C     *              THE NATIONAL SCIENCE FOUNDATION                  *
    C     *                                                               *
    C     * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
    C
    C        PROGRAM TO ILLUSTRATE THE USE OF SUBROUTINE HW3CRT TO
    C     SOLVE THE HELMHOLTZ EQUATION
    C
    C     (D/DX)(DU/DX) + (D/DY)(DU/DY) + (D/DZ)(DU/DZ) - 3U
    C
    C       =  4X**2*(3-X**2):SIN(Y)*COS(Z)
    C
    C     ON THE PARALLELEPIPED 0 .LT. X .LT. 1, 0 .LT. Y .LT. 2*PI,
    C     0 .LT. Z .LT. PI/2 WITH THE BOUNDARY CONDITIONS
    C
    C     U(0,Y,Z) = 0
    C                           0 .LE. Y .LE. 2*PI , 0 .LE. Z .LE. PI/2
    C     U(1,Y,Z) = SIN(Y)*COS(Z)
    C
    C     U PERIODIC IN Y,
    C
    C     U(X,Y,0) = X**4*SIN(Y)
    C                           0 .LE. X .LE. 1 , 0 .LE. Y .LE. 2*PI
    C     (DU/DX)(X,Y,PI/2) = -X**4*SIN(Y)
    C
    C     USING A FINITE DIFFERENCE GRID WITH PANEL WIDTHS
    C
    C     DELTAX (=DX) = 1/10 , DELTAY (=DY) = 1/40 , DELTAZ (=DZ) = 1/15.
    C
    C        THE EXACT SOLUTION OF THIS PROBLEM IS
    C
    C     U(X,Y,Z) = X**4*SIN(Y)*COS(Z) .
    C
          DIMENSION       F(11,41,16),BDZF(11,41),W(370)     ,X(11)      ,
         1                Y(41)      ,Z(16)
    C
    C        FROM THE DESCRIPTION OF THE PROBLEM GIVEN ABOVE, WE DEFINE
    C     THE FOLLOWING QUANTITIES
    C
          ELMBDA = -3.
          XS = 0.
          XF = 1.
          LBDCND = 1
          YS = 0.
          PI = PIMACH(DUM)
          YF = 2.*PI
          MBDCND = 0
          ZS = 0.
          ZF = PI/2.
          NBDCND = 2
          L = 10
          M = 40
          N = 15
    C
    C     FROM THE DIMENSION STATEMENT ABOVE WE DEFINE
    C
          LDIMF = 11
          MDIMF = 41
    C
    C     ALSO NOTE THAT W HAS BEEN DIMENSIONED
    C        30+L+M+5*N+MAX(L,M,N)+7*(INT((L+1)/2)+INT((M+1)/2))
    C      = 30+10+40+75+40+7*(5+20) = 370
    C     WE DEFINE THE GRID POINTS FOR LATER USE.
    C
          LP1 = L+1
          DX = (XF-XS)/FLOAT(L)
          DO 101 I=1,LP1
             X(I) = XS+FLOAT(I-1)*DX
      101 CONTINUE
          MP1 = M+1
          DY = (YF-YS)/FLOAT(M)
          DO 102 J=1,MP1
             Y(J) = YS+FLOAT(J-1)*DY
      102 CONTINUE
          NP1 = N+1
          DZ = (ZF-ZS)/FLOAT(N)
          DO 103 K=1,NP1
             Z(K) = ZS+FLOAT(K-1)*DZ
      103 CONTINUE
    C
    C     WE DEFINE THE ARRAY OF DERIVATIVE BOUNDARY VALUES.
    C
          DO 105 I=1,LP1
             DO 104 J=1,MP1
                BDZF(I,J) = -X(I)**4*SIN(Y(J))
      104    CONTINUE
      105 CONTINUE
    C
    C     NOTE THAT FOR THIS EXAMPLE ALL OTHER BOUNDARY ARRAYS ARE
    C     DUMMY VARIABLES.
    C     WE DEFINE THE FUNCTION BOUNDARY VALUES IN THE F ARRAY.
    C
          DO 107 J=1,MP1
             DO 106 K=1,NP1
                F(1,J,K) = 0.
                F(LP1,J,K) = SIN(Y(J))*COS(Z(K))
      106    CONTINUE
      107 CONTINUE
          DO 109 I=1,LP1
             DO 108 J=1,MP1
                F(I,J,1) = X(I)**4*SIN(Y(J))
      108    CONTINUE
      109 CONTINUE
    C
    C     WE NOW DEFINE THE VALUES OF THE RIGHT SIDE OF THE HELMHOLTZ
    C     EQUATION.
    C
          DO 112 I=2,L
             DO 111 J=1,MP1
                DO 110 K=2,NP1
                   F(I,J,K) = 4.*X(I)**2*(3.-X(I)**2)*SIN(Y(J))*COS(Z(K))
      110       CONTINUE
      111    CONTINUE
      112 CONTINUE
    C
    C     CALL HW3CRT TO GENERATE AND SOLVE THE FINITE DIFFERENCE EQUATION.
    C
          CALL HW3CRT (XS,XF,L,LBDCND,BDXS,BDXF,YS,YF,M,MBDCND,BDYS,BDYF,
         1             ZS,ZF,N,NBDCND,BDZS,BDZF,ELMBDA,LDIMF,MDIMF,F,
         2             PERTRB,IERROR,W)
    C
    C     COMPUTE DISCRETIZATION ERROR.  THE EXACT SOLUTION TO THE
    C     PROBLEM IS
    C
    C        U(X,Y,Z) = X**4*SIN(Y)*COS(Z)
    C
          ERR = 0.
          DO 115 I=1,LP1
             DO 114 J=1,MP1
                DO 113 K=1,NP1
                   T = ABS(F(I,J,K)-X(I)**4*SIN(Y(J))*COS(Z(K)))
                   IF (T .GT. ERR) ERR = T
      113       CONTINUE
      114    CONTINUE
      115 CONTINUE
          PRINT 1001 , IERROR,ERR
          STOP
    C
     1001 FORMAT (1H1,20X,25HSUBROUTINE HW3CRT EXAMPLE///
         1        10X,46HTHE OUTPUT FROM THE NCAR CONTROL DATA 7600 WAS//
         2        32X,10HIERROR = 0/
         3        18X,34HDISCRETIZATION ERROR = 9.64802E-03//
         4        10X,32HTHE OUTPUT FROM YOUR COMPUTER IS//
         5        32X,8HIERROR =,I2/18X,22HDISCRETIZATION ERROR =,E12.5)
    C
          END

THWSCRT

    C
    C file thwscrt.f
    C
    C     * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
    C     *                                                               *
    C     *                  copyright (c) 1999 by UCAR                   *
    C     *                                                               *
    C     *       UNIVERSITY CORPORATION for ATMOSPHERIC RESEARCH         *
    C     *                                                               *
    C     *                      all rights reserved                      *
    C     *                                                               *
    C     *                      FISHPACK version 4.1                     *
    C     *                                                               *
    C     *     A PACKAGE OF FORTRAN SUBPROGRAMS FOR THE SOLUTION OF      *
    C     *                                                               *
    C     *      SEPARABLE ELLIPTIC PARTIAL DIFFERENTIAL EQUATIONS        *
    C     *                                                               *
    C     *                             BY                                *
    C     *                                                               *
    C     *        JOHN ADAMS, PAUL SWARZTRAUBER AND ROLAND SWEET         *
    C     *                                                               *
    C     *                             OF                                *
    C     *                                                               *
    C     *         THE NATIONAL CENTER FOR ATMOSPHERIC RESEARCH          *
    C     *                                                               *
    C     *                BOULDER, COLORADO  (80307)  U.S.A.             *
    C     *                                                               *
    C     *                   WHICH IS SPONSORED BY                       *
    C     *                                                               *
    C     *              THE NATIONAL SCIENCE FOUNDATION                  *
    C     *                                                               *
    C     * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
    C
    C
    C     PROGRAM TO ILLUSTRATE THE USE OF SUBROUTINE HWSCRT TO SOLVE
    C     THE EQUATION
    C
    C     (D/DX)(DU/DX) + (D/DY)(DU/DY) - 4*U
    C
    C     = (2 - (4 + PI**2/4)*X**2)*COS((Y+1)*PI/2)
    C
    C     WITH THE BOUNDARY CONDITIONS
    C     ON THE RECTANGLE 0 .LT. X .LT. 2, -1 .LT. Y .LT. 3 WITH THE
    C
    C     U(0,Y) = 0
    C                                          -1 .LE. Y .LE. 3
    C     (DU/DX)(2,Y) = 4*COS((Y+1)*PI/2)
    C
    C     AND WITH U PERIODIC IN Y.
    C          THE X-INTERVAL WILL BE DIVIDED INTO 40 PANELS AND THE
    C     Y-INTERVAL WILL BE DIVIDED INTO 80 PANELS.
    C
          DIMENSION       F(45,82)   ,BDB(81)    ,W(1103)    ,X(41)      ,
         1                Y(81)
    C
    C     FROM DIMENSION STATEMENT WE GET VALUE OF IDIMF.  ALSO NOTE THAT W
    C     IS DIMENSIONED 4*(N+1) + (13 + INT(LOG2(N+1)))*(M+1) .
    C
          IDIMF = 45
          A = 0.
          B = 2.
          M = 40
          MBDCND = 2
          C = -1.
          D = 3.
          N = 80
          NBDCND = 0
          ELMBDA = -4.
    C
    C     AUXILIARY QUANTITIES.
    C
          PI = PIMACH(DUM)
          PIBY2 = PI/2.
          PISQ = PI**2
          MP1 = M+1
          NP1 = N+1
    C
    C     GENERATE AND STORE GRID POINTS FOR THE PURPOSE OF COMPUTING
    C     BOUNDARY DATA AND THE RIGHT SIDE OF THE HELMHOLTZ EQUATION.
    C
          DO 101 I=1,MP1
             X(I) = FLOAT(I-1)/20.
      101 CONTINUE
          DO 102 J=1,NP1
             Y(J) = -1.+FLOAT(J-1)/20.
      102 CONTINUE
    C
    C     GENERATE BOUNDARY DATA.
    C
          DO 103 J=1,NP1
             BDB(J) = 4.*COS((Y(J)+1.)*PIBY2)
      103 CONTINUE
    C
    C     BDA, BDC, AND BDD ARE DUMMY VARIABLES.
    C
          DO 104 J=1,NP1
             F(1,J) = 0.
      104 CONTINUE
    C
    C     GENERATE RIGHT SIDE OF EQUATION.
    C
          DO 106 I=2,MP1
             DO 105 J=1,NP1
                F(I,J) = (2.-(4.+PISQ/4.)*X(I)**2)*COS((Y(J)+1.)*PIBY2)
      105    CONTINUE
      106 CONTINUE
          CALL HWSCRT (A,B,M,MBDCND,BDA,BDB,C,D,N,NBDCND,BDC,BDD,ELMBDA,F,
         1             IDIMF,PERTRB,IERROR,W)
    C
    C     COMPUTE DISCRETIZATION ERROR.  THE EXACT SOLUTION IS
    C                U(X,Y) = X**2*COS((Y+1)*PIBY2)
    C
          ERR = 0.
          DO 108 I=1,MP1
             DO 107 J=1,NP1
                Z = ABS(F(I,J)-X(I)**2*COS((Y(J)+1.)*PIBY2))
                IF (Z .GT. ERR) ERR = Z
      107    CONTINUE
      108 CONTINUE
          PRINT 1001 , IERROR,ERR,W(1)
          STOP
    C
     1001 FORMAT (1H1,20X,25HSUBROUTINE HWSCRT EXAMPLE///
         1        10X,46HTHE OUTPUT FROM THE NCAR CONTROL DATA 7600 WAS//
         2        32X,10HIERROR = 0/
         3        18X,34HDISCRETIZATION ERROR = 5.36508E-04/
         4        12X,32HREQUIRED LENGTH OF W ARRAY = 880//
         5        10X,32HTHE OUTPUT FROM YOUR COMPUTER IS//
         6        32X,8HIERROR =,I2/18X,22HDISCRETIZATION ERROR =,E12.5/
         7        12X,28HREQUIRED LENGTH OF W ARRAY =,F4.0)
    C
          END

THWSCSP

    C
    C file thwscsp.f
    C
    C     * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
    C     *                                                               *
    C     *                  copyright (c) 1999 by UCAR                   *
    C     *                                                               *
    C     *       UNIVERSITY CORPORATION for ATMOSPHERIC RESEARCH         *
    C     *                                                               *
    C     *                      all rights reserved                      *
    C     *                                                               *
    C     *                      FISHPACK version 4.1                     *
    C     *                                                               *
    C     *     A PACKAGE OF FORTRAN SUBPROGRAMS FOR THE SOLUTION OF      *
    C     *                                                               *
    C     *      SEPARABLE ELLIPTIC PARTIAL DIFFERENTIAL EQUATIONS        *
    C     *                                                               *
    C     *                             BY                                *
    C     *                                                               *
    C     *        JOHN ADAMS, PAUL SWARZTRAUBER AND ROLAND SWEET         *
    C     *                                                               *
    C     *                             OF                                *
    C     *                                                               *
    C     *         THE NATIONAL CENTER FOR ATMOSPHERIC RESEARCH          *
    C     *                                                               *
    C     *                BOULDER, COLORADO  (80307)  U.S.A.             *
    C     *                                                               *
    C     *                   WHICH IS SPONSORED BY                       *
    C     *                                                               *
    C     *              THE NATIONAL SCIENCE FOUNDATION                  *
    C     *                                                               *
    C     * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
    C
    C
    C     PROGRAM TO ILLUSTRATE THE USE OF HWSCSP
    C
          DIMENSION       F(48,33)   ,BDTF(33)   ,W(775)     ,R(33)      ,
         1                THETA(48)
    C
          PI = PIMACH(DUM)
          INTL = 0
          TS = 0.
          TF = PI/2.
          M = 36
          MBDCND = 6
          RS = 0.
          RF = 1.
          N = 32
          NBDCND = 5
          ELMBDA = 0.
          IDIMF = 48
    C
    C     GENERATE AND STORE GRID POINTS FOR THE PURPOSE OF COMPUTING THE
    C     BOUNDARY DATA AND THE RIGHT SIDE OF THE EQUATION.
    C
          MP1 = M+1
          DTHETA = TF/FLOAT(M)
          DO 101 I=1,MP1
             THETA(I) = FLOAT(I-1)*DTHETA
      101 CONTINUE
          NP1 = N+1
          DR = 1./FLOAT(N)
          DO 102 J=1,NP1
             R(J) = FLOAT(J-1)*DR
      102 CONTINUE
    C
    C     GENERATE NORMAL DERIVATIVE DATA AT EQUATOR
    C
          DO 103 J=1,NP1
             BDTF(J) = 0.
      103 CONTINUE
    C
    C     COMPUTE BOUNDARY DATA ON THE SURFACE OF THE SPHERE
    C
          DO 104 I=1,MP1
             F(I,N+1) = COS(THETA(I))**4
      104 CONTINUE
    C
    C     COMPUTE RIGHT SIDE OF EQUATION
    C
          DO 106 I=1,MP1
             CI4 = 12.*COS(THETA(I))**2
             DO 105 J=1,N
                F(I,J) = CI4*R(J)**2
      105    CONTINUE
      106 CONTINUE
    C
          CALL HWSCSP (INTL,TS,TF,M,MBDCND,BDTS,BDTF,RS,RF,N,NBDCND,BDRS,
         1             BDRF,ELMBDA,F,IDIMF,PERTRB,IERROR,W)
    C
    C     COMPUTE DISCRETIZATION ERROR
    C
          ERR = 0.
          DO 108 I=1,MP1
             CI4 = COS(THETA(I))**4
             DO 107 J=1,N
                Z = ABS(F(I,J)-CI4*R(J)**4)
                IF (Z .GT. ERR) ERR = Z
      107    CONTINUE
      108 CONTINUE
          IW = INT(W(1))
          PRINT 1001 , IERROR,ERR,IW
    C
    C     THE FOLLOWING PROGRAM ILLUSTRATES THE USE OF HWSCSP TO SOLVE
    C     A THREE DIMENSIONAL PROBLEM WHICH HAS LONGITUDNAL DEPENDENCE
    C
          MBDCND = 2
          NBDCND = 1
          DPHI = PI/72.
          ELMBDA = -2.*(1.-COS(DPHI))/DPHI**2
    C
    C     COMPUTE BOUNDARY DATA ON THE SURFACE OF THE SPHERE
    C
          DO 109 I=1,MP1
             F(I,N+1) = SIN(THETA(I))
      109 CONTINUE
    C
    C     COMPUTE RIGHT SIDE OF THE EQUATION
    C
          DO 111 J=1,N
             DO 110 I=1,MP1
                F(I,J) = 0.
      110    CONTINUE
      111 CONTINUE
    C
          CALL HWSCSP (INTL,TS,TF,M,MBDCND,BDTS,BDTF,RS,RF,N,NBDCND,BDRS,
         1             BDRF,ELMBDA,F,IDIMF,PERTRB,IERROR,W)
    C
    C     COMPUTE DISCRETIZATION ERROR   (FOURIER COEFFICIENTS)
    C
          ERR = 0
          DO 113 I=1,MP1
             SI = SIN(THETA(I))
             DO 112 J=1,NP1
                Z = ABS(F(I,J)-R(J)*SI)
                IF (Z .GT. ERR) ERR = Z
      112    CONTINUE
      113 CONTINUE
    C
          IW = INT(W(1))
          PRINT 1002 , IERROR,ERR,IW
          STOP
    C
     1001 FORMAT (1H1,20X,27HSUBROUTINE HWSCSP EXAMPLE 1///
         1        10X,46HTHE OUTPUT FROM THE NCAR CONTROL DATA 7600 WAS//
         2        32X,10HIERROR = 0/
         3        18X,34HDISCRETIZATION ERROR = 7.99842E-04/
         4        12X,32HREQUIRED LENGTH OF W ARRAY = 775//
         5        10X,32HTHE OUTPUT FROM YOUR COMPUTER IS//
         6        32X,8HIERROR =,I2/18X,22HDISCRETIZATION ERROR =,E12.5/
         7        12X,28HREQUIRED LENGTH OF W ARRAY =,I4)
     1002 FORMAT (1H1,20X,27HSUBROUTINE HWSCSP EXAMPLE 2///
         1        10X,46HTHE OUTPUT FROM THE NCAR CONTROL DATA 7600 WAS//
         2        32X,10HIERROR = 0/
         3        18X,34HDISCRETIZATION ERROR = 5.86824E-05/
         4        12X,32HREQUIRED LENGTH OF W ARRAY = 775//
         5        10X,32HTHE OUTPUT FROM YOUR COMPUTER IS//
         6        32X,8HIERROR =,I2/18X,22HDISCRETIZATION ERROR =,E12.5/
         7        12X,28HREQUIRED LENGTH OF W ARRAY =,I4)
    C
          END

THWSCYL

    C
    C file thwscyl.f
    C
    C     * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
    C     *                                                               *
    C     *                  copyright (c) 1999 by UCAR                   *
    C     *                                                               *
    C     *       UNIVERSITY CORPORATION for ATMOSPHERIC RESEARCH         *
    C     *                                                               *
    C     *                      all rights reserved                      *
    C     *                                                               *
    C     *                      FISHPACK version 4.1                     *
    C     *                                                               *
    C     *     A PACKAGE OF FORTRAN SUBPROGRAMS FOR THE SOLUTION OF      *
    C     *                                                               *
    C     *      SEPARABLE ELLIPTIC PARTIAL DIFFERENTIAL EQUATIONS        *
    C     *                                                               *
    C     *                             BY                                *
    C     *                                                               *
    C     *        JOHN ADAMS, PAUL SWARZTRAUBER AND ROLAND SWEET         *
    C     *                                                               *
    C     *                             OF                                *
    C     *                                                               *
    C     *         THE NATIONAL CENTER FOR ATMOSPHERIC RESEARCH          *
    C     *                                                               *
    C     *                BOULDER, COLORADO  (80307)  U.S.A.             *
    C     *                                                               *
    C     *                   WHICH IS SPONSORED BY                       *
    C     *                                                               *
    C     *              THE NATIONAL SCIENCE FOUNDATION                  *
    C     *                                                               *
    C     * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
    C
    C
    C          PROGRAM TO ILLUSTRATE THE USE OF SUBROUTINE HWSCYL TO SOLVE
    C     THE EQUATION
    C
    C     (1/R)(D/DR)(R*(DU/DR)) + (D/DZ)(DU/DZ)
    C
    C     = (2*R*Z)**2*(4*Z**2 + 3*R**2)
    C
    C     ON THE RECTANGLE 0 .LT. R .LT. 1, 0 .LT. Z .LT. 1 WITH THE
    C     BOUNDARY CONDITIONS
    C
    C     U(0,Z) UNSPECIFIED
    C                                            0 .LE. Z .LE. 1
    C     (DU/DR)(1,Z) = 4*Z**4
    C
    C     AND
    C
    C     (DU/DZ)(R,0) = 0
    C                                            0 .LE. R .LE. 1
    C     (DU/DZ)(R,1) = 4*R**4 .
    C
    C          THE R-INTERVAL WILL BE DIVIDED INTO 50 PANELS AND THE
    C     Z-INTERVAL WILL BE DIVIDED INTO 100 PANELS.
    C
          DIMENSION       F(75,105)  ,BDA(101)   ,BDB(101)   ,BDC(51)    ,
         1                BDD(51)    ,W(1373)    ,R(51)      ,Z(101)
    C
    C     FROM DIMENSION STATEMENT WE GET VALUE OF IDIMF.  ALSO NOTE THAT W
    C     IS DIMENSIONED 4*(N+1) + (13 + INT(LOG2(N+1)))*(M+1) .
    C
          IDIMF = 75
          A = 0.
          B = 1.
          M = 50
          MBDCND = 6
          C = 0.
          D = 1.
          N = 100
          NBDCND = 3
          ELMBDA = 0.
    C
    C     AUXILIARY QUANTITIES.
    C
          MP1 = M+1
          NP1 = N+1
    C
    C     GENERATE AND STORE GRID POINTS FOR THE PURPOSE OF COMPUTING
    C     BOUNDARY DATA AND THE RIGHT SIDE OF THE POISSON EQUATION.
    C
          DO 101 I=1,MP1
             R(I) = FLOAT(I-1)/50.
      101 CONTINUE
          DO 102 J=1,NP1
             Z(J) = FLOAT(J-1)/100.
      102 CONTINUE
    C
    C     GENERATE BOUNDARY DATA.
    C
          DO 103 J=1,NP1
             BDB(J) = 4.*Z(J)**4
      103 CONTINUE
          DO 104 I=1,MP1
             BDC(I) = 0.
             BDD(I) = 4.*R(I)**4
      104 CONTINUE
    C
    C     BDA IS A DUMMY VARIABLE.
    C
    C
    C     GENERATE RIGHT SIDE OF EQUATION.
    C
          DO 106 I=1,MP1
             DO 105 J=1,NP1
                F(I,J) = 4.*R(I)**2*Z(J)**2*(4.*Z(J)**2+3.*R(I)**2)
      105    CONTINUE
      106 CONTINUE
          CALL HWSCYL (A,B,M,MBDCND,BDA,BDB,C,D,N,NBDCND,BDC,BDD,ELMBDA,F,
         1             IDIMF,PERTRB,IERROR,W)
    C
    C     COMPUTE DISCRETIZATION ERROR BY MINIMIZING OVER ALL A THE FUNCTION
    C     NORM(F(I,J) - A*1 - U(R(I),Z(J))).  THE EXACT SOLUTION IS
    C                U(R,Z) = (R*Z)**4 + ARBITRARY CONSTANT.
    C
          X = 0.
          DO 108 I=1,MP1
             DO 107 J=1,NP1
                X = X+F(I,J)-(R(I)*Z(J))**4
      107    CONTINUE
      108 CONTINUE
          X = X/FLOAT(NP1*MP1)
          DO 110 I=1,MP1
             DO 109 J=1,NP1
                F(I,J) = F(I,J)-X
      109    CONTINUE
      110 CONTINUE
          ERR = 0.
          DO 112 I=1,MP1
             DO 111 J=1,NP1
                X = ABS(F(I,J)-(R(I)*Z(J))**4)
                IF (X .GT. ERR) ERR = X
      111    CONTINUE
      112 CONTINUE
          PRINT 1001 , IERROR,PERTRB,ERR,W(1)
          STOP
    C
     1001 FORMAT (1H1,20X,25HSUBROUTINE HWSCYL EXAMPLE///
         1        10X,46HTHE OUTPUT FROM THE NCAR CONTROL DATA 7600 WAS//
         2        32X,10HIERROR = 0/32X,20HPERTRB = 2.26734E-04/
         3        18X,34HDISCRETIZATION ERROR = 3.73672E-04/
         4        12X,33HREQUIRED LENGTH OF W ARRAY = 1118//
         5        10X,32HTHE OUTPUT FROM YOUR COMPUTER IS//
         6        32X,8HIERROR =,I2/32X,8HPERTRB =,E12.5/
         7        18X,22HDISCRETIZATION ERROR =,E12.5/
         8        12X,28HREQUIRED LENGTH OF W ARRAY =,F5.0)
    C
          END

THWSPLR

    C
    C file thwsplr.f
    C
    C     * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
    C     *                                                               *
    C     *                  copyright (c) 1999 by UCAR                   *
    C     *                                                               *
    C     *       UNIVERSITY CORPORATION for ATMOSPHERIC RESEARCH         *
    C     *                                                               *
    C     *                      all rights reserved                      *
    C     *                                                               *
    C     *                      FISHPACK version 4.1                     *
    C     *                                                               *
    C     *     A PACKAGE OF FORTRAN SUBPROGRAMS FOR THE SOLUTION OF      *
    C     *                                                               *
    C     *      SEPARABLE ELLIPTIC PARTIAL DIFFERENTIAL EQUATIONS        *
    C     *                                                               *
    C     *                             BY                                *
    C     *                                                               *
    C     *        JOHN ADAMS, PAUL SWARZTRAUBER AND ROLAND SWEET         *
    C     *                                                               *
    C     *                             OF                                *
    C     *                                                               *
    C     *         THE NATIONAL CENTER FOR ATMOSPHERIC RESEARCH          *
    C     *                                                               *
    C     *                BOULDER, COLORADO  (80307)  U.S.A.             *
    C     *                                                               *
    C     *                   WHICH IS SPONSORED BY                       *
    C     *                                                               *
    C     *              THE NATIONAL SCIENCE FOUNDATION                  *
    C     *                                                               *
    C     * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
    C
    C
    C     PROGRAM TO ILLUSTRATE THE USE OF SUBROUTINE HWSPLR TO SOLVE
    C     THE EQUATION
    C
    C     (1/R)(D/DR)(R*(DU/DR)) + (1/R**2)(D/DTHETA)(DU/DTHETA) = 16*R**2
    C
    C     ON THE QUARTER-DISK 0 .LT. R .LT. 1, 0 .LT. THETA .LT. PI/2 WITH
    C     WITH THE BOUNDARY CONDITIONS
    C
    C     U(1,THETA) = 1 - COS(4*THETA), 0 .LE. THETA .LE. 1
    C
    C     AND
    C
    C     (DU/DTHETA)(R,0) = (DU/DTHETA)(R,PI/2) = 0,  0 .LE. R .LE. 1.
    C
    C     (NOTE THAT THE SOLUTION U IS UNSPECIFIED AT R = 0.)
    C          THE R-INTERVAL WILL BE DIVIDED INTO 50 PANELS AND THE
    C     THETA-INTERVAL WILL BE DIVIDED INTO 48 PANELS.
    C
          DIMENSION       F(100,50)  ,BDC(51)    ,BDD(51)    ,W(1114)    ,
         1                R(51)      ,THETA(49)
    C
    C     FROM DIMENSION STATEMENT WE GET VALUE OF IDIMF.  ALSO NOTE THAT W
    C     IS DIMENSIONED 4*(N+1) + (13 + INT(LOG2(N+1)))*(M+1) .
    C
          IDIMF = 100
          A = 0.
          B = 1.
          M = 50
          MBDCND = 5
          C = 0.
          PI = PIMACH(DUM)
          D = PI/2.
          N = 48
          NBDCND = 3
          ELMBDA = 0.
    C
    C     AUXILIARY QUANTITIES.
    C
          MP1 = M+1
          NP1 = N+1
    C
    C     GENERATE AND STORE GRID POINTS FOR THE PURPOSE OF COMPUTING
    C     BOUNDARY DATA AND THE RIGHT SIDE OF THE POISSON EQUATION.
    C
          DO 101 I=1,MP1
             R(I) = FLOAT(I-1)/50.
      101 CONTINUE
          DO 102 J=1,NP1
             THETA(J) = FLOAT(J-1)*PI/96.
      102 CONTINUE
    C
    C     GENERATE BOUNDARY DATA.
    C
          DO 103 I=1,MP1
             BDC(I) = 0.
             BDD(I) = 0.
      103 CONTINUE
    C
    C     BDA AND BDB ARE DUMMY VARIABLES.
    C
          DO 104 J=1,NP1
             F(MP1,J) = 1.-COS(4.*THETA(J))
      104 CONTINUE
    C
    C     GENERATE RIGHT SIDE OF EQUATION.
    C
          DO 106 I=1,M
             DO 105 J=1,NP1
                F(I,J) = 16.*R(I)**2
      105    CONTINUE
      106 CONTINUE
          CALL HWSPLR (A,B,M,MBDCND,BDA,BDB,C,D,N,NBDCND,BDC,BDD,ELMBDA,F,
         1             IDIMF,PERTRB,IERROR,W)
    C
    C     COMPUTE DISCRETIZATION ERROR.  THE EXACT SOLUTION IS
    C                U(R,THETA) = R**4*(1 - COS(4*THETA))
    C
          ERR = 0.
          DO 108 I=1,MP1
             DO 107 J=1,NP1
                Z = ABS(F(I,J)-R(I)**4*(1.-COS(4.*THETA(J))))
                IF (Z .GT. ERR) ERR = Z
      107    CONTINUE
      108 CONTINUE
          PRINT 1001 , IERROR,ERR,W(1)
          STOP
    C
     1001 FORMAT (1H1,20X,25HSUBROUTINE HWSPLR EXAMPLE///
         1        10X,46HTHE OUTPUT FROM THE NCAR CONTROL DATA 7600 WAS//
         2        32X,10HIERROR = 0/
         3        18X,34HDISCRETIZATION ERROR = 6.19134E-04/
         4        12X,32HREQUIRED LENGTH OF W ARRAY = 882//
         5        10X,32HTHE OUTPUT FROM YOUR COMPUTER IS//
         6        32X,8HIERROR =,I2/18X,22HDISCRETIZATION ERROR =,E12.5/
         7        12X,28HREQUIRED LENGTH OF W ARRAY =,F4.0)
    C
          END

THWSSSP

    C
    C file thwsssp.f
    C
    C     * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
    C     *                                                               *
    C     *                  copyright (c) 1999 by UCAR                   *
    C     *                                                               *
    C     *       UNIVERSITY CORPORATION for ATMOSPHERIC RESEARCH         *
    C     *                                                               *
    C     *                      all rights reserved                      *
    C     *                                                               *
    C     *                      FISHPACK version 4.1                     *
    C     *                                                               *
    C     *     A PACKAGE OF FORTRAN SUBPROGRAMS FOR THE SOLUTION OF      *
    C     *                                                               *
    C     *      SEPARABLE ELLIPTIC PARTIAL DIFFERENTIAL EQUATIONS        *
    C     *                                                               *
    C     *                             BY                                *
    C     *                                                               *
    C     *        JOHN ADAMS, PAUL SWARZTRAUBER AND ROLAND SWEET         *
    C     *                                                               *
    C     *                             OF                                *
    C     *                                                               *
    C     *         THE NATIONAL CENTER FOR ATMOSPHERIC RESEARCH          *
    C     *                                                               *
    C     *                BOULDER, COLORADO  (80307)  U.S.A.             *
    C     *                                                               *
    C     *                   WHICH IS SPONSORED BY                       *
    C     *                                                               *
    C     *              THE NATIONAL SCIENCE FOUNDATION                  *
    C     *                                                               *
    C     * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
    C
    C
    C
    C     PROGRAM TO ILLUSTRATE THE USE OF HWSSSP
    C
          DIMENSION       F(19,73)   ,BDTF(73)   ,SINT(19)   ,SINP(73)   ,
         1                W(600)
    C
          PI = PIMACH(DUM)
          TS = 0
          TF = PI/2.
          M = 18
          MBDCND = 6
          PS = 0
          PF = PI+PI
          N = 72
          NBDCND = 0
          ELMBDA = 0.
          IDIMF = 19
    C
    C     GENERATE SINES FOR USE IN SUBSEQUENT COMPUTATIONS
    C
          DTHETA = TF/FLOAT(M)
          MP1 = M+1
          DO 101 I=1,MP1
             SINT(I) = SIN(FLOAT(I-1)*DTHETA)
      101 CONTINUE
          DPHI = (PI+PI)/FLOAT(N)
          NP1 = N+1
          DO 102 J=1,NP1
             SINP(J) = SIN(FLOAT(J-1)*DPHI)
      102 CONTINUE
    C
    C     COMPUTE RIGHT SIDE OF EQUATION AND STORE IN F
    C
          DO 104 J=1,NP1
             DO 103 I=1,MP1
                F(I,J) = 2.-6.*(SINT(I)*SINP(J))**2
      103    CONTINUE
      104 CONTINUE
    C
    C     STORE DERIVATIVE DATA AT THE EQUATOR
    C
          DO 105 J=1,NP1
             BDTF(J) = 0.
      105 CONTINUE
    C
          CALL HWSSSP (TS,TF,M,MBDCND,BDTS,BDTF,PS,PF,N,NBDCND,BDPS,BDPF,
         1             ELMBDA,F,IDIMF,PERTRB,IERROR,W)
    C
    C     COMPUTE DISCRETIZATION ERROR. SINCE PROBLEM IS SINGULAR, THE
    C     SOLUTION MUST BE NORMALIZED.
    C
          ERR = 0
          DO 107 J=1,NP1
             DO 106 I=1,MP1
                Z = ABS(F(I,J)-(SINT(I)*SINP(J))**2-F(1,1))
                IF (Z .GT. ERR) ERR = Z
      106    CONTINUE
      107 CONTINUE
    C
          IW = INT(W(1))
          PRINT 1001 , IERROR,ERR,IW
          STOP
    C
    C
     1001 FORMAT (1H1,20X,25HSUBROUTINE HWSSSP EXAMPLE///
         1        10X,46HTHE OUTPUT FROM THE NCAR CONTROL DATA 7600 WAS//
         2        32X,10HIERROR = 0/
         3        18X,34HDISCRETIZATION ERROR = 3.38107E-03/
         4        12X,32HREQUIRED LENGTH OF W ARRAY = 600//
         5        10X,32HTHE OUTPUT FROM YOUR COMPUTER IS//
         6        32X,8HIERROR =,I2/18X,22HDISCRETIZATION ERROR =,E12.5 /
         7        12X,28HREQUIRED LENGTH OF W ARRAY =,I4)
    C
          END

TPOIS3D

    C
    C file tpois3d.f
    C
    C     * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
    C     *                                                               *
    C     *                  copyright (c) 1999 by UCAR                   *
    C     *                                                               *
    C     *       UNIVERSITY CORPORATION for ATMOSPHERIC RESEARCH         *
    C     *                                                               *
    C     *                      all rights reserved                      *
    C     *                                                               *
    C     *                      FISHPACK version 4.1                     *
    C     *                                                               *
    C     *     A PACKAGE OF FORTRAN SUBPROGRAMS FOR THE SOLUTION OF      *
    C     *                                                               *
    C     *      SEPARABLE ELLIPTIC PARTIAL DIFFERENTIAL EQUATIONS        *
    C     *                                                               *
    C     *                             BY                                *
    C     *                                                               *
    C     *        JOHN ADAMS, PAUL SWARZTRAUBER AND ROLAND SWEET         *
    C     *                                                               *
    C     *                             OF                                *
    C     *                                                               *
    C     *         THE NATIONAL CENTER FOR ATMOSPHERIC RESEARCH          *
    C     *                                                               *
    C     *                BOULDER, COLORADO  (80307)  U.S.A.             *
    C     *                                                               *
    C     *                   WHICH IS SPONSORED BY                       *
    C     *                                                               *
    C     *              THE NATIONAL SCIENCE FOUNDATION                  *
    C     *                                                               *
    C     * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
    C
    C
    C     THIS PROGRAM ILLUSTRATES THE USE OF THE SUBROUTINE POIS3D TO SOLVE
    C     THE EQUATION
    C
    C     (D/DX)(DU/DX) + (D/DY)(DU/DY) + (1+Z)**2*(D/DZ)(DU/DZ)
    C
    C     - 2*(1+Z)*(DU/DZ) = 2*SIN(X)*SIN(Y)*(1+Z)**4                   (1)
    C
    C     ON THE PARALLELEPIPED -PI .LT. X .LT. PI, -PI .LT. Y .LT. PI,
    C     0 .LT. Z .LT. 1 WITH BOUNDARY CONDITIONS
    C
    C     U PERIODIC IN X
    C
    C     U PERIODIC IN Y
    C
    C     (DU/DZ)(X,Y,0) = 4*SIN(X)*SIN(Y)    -PI .LT. X,Y .LT. PI       (2)
    C
    C     U(X,Y,1) = 16*SIN(X)*SIN(Y)         -PI .LT. X,Y .LT. PI       (3)
    C
    C     USING A FINITE DIFFERENCE GRID WITH DELTAX (= DX) = 2*PI/30 ,
    C     DELTAY (= DY) = 2*PI/30, AND DELTAZ (= DZ) = 1/10.
    C         TO SET UP THE FINITE DIFFERENCE EQUATIONS WE DEFINE THE GRID
    C     POINTS
    C
    C         X(I) = -PI + (I-1)*DX         I=1,2,...,31
    C
    C         Y(J) = -PI + (J-1)*DY         J=1,2,...,31
    C
    C         Z(K) = (K-1)*DZ               K=1,2,...,11
    C
    C     AND LET V(I,J,K) BE AN APPROXIMATION TO U(X(I),Y(J),Z(K)).
    C     NUMBERING THE GRID POINTS IN THIS FASHION GIVES THE SET OF
    C     UNKNOWNS AS V(I,J,K) FOR I=1,2,...,30, J=1,2,...,30, K=1,2,...,10.
    C     HENCE, IN THE PROGRAM L=30, M = 30, AND N = 10.  AT THE INTERIOR
    C     GRID POINT (X(I),Y(J),Z(K)), WE REPLACE ALL DERIVATIVES IN
    C     EQUATION (1) BY SECOND ORDER CENTRAL FINITE DIFFERENCES AND
    C     COLLECT COEFFICIENTS OF V(I,J,K) TO GET THE FINITE DIFFERENCE
    C     EQUATION
    C
    C        (V(I-1,J,K) - 2V(I,J,K) + V(I+1,J,K))/DX**2
    C
    C      + (V(I,J-1,K) - 2V(I,J,K) + V(I,J+1,K))/DY**2
    C
    C      + A(K)V(I,J,K-1) + B(K)V(I,J,K) + C(K)V(I,J,K+1) = F(I,J,K)   (4)
    C
    C     WHERE FOR K=2,3,...,9
    C
    C     A(K) = (1+Z(K))**2/DZ**2 + (1+Z(K))/DZ
    C
    C     B(K) = -2(1+Z(K))**2/DZ**2
    C
    C     C(K) = (1+Z(K))**2/DZ**2 - (1+Z(K))/DZ
    C
    C     F(I,J,K) = 2SIN(X(I))*SIN(Y(J))*(1+Z(K))**4  FOR I,J=1,2,...,30.
    C
    C         TO OBTAIN EQUATIONS FOR K=1, WE REPLACE THE DERIVATIVE IN
    C     EQUATION (2) BY A SECOND ORDER CENTRAL FINITE DIFFERENCE APPROX-
    C     IMATION, USE THIS EQUATION TO ELIMINATE THE VIRTUAL UNKNOWN
    C     V(I,J,0) IN EQUATION (4) AND ARRIVE AT THE EQUATION
    C
    C              (V(I-1,J,1) -2V(I,J,1) + V(I+1,J,1))/DX**2
    C
    C            + (V(I,J-1,1) -2V(I,J,1) + V(I,J+1,1))/DY**2
    C
    C            + B(1)V(I,J,1) + C(1)V(I,J,2) = F(I,J,1)
    C
    C     WHERE
    C            B(1) = -C(1) = -2(1+Z(1))**2/DZ**2 = -2/DZ**2
    C
    C            F(I,J,1) = (10 + 8/DZ)SIN(X(I))*SIN(Y(J))
    C
    C            FOR I,J=1,2,...,30.  FOR COMPLETENESS WE SET A(1) = 0.
    C
    C         TO OBTAIN EQUATIONS FOR K=10, WE INCORPORATE EQUATION (3) INTO
    C     EQUATION (4) BY SETTING
    C
    C            V(I,J,11) = U(X(I),Y(J),1) = 16SIN(X(I))*SIN(Y(J))
    C
    C     AND ARRIVE AT THE EQUATION
    C
    C              (V(I-1,J,10) - 2V(I,J,10) + V(I+1,J,10))/DX**2
    C
    C            + (V(I,J-1,10) - 2V(I,J,10) + V(I,J+1,10))/DY**2
    C
    C            + A(10)V(I,J,9) + B(10)V(I,J,10) = F(I,J,10)
    C
    C     WHERE
    C
    C            A(10) = (1+Z(10))**2/DZ**2 + (1+Z(10))/DZ
    C
    C            B(10) = -2(1+Z(10))**2/DZ**2
    C
    C            F(I,J,10) = 2SIN(X(I))*SIN(Y(J))*((1+Z(10))**4
    C                        -8*((1+Z(10))**2/DZ**2 - (1+Z(10))/DZ))
    C
    C                        FOR I,J=1,2,...,30.
    C
    C     FOR COMPLETENESS, WE SET C(10) = 0.  HENCE, IN THE PROGRAM,
    C     NPEROD = 1.
    C         THE PERIODICITY CONDITIONS ON U GIVE THE CONDITIONS
    C
    C             V(0,J,K) = V(30,J,K) AND V(31,J,K) = V(1,J,K)
    C                        FOR J=1,2,...,30 AND K=1,2,...,10,
    C             AND
    C             V(I,0,K) = V(I,30,K) AND V(I,31,K) = V(I,1,K)
    C                        FOR I=1,2,...,30 AND K=1,2,...,10.
    C
    C     HENCE, IN THE PROGRAM LPEROD = MPEROD = 0.
    C
          DIMENSION       F(32,33,10),A(10)      ,B(10)      ,C(10)      ,
         1                W(350)     ,X(30)      ,Y(30)      ,Z(10)
    C
    C     FROM THE DIMENSION STATEMENT WE GET THAT LDIMF = 32, MDIMF = 33,
    C     AND NOTE THAT W HAS BEEN DIMENSIONED ACCORDING TO ITS DESCRIPTION.
    C
          LDIMF = 32
          MDIMF = 33
          PI = PIMACH(DUM)
          LPEROD = 0
          L = 30
          DX = 2.*PI/FLOAT(L)
          C1 = 1./DX**2
          MPEROD = 0
          M = 30
          DY = 2.*PI/FLOAT(M)
          C2 = 1./DY**2
          NPEROD = 1
          N = 10
          DZ = 1./FLOAT(N)
          DZSQ = 1./DZ**2
    C
    C     GENERATE GRID POINTS FOR LATER USE.
    C
          DO 101 I=1,L
             X(I) = -PI+FLOAT(I-1)*DX
      101 CONTINUE
          DO 102 J=1,M
             Y(J) = -PI+FLOAT(J-1)*DY
      102 CONTINUE
    C
    C     GENERATE COEFFICIENTS
    C
          A(1) = 0.
          B(1) = -2.*DZSQ
          C(1) = -B(1)
          Z(1) = 0.
          DO 103 K=2,N
             Z(K) = FLOAT(K-1)*DZ
             T = 1.+Z(K)
             A(K) = T**2*DZSQ+T/DZ
             B(K) = -2.*T**2*DZSQ
             C(K) = T**2*DZSQ-T/DZ
      103 CONTINUE
    C
    C     GENERATE RIGHT SIDE OF EQUATION
    C
          DO 106 I=1,L
             DO 105 J=1,M
                DO 104 K=2,N
                   F(I,J,K) = 2.*SIN(X(I))*SIN(Y(J))*(1.+Z(K))**4
      104       CONTINUE
      105    CONTINUE
      106 CONTINUE
          DO 108 I=1,L
             DO 107 J=1,L
                F(I,J,1) = (10.+8./DZ)*SIN(X(I))*SIN(Y(J))
                F(I,J,N) = F(I,J,N)-C(N)*16.*SIN(X(I))*SIN(Y(J))
      107    CONTINUE
      108 CONTINUE
          C(N) = 0.
    C
    C     CALL POIS3D TO SOLVE EQUATIONS.
    C
          CALL POIS3D (LPEROD,L,C1,MPEROD,M,C2,NPEROD,N,A,B,C,LDIMF,MDIMF,
         1             F,IERROR,W)
    C
    C     COMPUTE DISCRETIZATION ERROR.  THE EXACT SOLUTION IS
    C
    C              U(X,Y,Z) = SIN(X)*SIN(Y)*(1+Z)**4
    C
          ERR = 0.
          DO 111 I=1,L
             DO 110 J=1,M
                DO 109 K=1,N
                   T = ABS(F(I,J,K)-SIN(X(I))*SIN(Y(J))*(1.+Z(K))**4)
                   IF (T .GT. ERR) ERR = T
      109       CONTINUE
      110    CONTINUE
      111 CONTINUE
          PRINT 1001 , IERROR,ERR
          STOP
    C
     1001 FORMAT (1H1,20X,25HSUBROUTINE POIS3D EXAMPLE///
         1        10X,46HTHE OUTPUT FROM THE NCAR CONTROL DATA 7600 WAS//
         2        32X,10HIERROR = 0/
         3        18X,34HDISCRETIZATION ERROR = 2.93277E-02//
         4        10X,32HTHE OUTPUT FROM YOUR COMPUTER IS//
         5        32X,8HIERROR =,I2/18X,22HDISCRETIZATION ERROR =,E12.5)
    C
          END

TPOISTG

    C
    C file tpoistg.g
    C
    C     * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
    C     *                                                               *
    C     *                  copyright (c) 1999 by UCAR                   *
    C     *                                                               *
    C     *       UNIVERSITY CORPORATION for ATMOSPHERIC RESEARCH         *
    C     *                                                               *
    C     *                      all rights reserved                      *
    C     *                                                               *
    C     *                      FISHPACK version 4.1                     *
    C     *                                                               *
    C     *     A PACKAGE OF FORTRAN SUBPROGRAMS FOR THE SOLUTION OF      *
    C     *                                                               *
    C     *      SEPARABLE ELLIPTIC PARTIAL DIFFERENTIAL EQUATIONS        *
    C     *                                                               *
    C     *                             BY                                *
    C     *                                                               *
    C     *        JOHN ADAMS, PAUL SWARZTRAUBER AND ROLAND SWEET         *
    C     *                                                               *
    C     *                             OF                                *
    C     *                                                               *
    C     *         THE NATIONAL CENTER FOR ATMOSPHERIC RESEARCH          *
    C     *                                                               *
    C     *                BOULDER, COLORADO  (80307)  U.S.A.             *
    C     *                                                               *
    C     *                   WHICH IS SPONSORED BY                       *
    C     *                                                               *
    C     *              THE NATIONAL SCIENCE FOUNDATION                  *
    C     *                                                               *
    C     * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
    C
    C     PROGRAM TO ILLUSTRATE THE USE OF SUBROUTINE POISTG TO
    C     SOLVE THE EQUATION
    C
    C     (1/COS(X))(D/DX)(COS(X)(DU/DX)) + (D/DY)(DU/DY) =
    C
    C           2*Y**2*(6-Y**2)*SIN(X)
    C
    C     ON THE RECTANGLE -PI/2 .LT. X .LT. PI/2 AND
    C     0 .LT. Y .LT. 1 WITH THE BOUNDARY CONDITIONS
    C
    C     (DU/DX) (-PI/2,Y) = (DU/DX)(PI/2,Y) = 0 , 0 .LE. Y .LE. 1  (2)
    C
    C     U(X,0) = 0                                           (3)
    C                                 -PI/2 .LE. X .LE. PI/2
    C     (DU/DY)(X,1) = 4SIN(X)                               (4)
    C
    C     USING FINITE DIFFERENCES ON A STAGGERED GRID WITH
    C     DELTAX (= DX) = PI/40 AND DELTAY (= DY) = 1/20 .
    C        TO SET UP THE FINITE DIFFERENCE EQUATIONS WE DEFINE
    C     THE GRID POINTS
    C
    C     X(I) = -PI/2 + (I-0.5)DX            I=1,2,...,40
    C
    C     Y(J) = (J-O.5)DY                    J=1,2,...,20
    C
    C     AND LET V(I,J) BE AN APPROXIMATION TO U(X(I),Y(J)).
    C     NUMBERING THE GRID POINTS IN THIS FASHION GIVES THE SET
    C     OF UNKNOWNS AS V(I,J) FOR I=1,2,...,40 AND J=1,2,...,20.
    C     HENCE, IN THE PROGRAM M = 40 AND N = 20.  AT THE INTERIOR
    C     GRID POINT (X(I),Y(J)), WE REPLACE ALL DERIVATIVES IN
    C     EQUATION (1) BY SECOND ORDER CENTRAL FINITE DIFFERENCES,
    C     MULTIPLY BY DY**2, AND COLLECT COEFFICIENTS OF V(I,J) TO
    C     GET THE FINITE DIFFERENCE EQUATION
    C
    C     A(I)V(I-1,J) + B(I)V(I,J) + C(I)V(I+1,J)
    C
    C     + V(I,J-1) - 2V(I,J) + V(I,J+1) = F(I,J)            (5)
    C
    C     WHERE S = (DY/DX)**2, AND FOR I=2,3,...,39
    C
    C     A(I) = S*COS(X(I)-DX/2)
    C
    C     B(I) = -S*(COS(X(I)-DX/2)+COS(X(I)+DX/2))
    C
    C     C(I) = S*COS(X(I)+DX/2)
    C
    C     F(I,J) = 2DY**2*Y(J)**2*(6-Y(J)**2)*SIN(X(I)) , J=1,2,...,19.
    C
    C        TO OBTAIN EQUATIONS FOR I = 1, WE REPLACE EQUATION (2)
    C     BY THE SECOND ORDER APPROXIMATION
    C
    C     (V(1,J)-V(0,J))/DX = 0
    C
    C     AND USE THIS EQUATION TO ELIMINATE V(0,J) IN EQUATION (5)
    C     TO ARRIVE AT THE EQUATION
    C
    C     B(1)V(1,J) + C(1)V(2,J) + V(1,J-1) - 2V(1,J) + V(1,J+1)
    C
    C                       = F(1,J)
    C
    C     WHERE
    C
    C     B(1) = -S*(COS(X(1)-DX/2)+COS(X(1)+DX/2))
    C
    C     C(1) = -B(1)
    C
    C     FOR COMPLETENESS, WE SET A(1) = 0.
    C        TO OBTAIN EQUATIONS FOR I = 40, WE REPLACE THE DERIVATIVE
    C     IN EQUATION (2) AT X=PI/2 IN A SIMILAR FASHION, USE THIS
    C     EQUATION TO ELIMINATE THE VIRTUAL UNKNOWN V(41,J) IN EQUATION
    C     (5) AND ARRIVE AT THE EQUATION
    C
    C     A(40)V(39,J) + B(40)V(40,J)
    C
    C     + V(40,J-1) - 2V(40,J) + V(40,J+1) = F(40,J)
    C
    C     WHERE
    C
    C     A(40) = -B(40) = -S*(COS(X(40)-DX/2)+COS(X(40)+DX/2))
    C
    C     FOR COMPLETENESS, WE SET C(40) = 0.  HENCE, IN THE
    C     PROGRAM MPEROD = 1.
    C        FOR J = 1, WE REPLACE EQUATION (3) BY THE SECOND ORDER
    C     APPROXIMATION
    C
    C                (V(I,0) + V(I,1))/2 = 0
    C
    C     TO ARRIVE AT THE CONDITION
    C
    C                V(I,0) = -V(I,1) .
    C
    C     FOR J = 20, WE REPLACE EQUATION (4) BY THE SECOND ORDER
    C     APPROXIMATION
    C
    C                (V(I,21) - V(I,20))/DY = 4*SIN(X)
    C
    C     AND COMBINE THIS EQUATION WITH EQUATION (5) TO ARRIVE AT
    C     THE EQUATION
    C
    C     A(I)V(I-1,20) + B(I)V(I,20) + C(I)V(I+1,20)
    C
    C     + V(I,19) - 2V(I,20) + V(I,21) = F(I,20)
    C
    C     WHERE
    C
    C     V(I,21) = V(I,20)  AND
    C
    C     F(I,20) = 2*DY**2*Y(J)**2*(6-Y(J)**2)*SIN(X(I)) - 4*DY*SIN(X(I))
    C
    C     HENCE, IN THE PROGRAM NPEROD = 2 .
    C        THE EXACT SOLUTION TO THIS PROBLEM IS
    C
    C        U(X,Y) = Y**4*COS(X) .
    C
          DIMENSION       F(42,20)   ,A(40)      ,B(40)      ,C(40)      ,
         1                W(600)     ,X(40)      ,Y(20)
    C
    C     FROM DIMENSION STATEMENT WE GET VALUE OF IDIMF = 42.  ALSO
    C     NOTE THAT W HAS BEEN DIMENSIONED
    C     9M + 4N + M(INT(LOG2(N))) = 360 + 80 + 160 = 600 .
    C
          IDIMF = 42
          MPEROD = 1
          M = 40
          PI = PIMACH(DUM)
          DX = PI/FLOAT(M)
          NPEROD = 2
          N = 20
          DY = 1./FLOAT(N)
    C
    C     GENERATE AND STORE GRID POINTS FOR COMPUTATION.
    C
          DO 101 I=1,M
             X(I) = -PI/2.+(FLOAT(I)-0.5)*DX
      101 CONTINUE
          DO 102 J=1,N
             Y(J) = (FLOAT(J)-0.5)*DY
      102 CONTINUE
    C
    C     GENERATE COEFFICIENTS .
    C
          S = (DY/DX)**2
          A(1) = 0.
          B(1) = -S*COS(-PI/2.+DX)/COS(X(1))
          C(1) = -B(1)
          DO 103 I=2,M
             A(I) = S*COS(X(I)-DX/2.)/COS(X(I))
             C(I) = S*COS(X(I)+DX/2.)/COS(X(I))
             B(I) = -(A(I)+C(I))
      103 CONTINUE
          A(40) = -B(40)
          C(40) = 0.
    C
    C     GENERATE RIGHT SIDE OF EQUATION.
    C
          DO 105 I=1,M
             DO 104 J=1,N
                F(I,J) = 2.*DY**2*Y(J)**2*(6.-Y(J)**2)*SIN(X(I))
      104    CONTINUE
      105 CONTINUE
          DO 106 I=1,M
             F(I,N) = F(I,N)-4.*DY*SIN(X(I))
      106 CONTINUE
          CALL POISTG (NPEROD,N,MPEROD,M,A,B,C,IDIMF,F,IERROR,W)
    C
    C     COMPUTE DISCRETIZATION ERROR.  THE EXACT SOLUTION IS
    C
    C     U(X,Y) = Y**4*SIN(X)
    C
          ERR = 0.
          DO 108 I=1,M
             DO 107 J=1,N
                T = ABS(F(I,J)-Y(J)**4*SIN(X(I)))
                IF (T .GT. ERR) ERR = T
      107    CONTINUE
      108 CONTINUE
          PRINT 1001 , IERROR,ERR,W(1)
          STOP
    C
     1001 FORMAT (1H1,20X,25HSUBROUTINE POISTG EXAMPLE///
         1        10X,46HTHE OUTPUT FROM THE NCAR CONTROL DATA 7600 WAS//
         2        32X,10HIERROR = 0/
         3        18X,34HDISCRETIZATION ERROR = 5.64171E-04/
         4        12X,32HREQUIRED LENGTH OF W ARRAY = 560//
         5        10X,32HTHE OUTPUT FROM YOUR COMPUTER IS//
         6        32X,8HIERROR =,I2/18X,22HDISCRETIZATION ERROR =,E12.5/
         7        12X,28HREQUIRED LENGTH OF W ARRAY =,F4.0)
    C
          END

TSEPELI

    C
    C file tsepeli.f
    C
    C     * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
    C     *                                                               *
    C     *                  copyright (c) 1999 by UCAR                   *
    C     *                                                               *
    C     *       UNIVERSITY CORPORATION for ATMOSPHERIC RESEARCH         *
    C     *                                                               *
    C     *                      all rights reserved                      *
    C     *                                                               *
    C     *                      FISHPACK version 4.1                     *
    C     *                                                               *
    C     *     A PACKAGE OF FORTRAN SUBPROGRAMS FOR THE SOLUTION OF      *
    C     *                                                               *
    C     *      SEPARABLE ELLIPTIC PARTIAL DIFFERENTIAL EQUATIONS        *
    C     *                                                               *
    C     *                             BY                                *
    C     *                                                               *
    C     *        JOHN ADAMS, PAUL SWARZTRAUBER AND ROLAND SWEET         *
    C     *                                                               *
    C     *                             OF                                *
    C     *                                                               *
    C     *         THE NATIONAL CENTER FOR ATMOSPHERIC RESEARCH          *
    C     *                                                               *
    C     *                BOULDER, COLORADO  (80307)  U.S.A.             *
    C     *                                                               *
    C     *                   WHICH IS SPONSORED BY                       *
    C     *                                                               *
    C     *              THE NATIONAL SCIENCE FOUNDATION                  *
    C     *                                                               *
    C     * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
    C
    C
    C     AN EXAMPLE SHOWING THE USE OF SEPELI TO SOLVE THE SEPARABLE
    C     ELLIPTIC PARTIAL DIFFERENTIAL EQUATION . . .
    C     (X+1)**2*UXX+2*(X+1)*UX+EXP(Y)*UYY-(X+Y)*U = G(X,Y) ON
    C     0.LE.X.LE.1, 0.LE.Y.LE.1  WITH SPECIFIED BOUNDARY CONDITIONS
    C     AT Y=0,1 AND MIXED BOUNDARY CONDITIONS OF THE FORM
    C     UX(0,Y)+U(0,Y), UX(1,Y)+U(1,Y) AT X=0,1.
    C     THE APPROXIMATION IS GENERATED ON A UNIFORM 33 BY 33 GRID.
    C     THE EXACT SOLUTION U(X,Y)=(X*Y)**3+1 IS USED TO SET THE
    C     RIGHT HAND SIDE, BOUNDARY CONDITIONS, AND COMPUTE  SECOND AND
    C     FOURTH ORDER DISCRETIZATION ERROR
    C     THE EXACT WORK SPACE LENGTH REQUIRED IS 1118 WORDS.
    C     THIS WAS DETERMINED BY A PREVIOUS CALL TO SEPELI  AND PRINT
    C     OUT OF W(1).
    C
          DIMENSION       USOL(33,33),GRHS(33,33),BDA(33)    ,BDB(33)    ,
         1                W(1118)
    C
    C     DECLARE COEFFICIENT SUBROUTINES EXTERNAL
    C
          EXTERNAL        COFX       ,COFY
    C
    C     DEFINE ARITHMETIC FUNCTIONS GIVING EXACT SOLUTION
    C
          UE(S,T) = (S*T)**3+1.0
          UXE(S,T) = 3.0*S**2*T**3
          UXXE(S,T) = 6.0*S*T**3
          UYE(S,T) = 3.0*S**3*T**2
          UYYE(S,T) = 6.0*S**3*T
    C
    C     SET LIMITS ON REGION
    C
          A = 0.0
          B = 1.0
          C = 0.0
          D = 1.0
    C
    C     SET GRID SIZE
    C
          M = 32
          N = 32
          DLX = (B-A)/FLOAT(M)
          DLY = (D-C)/FLOAT(N)
          NX = M+1
          NY = N+1
          DO 102 I=1,NX
             X = A+FLOAT(I-1)*DLX
    C
    C     SET SPECIFIED BOUNDARY CONDITIONS AT Y=C,D
    C
             USOL(I,1) = UE(X,C)
             USOL(I,NY) = UE(X,D)
             CALL COFX (X,AF,BF,CF)
             DO 101 J=1,NY
                Y = C+FLOAT(J-1)*DLY
                CALL COFY (Y,DF,EF,FF)
    C
    C     SET RIGHT HAND SIDE
    C
                GRHS(I,J) = AF*UXXE(X,Y)+BF*UXE(X,Y)+CF*UE(X,Y)+
         1                  DF*UYYE(X,Y)+EF*UYE(X,Y)+FF*UE(X,Y)
      101    CONTINUE
      102 CONTINUE
    C
    C     SET MIXED BOUNDARY CONDITIONS AT X=A,B
    C
          ALPHA = 1.0
          BETA = 1.0
          DO 103 J=1,NY
             Y = C+FLOAT(J-1)*DLY
             BDA(J) = UXE(A,Y)+ALPHA*UE(A,Y)
             BDB(J) = UXE(B,Y)+BETA*UE(B,Y)
      103 CONTINUE
    C
    C     SET BOUNDARY SWITHCES
    C
          MBDCND = 3
          NBDCND = 1
    C
    C     SET FIRST DIMENSION OF USOL,GRHS AND WORK SPACE LENGTH
    C
          IDMN = 33
          W(1) = 1118.
    C
    C     SET WORK SPACE LENGTH IN FIRST WORD
    C     SET INITIAL CALL PARAMETER TO ZERO
    C
          INTL = 0
    C
    C     OBTAIN SECOND ORDER APPROXIMATION
    C
          IORDER = 2
          CALL SEPELI (INTL,IORDER,A,B,M,MBDCND,BDA,ALPHA,BDB,BETA,C,D,N,
         1             NBDCND,DUM,DUM,DUM,DUM,COFX,COFY,GRHS,USOL,IDMN,W,
         2             PERTRB,IERROR)
          ERR = 0.0
          DO 105 I=1,NX
             X = A+FLOAT(I-1)*DLX
             DO 104 J=1,NY
                Y = C+FLOAT(J-1)*DLY
                ERR = AMAX1(ERR,ABS((USOL(I,J)-UE(X,Y))/UE(X,Y)))
      104    CONTINUE
      105 CONTINUE
          ERR2 = ERR
    C
    C     OBTAIN FOURTH ORDER APPROXIMATION
    C
          IORDER = 4
    C
    C     NON-INITIAL CALL
    C
          INTL = 1
          CALL SEPELI (INTL,IORDER,A,B,M,MBDCND,BDA,ALPHA,BDB,BETA,C,D,N,
         1             NBDCND,DUM,DUM,DUM,DUM,COFX,COFY,GRHS,USOL,IDMN,W,
         2             PERTRB,IERROR)
    C
    C     COMPUTE DISCRETIZATION ERROR
    C
          ERR = 0.0
          DO 107 J=1,NY
             Y = C+FLOAT(J-1)*DLY
             DO 106 I=1,NX
                X = A+FLOAT(I-1)*DLX
                ERR = AMAX1(ERR,ABS((USOL(I,J)-UE(X,Y))/UE(X,Y)))
      106    CONTINUE
      107 CONTINUE
          ERR4 = ERR
          IW = INT(W(1))
          PRINT 1001 , IERROR,ERR2,ERR4,IW
    C
    C
     1001 FORMAT (1H1,20X,25HSUBROUTINE SEPELI EXAMPLE///
         1        20X,46HTHE OUTPUT FROM THE NCAR CONTROL DATA 7600 WAS//
         2        20X,10HIERROR = 0/
         3        20X,47HSECOND ORDER DISCRETIZATION ERROR = 9.78910E-05/
         4        20X,47HFOURTH ORDER DISCRETIZATION ERROR = 1.47351E-06/
         5        20X,33HREQUIRED LENGTH OF W ARRAY = 1118//
         6        20X,32HTHE OUTPUT FROM YOUR COMPUTER IS//
         7        20X,8HIERROR =,I2/
         8        20X,36HSECOND ORDER DISCRETIZATION ERROR = , E12.5/
         9        20X,36HFOURTH ORDER DISCRETIZATION ERROR = , E12.5/
         +        20X,29HREQUIRED LENGTH OF W ARRAY = , I4)
    C
          END
          SUBROUTINE COFX (X,AF,BF,CF)
    C
    C     SET COEFFICIENTS IN THE X-DIRECTION.
    C
          AF = (X+1.)**2
          BF = 2.0*(X+1.)
          CF = -X
          RETURN
          END
          SUBROUTINE COFY (Y,DF,EF,FF)
    C
    C     SET COEFFICIENTS IN Y DIRECTION
    C
          DF = EXP(Y)
          EF = 0.0
          FF = -Y
          RETURN
          END

TSEPX4

    C
    C file tsepx4.f
    C
    C     * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
    C     *                                                               *
    C     *                  copyright (c) 1999 by UCAR                   *
    C     *                                                               *
    C     *       UNIVERSITY CORPORATION for ATMOSPHERIC RESEARCH         *
    C     *                                                               *
    C     *                      all rights reserved                      *
    C     *                                                               *
    C     *                      FISHPACK version 4.1                     *
    C     *                                                               *
    C     *     A PACKAGE OF FORTRAN SUBPROGRAMS FOR THE SOLUTION OF      *
    C     *                                                               *
    C     *      SEPARABLE ELLIPTIC PARTIAL DIFFERENTIAL EQUATIONS        *
    C     *                                                               *
    C     *                             BY                                *
    C     *                                                               *
    C     *        JOHN ADAMS, PAUL SWARZTRAUBER AND ROLAND SWEET         *
    C     *                                                               *
    C     *                             OF                                *
    C     *                                                               *
    C     *         THE NATIONAL CENTER FOR ATMOSPHERIC RESEARCH          *
    C     *                                                               *
    C     *                BOULDER, COLORADO  (80307)  U.S.A.             *
    C     *                                                               *
    C     *                   WHICH IS SPONSORED BY                       *
    C     *                                                               *
    C     *              THE NATIONAL SCIENCE FOUNDATION                  *
    C     *                                                               *
    C     * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
    C
    C
    C
    C     EXAMPLE SHOWING THE USE OF SEPX4 TO SOLVE THE ELLIPTIC PDE
    C     (X+1)**2*UXX+2*(X+1)*UX+UYY-X*U=G(X,Y) ON THE REGION
    C     0.LE.X.LE.1, 0.LE.Y.LE.1  WITH SPECIFIED BOUNDARY CONDITIONS
    C     AT Y=0,1 AND MIXED BOUNDARY CONDITIONS OF THE FORM
    C     UX(0,Y)+U(0,Y), UX(1,Y)+U(1,Y) AT X=0,1.
    C     THE APPROXIMATION IS GENERATED ON A UNIFORM 33 BY 33 GRID.
    C     THE EXACT SOLUTION U(X,Y)=(X*Y)**3+1 IS USED TO SET THE
    C     RIGHT HAND SIDE, BOUNDARY CONDITIONS, AND COMPUTE  SECOND AND
    C     FOURTH ORDER DISCRETIZATION ERROR
    C     THE EXACT WORK SPACE LENGTH REQUIRED IS 1005 WORDS.  THIS
    C     WAS DETERMINED BY A PREVIOUS CALL TO SEPX4 AND PRINT OUT OF
    C     W(1).
    C
          DIMENSION       USOL(33,33),GRHS(33,33),BDA(33)    ,BDB(33)    ,
         1                W(1024)
          EXTERNAL COFX4
    C
    C     DEFINE ARITHMETIC FUNCTIONS GIVING EXACT SOLUTION
    C
          UE(S,T)=(S*T)**3+1.0
          UXE(S,T)=3.0*S**2*T**3
          UXXE(S,T)=6.0*S*T**3
          UYE(S,T)=3.0*S**3*T**2
          UYYE(S,T)=6.0*S**3*T
    C
    C     SET LIMITS ON REGION
    C
          A = 0.0
          B = 1.0
          C = 0.0
          D = 1.0
    C
    C     SET GRID SIZE
    C
          M = 32
          N = 32
          DLX = (B-A)/FLOAT(M)
          DLY = (D-C)/FLOAT(N)
          NX = M+1
          NY = N+1
              DO 102 I=1,NX
              X = A+FLOAT(I-1)*DLX
    C
    C     SET SPECIFIED BOUNDARY CONDITIONS AT Y=C,D
    C
              USOL(I,1) = UE(X,C)
              USOL(I,NY) = UE(X,D)
              CALL COFX4 (X,AF,BF,CF)
                  DO 101 J=1,NY
                  Y = C+FLOAT(J-1)*DLY
    C
    C     SET RIGHT HAND SIDE
    C
                  GRHS(I,J) = AF*UXXE(X,Y)+BF*UXE(X,Y)+CF*UE(X,Y)+UYYE(X,Y)
      101         CONTINUE
      102     CONTINUE
    C
    C     SET MIXED BOUNDARY CONDITIONS AT X=A,B
    C
          ALPHA = 1.0
          BETA = 1.0
              DO 103 J=1,NY
              Y = C+FLOAT(J-1)*DLY
              BDA(J) = UXE(A,Y)+ALPHA*UE(A,Y)
              BDB(J) = UXE(B,Y)+BETA*UE(B,Y)
      103     CONTINUE
    C
    C     SET BOUNDARY SWITHCES
    C
          MBDCND = 3
          NBDCND = 1
    C
    C     SET FIRST DIMENSION OF USOL,GRHS AND WORK SPACE LENGTH
    C
          IDMN = 33
          W(1) = 1024.
    C
    C     OBTAIN SECOND ORDER APPROXIMATION
    C
          IORDER = 2
          CALL SEPX4 (IORDER,A,B,M,MBDCND,BDA,ALPHA,BDB,BETA,C,D,N,NBDCND,
         1            DUM,DUM,COFX4,GRHS,USOL,IDMN,W,PERTRB,IERROR)
    C
    C     COMPUTE SECOND ORDER DISCRETIZATION ERROR (RELATIVE)
    C     ALSO RESET SPECIFIED BOUNDARIES AND RIGHT HAND SIDE.
    C
          ERR = 0.0
              DO 105 I=1,NX
              X = A+FLOAT(I-1)*DLX
              USOL(I,1) = UE(X,C)
              USOL(I,NY) = UE(X,D)
              CALL COFX4 (X,AF,BF,CF)
                  DO 104 J=1,NY
                  Y = C+FLOAT(J-1)*DLY
                  ERR = AMAX1(ERR,ABS((USOL(I,J)-UE(X,Y))/UE(X,Y)))
                  GRHS(I,J) = AF*UXXE(X,Y)+BF*UXE(X,Y)+CF*UE(X,Y)+UYYE(X,Y)
      104         CONTINUE
      105     CONTINUE
          ERR2=ERR
    C
    C     OBTAIN FOURTH ORDER APPROXIMATION
    C
          IORDER = 4
          CALL SEPX4 (IORDER,A,B,M,MBDCND,BDA,ALPHA,BDB,BETA,C,D,N,NBDCND,
         1            DUM,DUM,COFX4,GRHS,USOL,IDMN,W,PERTRB,IERROR)
    C
    C     COMPUTE FOURTH ORDER DISCRETIZATION ERROR (RELATIVE)
    C
          ERR = 0.0
              DO 107 J=1,NY
              Y = C+FLOAT(J-1)*DLY
                  DO 106 I=1,NX
                  X = A+FLOAT(I-1)*DLX
                  ERR = AMAX1(ERR,ABS((USOL(I,J)-UE(X,Y))/UE(X,Y)))
      106         CONTINUE
      107     CONTINUE
          ERR4=ERR
          IW = INT(W(1)+0.5)
          PRINT 1001,IERROR,ERR2,ERR4,IW
     1001 FORMAT(1H1,20X,25HSUBROUTINE SEPX4  EXAMPLE ///
         120X,46HTHE OUTPUT FROM THE NCAR CONTROL DATA 7600 WAS //
         220X,10HIERROR = 0 /
         320X,48HSECOND ORDER DISCRETIZATION ERROR =  1.5985E-04  /
         420X,48HFOURTH ORDER DISCRETIZATION ERROR =  1.85749E-06  /
         520X,33HREQUIRED LENGTH OF W ARRAY = 1024 //
         620X, 32HTHE OUTPUT FROM YOUR COMPUTER IS //
         720X, 8HIERROR = I2 /
         820X,36HSECOND ORDER DISCRETIZATION ERROR = E12.5 /
         920X,36HFOURTH ORDER DISCRETIZATION ERROR = E12.5 /
         920X,29HREQUIRED LENGTH OF W ARRAY = I5)
    C
          END
          SUBROUTINE COFX4(X,AF,BF,CF)
    C
    C     SET COEFFICIENTS IN THE X-DIRECTION.
    C
          AF = (X+1.)**2
          BF = 2.0*(X+1.)
          CF = -X
          RETURN
          END