      SUBROUTINE PWSCRT (INTL,A,B,M,MBDCND,BDA,BDB,C,D,N,NBDCND,BDC,    POI00001
     1                   BDD,ELMBDA,F,IDIMF,PERTRB,IERROR,W)
C
C
C***********************************************************************
C
C          VERSION  2  OCTOBER 1976  INCLUDING ERRATA  OCTOBER 1976
C
C         DOCUMENTATION FOR THIS PROGRAM IS GIVEN IN
C
C        EFFICIENT FORTRAN SUBPROGRAMS FOR THE SOLUTION OF
C            ELLIPTIC PARTIAL DIFFERENTIAL EQUATIONS
C
C                              BY
C
C          PAUL SWARZTRAUBER   AND  ROLAND SWEET
C
C             TECHNICAL NOTE TN/IA-109   JULY 1975
C
C       NATIONAL CENTER FOR ATMOSPHERIC RESEARCH  BOULDER,COLORADO 80307
C
C        WHICH IS SPONSORED BY THE NATIONAL SCIENCE FOUNDATION
C
C***********************************************************************
C
C
C
C          SUBROUTINE PWSCRT SOLVES THE STANDARD FIVE-POINT FINITE
C     DIFFERENCE APPROXIMATION TO THE HELMHOLTZ EQUATION IN CARTESIAN
C     COORDINATES:
C
C          (D/DX)(D/DX)U + (D/DY)(D/DY)U + LAMBDA*U = F(X,Y).
C
C     THE ARGUMENTS ARE DEFINED AS:
C
C     * * * * * * * * * *     ON INPUT     * * * * * * * * * *
C
C     INTL
C       = 0  ON INITIAL ENTRY TO PWSCRT OR IF N OR NBDCND ARE CHANGED
C            FROM PREVIOUS CALL.
C       = 1  IF N AND NBDCND ARE UNCHANGED FROM PREVIOUS CALL TO PWSCRT.
C
C       NOTE:  A CALL WITH INTL = 1 IS ABOUT 1 PER CENT FASTER THAN A
C              CALL WITH INTL = 0  .
C
C     A,B
C       THE RANGE OF X, I.E., A .LE. X .LE. B.  A MUST BE LESS THAN B.
C
C     M
C       THE NUMBER OF PANELS INTO WHICH THE INTERVAL (A,B) IS
C       SUBDIVIDED.  HENCE, THERE WILL BE M+1 GRID POINTS IN THE
C       X-DIRECTION GIVEN BY X(I) = A+(I-1)DX FOR I = 1,2,...,M+1,
C       WHERE DX = (B-A)/M IS THE PANEL WIDTH.
C
C     MBDCND
C       INDICATES THE TYPE OF BOUNDARY CONDITIONS AT X = A AND X = B.
C
C       = 0  IF THE SOLUTION IS PERIODIC IN X, I.E., U(1,J) = U(M+1,J).
C       = 1  IF THE SOLUTION IS SPECIFIED AT X = A AND X = B.
C       = 2  IF THE SOLUTION IS SPECIFIED AT X = A AND THE DERIVATIVE OF
C            THE SOLUTION WITH RESPECT TO X IS SPECIFIED AT X = B.
C       = 3  IF THE DERIVATIVE OF THE SOLUTION WITH RESPECT TO X IS
C            SPECIFIED AT X = A AND X = B.
C       = 4  IF THE DERIVATIVE OF THE SOLUTION WITH RESPECT TO X IS
C            SPECIFIED AT X = A AND THE SOLUTION IS SPECIFIED AT X = B.
C
C     BDA
C       A ONE-DIMENSIONAL ARRAY OF LENGTH N+1 THAT SPECIFIES THE VALUES
C       OF THE DERIVATIVE OF THE SOLUTION WITH RESPECT TO X AT X = A.
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 A DUMMY VARIABLE.
C
C     BDB
C       A ONE-DIMENSIONAL ARRAY OF LENGTH N+1 THAT SPECIFIES THE VALUES
C       OF THE DERIVATIVE OF THE SOLUTION WITH RESPECT TO X AT X = B.
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 DUMMY VARIABLE.
C
C     C,D
C       THE RANGE OF Y, I.E., C .LE. Y .LE. D.  C MUST BE LESS THAN D.
C
C     N
C       THE NUMBER OF PANELS INTO WHICH THE INTERVAL (C,D) IS
C       SUBDIVIDED.  HENCE, THERE WILL BE N+1 GRID POINTS IN THE
C       Y-DIRECTION GIVEN BY Y(J) = C+(J-1)DY FOR J = 1,2,...,N+1, WHERE
C       DY = (D-C)/N IS THE PANEL WIDTH.  N MUST BE OF THE FORM
C       (2**P)(3**Q)(5**R) WHERE P, Q, AND R ARE ANY NON-NEGATIVE
C       INTEGERS.  N MUST BE GREATER THAN 2.
C
C     NBDCND
C       INDICATES THE TYPE OF BOUNDARY CONDITIONS AT Y = C AND Y = D.
C
C       = 0  IF THE SOLUTION IS PERIODIC IN Y, I.E., U(I,1) = U(I,N+1).
C       = 1  IF THE SOLUTION IS SPECIFIED AT Y = C AND Y = D.
C       = 2  IF THE SOLUTION IS SPECIFIED AT Y = C AND THE DERIVATIVE OF
C            THE SOLUTION WITH RESPECT TO Y IS SPECIFIED AT Y = D.
C       = 3  IF THE DERIVATIVE OF THE SOLUTION WITH RESPECT TO Y IS
C            SPECIFIED AT Y = C AND Y = D.
C       = 4  IF THE DERIVATIVE OF THE SOLUTION WITH RESPECT TO Y IS
C            SPECIFIED AT Y = C AND THE SOLUTION IS SPECIFIED AT Y = D.
C
C     BDC
C       A ONE-DIMENSIONAL ARRAY OF LENGTH M+1 THAT SPECIFIES THE VALUES
C       OF THE DERIVATIVE OF THE SOLUTION WITH RESPECT TO Y AT Y = 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 A DUMMY VARIABLE.
C
C     BDD
C       A ONE-DIMENSIONAL ARRAY OF LENGTH M+1 THAT SPECIFIES THE VALUES
C       OF THE DERIVATIVE OF THE SOLUTION WITH RESPECT TO Y AT Y = D.
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 A DUMMY VARIABLE.
C
C     ELMBDA
C       THE CONSTANT LAMBDA IN THE HELMHOLTZ EQUATION.  IF
C       LAMBDA .GT. 0, A SOLUTION MAY NOT EXIST.  HOWEVER, PWSCRT WILL
C       ATTEMPT TO FIND A SOLUTION.
C
C     F
C       A TWO-DIMENSIONAL ARRAY WHICH SPECIFIES THE VALUES OF THE RIGHT
C       SIDE OF THE HELMHOLTZ EQUATION AND BOUNDARY VALUES (IF ANY).
C       FOR I = 2,3,...,M AND J = 2,3,...,N
C
C            F(I,J) = F(X(I),Y(J)).
C
C       ON THE BOUNDARIES F IS DEFINED BY
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))     J = 1,2,...,N+1
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)     I = 1,2,...,M+1
C              3        F(X(I),C)     F(X(I),D)
C              4        F(X(I),C)     U(X(I),D)
C
C       F MUST BE DIMENSIONED AT LEAST (M+1)*(N+1).
C
C       NOTE
C
C       IF THE TABLE CALLS FOR BOTH THE SOLUTION U AND THE RIGHT SIDE F
C       AT  A CORNER THEN THE SOLUTION MUST BE SPECIFIED.
C
C     IDIMF
C       THE ROW (OR FIRST) DIMENSION OF THE ARRAY F AS IT APPEARS IN THE
C       PROGRAM CALLING PWSCRT.  THIS PARAMETER IS USED TO SPECIFY THE
C       VARIABLE DIMENSION OF F.  IDIMF MUST BE AT LEAST M+1  .
C
C     W
C       A ONE-DIMENSIONAL ARRAY THAT MUST BE PROVIDED BY THE USER FOR
C       WORK SPACE.  THE LENGTH OF W MUST BE AT LEAST 6(N+1)+8(M+1).
C
C
C     * * * * * * * * * *     ON OUTPUT     * * * * * * * * * *
C
C     F
C       CONTAINS THE SOLUTION U(I,J) OF THE FINITE DIFFERENCE
C       APPROXIMATION FOR THE GRID POINT (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 BOUNDARY CONDITIONS
C       IS SPECIFIED FOR A POISSON EQUATION (LAMBDA = 0), A SOLUTION MAY
C       NOT EXIST.  PERTRB IS A CONSTANT, CALCULATED AND SUBTRACTED FROM
C       F, WHICH ENSURES THAT A SOLUTION EXISTS.  PWSCRT THEN COMPUTES
C       THIS SOLUTION, WHICH IS A LEAST SQUARES SOLUTION TO THE ORIGINAL
C       APPROXIMATION. THIS SOLUTION IS NOT UNIQUE AND IS UNNORMALIZED.
C       THE VALUE OF PERTRB SHOULD BE SMALL COMPARED TO THE RIGHT SIDE
C       F. OTHERWISE , A SOLUTION IS OBTAINED TO AN ESSENTIALLY
C       DIFFERENT PROBLEM. THIS COMPARISON SHOULD ALWAYS BE MADE TO
C       INSURE THAT A MEANINGFUL SOLUTION HAS BEEN OBTAINED.
C
C     IERROR
C       AN ERROR FLAG THAT INDICATES INVALID INPUT PARAMETERS.  EXCEPT
C       FOR NUMBERS 0 AND 6, 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 .NE. (2**P)(3**Q)(5**R) OR N .LE. 2  .
C       = 5  NBDCND .LT. 0 OR NBDCND .GT. 4  .
C       = 6  LAMBDA .GT. 0  .
C       = 7  IDIMF .LT. M+1  .
C
C       SINCE THIS IS THE ONLY MEANS OF INDICATING A POSSIBLY INCORRECT
C       CALL TO PWSCRT, THE USER SHOULD TEST IERROR AFTER THE CALL.
C
C     W
C       CONTAINS INTERMEDIATE VALUES THAT MUST NOT BE DESTROYED IF
C       PWSCRT WILL BE CALLED AGAIN WITH INTL = 1  .
C
C
C
      DIMENSION       F(IDIMF,1)
      DIMENSION       BDA(1)     ,BDB(1)     ,BDC(1)     ,BDD(1)     ,
     1                W(1)
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 (NCHECK(N).GT.1 .OR. N.LE.2) IERROR = 4
      IF (NBDCND.LT.0 .OR. NBDCND.GT.4) IERROR = 5
      IF (IDIMF .LT. M+1) IERROR = 7
      IF (IERROR .NE. 0) RETURN
      NPEROD = NBDCND
      NBY2 = 0
      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
      ID1 = 6*NUNK+5*MUNK
      ID2 = ID1+MUNK
      ID3 = ID2+MUNK
      S = DELYSQ*DELXSQ
      ST2 = 2.*S
      DO 130 I=1,MUNK
         J = ID1+I
         W(J) = S
         J = ID2+I
         W(J) = -ST2+ELMBDA*DELYSQ
         J = ID3+I
         W(J) = S
  130 CONTINUE
      GO TO (134,134,131,132,133),MP
  131 W(ID2) = ST2
      GO TO 134
  132 W(ID2) = ST2
  133 W(ID3+1) = ST2
  134 CONTINUE
      IF (NBDCND .NE. 4) GO TO 138
C
C     REVERSE COLUMNS TO CHANGE DERIVATIVE SPECIFIED-SOLUTION SPECIFIED
C     BOUNDARY CONDITIONS TO SOLUTION SPECIFIED-DERIVATIVE SPECIFIED.
C
      IREV = 1
      NPEROD = 2
      NBY2 = N/2
  135 DO 137 J=1,NBY2
         MSKIP = N+1-J
         DO 136 I=MSTART,MSTOP
            A1 = F(I,J)
            F(I,J) = F(I,MSKIP)
            F(I,MSKIP) = A1
  136    CONTINUE
  137 CONTINUE
      GO TO (147,150),IREV
  138 CONTINUE
      PERTRB = 0.
      IF (ELMBDA) 147,140,139
  139 IERROR = 6
      GO TO 147
  140 IF ((NBDCND.EQ.0 .OR. NBDCND.EQ.3) .AND.
     1    (MBDCND.EQ.0 .OR. MBDCND.EQ.3)) GO TO 141
      GO TO 147
C
C     FOR SINGULAR PROBLEMS MUST ADJUST DATA TO INSURE THAT A SOLUTION
C     WILL EXIST.
C
  141 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 143 J=NSP1,NSTM1
         S = 0.
         DO 142 I=MSP1,MSTM1
            S = S+F(I,J)
  142    CONTINUE
         S1 = S1+S*A1+F(MSTART,J)+F(MSTOP,J)
  143 CONTINUE
      S1 = A2*S1
      S = 0.
      DO 144 I=MSP1,MSTM1
         S = S+F(I,NSTART)+F(I,NSTOP)
  144 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 146 J=NSTART,NSTOP
         DO 145 I=MSTART,MSTOP
            F(I,J) = F(I,J)-PERTRB
  145    CONTINUE
  146 CONTINUE
      PERTRB = PERTRB/DELYSQ
C
C     SOLVE THE EQUATION.
C
  147 CALL POIS (INTL,NPEROD,NUNK,MBDCND,MUNK,W(ID1+1),W(ID2+1),
     1           W(ID3+1),IDIMF,F(MSTART,NSTART),IERR1,W)
      IF (NBY2 .EQ. 0) GO TO 148
      IREV = 2
      GO TO 135
  148 CONTINUE
C
C     FILL IN IDENTICAL VALUES WHEN HAVE PERIODIC BOUNDARY CONDITIONS.
C
      IF (NBDCND .NE. 0) GO TO 150
      DO 149 I=MSTART,MSTOP
         F(I,NP1) = F(I,1)
  149 CONTINUE
  150 IF (MBDCND .NE. 0) GO TO 152
      DO 151 J=NSTART,NSTOP
         F(MP1,J) = F(1,J)
  151 CONTINUE
      IF (NBDCND .EQ. 0) F(MP1,NP1) = F(1,NP1)
  152 CONTINUE
      RETURN
      END
      SUBROUTINE PWSPLR (INTL,A,B,M,MBDCND,BDA,BDB,C,D,N,NBDCND,BDC,    POI00418
     1                   BDD,ELMBDA,F,IDIMF,PERTRB,IERROR,W)
C
C
C***********************************************************************
C
C          VERSION  2  OCTOBER 1976  INCLUDING ERRATA  OCTOBER 1976
C
C         DOCUMENTATION FOR THIS PROGRAM IS GIVEN IN
C
C        EFFICIENT FORTRAN SUBPROGRAMS FOR THE SOLUTION OF
C            ELLIPTIC PARTIAL DIFFERENTIAL EQUATIONS
C
C                              BY
C
C          PAUL SWARZTRAUBER   AND  ROLAND SWEET
C
C             TECHNICAL NOTE TN/IA-109   JULY 1975
C
C       NATIONAL CENTER FOR ATMOSPHERIC RESEARCH  BOULDER,COLORADO 80307
C
C        WHICH IS SPONSORED BY THE NATIONAL SCIENCE FOUNDATION
C
C***********************************************************************
C
C
C
C     SUBROUTINE PWSPLR SOLVES A FINITE DIFFERENCE APPROXIMATION TO THE
C     HELMHOLTZ EQUATION IN POLAR COORDINATES:
C
C          (1/R)(D/DR)(R(D/DR)U) + (1/R**2)(D/DTHETA)(D/DTHETA)U
C
C                                + LAMBDA*U = F(R,THETA).
C
C     THE ARGUMENTS ARE DEFINED AS :
C
C
C     * * * * * * * * * *     ON INPUT     * * * * * * * * * *
C
C     INTL
C       = 0  ON INITIAL ENTRY TO PWSPLR OR IF N OR NBDCND ARE CHANGED
C            FROM PREVIOUS CALL.
C       = 1  IF N AND NBDCND ARE UNCHANGED FROM PREVIOUS CALL TO PWSPLR.
C
C       NOTE:  A CALL WITH INTL = 1 IS ABOUT 1 PER CENT FASTER THAN A
C             CALL WITH INTL = 0  .
C
C     A,B
C       THE RANGE OF R, I.E., A .LE. R .LE. B.  A MUST BE LESS THAN B
C       AND A MUST BE NON-NEGATIVE.
C
C     M
C       THE NUMBER OF PANELS INTO WHICH THE INTERVAL (A,B) IS
C       SUBDIVIDED.  HENCE, THERE WILL BE M+1 GRID POINTS IN THE
C       R-DIRECTION GIVEN BY R(I) = A+(I-1)DR, FOR I = 1,2,...,M+1,
C       WHERE DR = (B-A)/M IS THE PANEL WIDTH.
C
C     MBDCND
C       INDICATES THE TYPE OF BOUNDARY CONDITION AT R = A AND R = B.
C
C       = 1  IF THE SOLUTION IS SPECIFIED AT R = A AND R = B.
C       = 2  IF THE SOLUTION IS SPECIFIED AT R = A AND THE DERIVATIVE OF
C            THE SOLUTION WITH RESPECT TO R IS SPECIFIED AT R = B.
C       = 3  IF THE DERIVATIVE OF THE SOLUTION WITH RESPECT TO R IS
C            SPECIFIED AT R = A (SEE NOTE BELOW) AND R = B.
C       = 4  IF THE DERIVATIVE OF THE SOLUTION WITH RESPECT TO R IS
C            SPECIFIED AT R = A (SEE NOTE BELOW) AND THE SOLUTION IS
C            SPECIFIED AT R = B.
C       = 5  IF THE SOLUTION IS UNSPECIFIED AT R = A = 0 AND THE
C            SOLUTION IS SPECIFIED AT R = B.
C       = 6  IF THE SOLUTION IS UNSPECIFIED AT R = A = 0 AND THE
C            DERIVATIVE OF THE SOLUTION WITH RESPECT TO R IS SPECIFIED
C            AT R = B.
C
C       NOTE:  IF A = 0, DO NOT USE MBDCND = 3 OR 4, BUT INSTEAD USE
C              MBDCND = 1,2,5, OR 6  .
C
C     BDA
C       A ONE-DIMENSIONAL ARRAY OF LENGTH N+1 THAT SPECIFIES THE VALUES
C       OF THE DERIVATIVE OF THE SOLUTION WITH RESPECT TO R AT R = A.
C       WHEN MBDCND = 3 OR 4,
C
C            BDA(J) = (D/DR)U(A,THETA(J)), J = 1,2,...,N+1  .
C
C       WHEN MBDCND HAS ANY OTHER VALUE, BDA IS A DUMMY VARIABLE.
C
C     BDB
C       A ONE-DIMENSIONAL ARRAY OF LENGTH N+1 THAT SPECIFIES THE VALUES
C       OF THE DERIVATIVE OF THE SOLUTION WITH RESPECT TO R AT R = B.
C       WHEN MBDCND = 2,3, OR 6,
C
C            BDB(J) = (D/DR)U(B,THETA(J)), J = 1,2,...,N+1  .
C
C       WHEN MBDCND HAS ANY OTHER VALUE, BDB IS A DUMMY VARIABLE.
C
C     C,D
C       THE RANGE OF THETA, I.E., C .LE. THETA .LE. D.  C MUST BE LESS
C       THAN D.
C
C     N
C       THE NUMBER OF PANELS INTO WHICH THE INTERVAL (C,D) IS
C       SUBDIVIDED.  HENCE, THERE WILL BE N+1 GRID POINTS IN THE
C       THETA-DIRECTION GIVEN BY THETA(J) = C+(J-1)DTHETA FOR
C       J = 1,2,...,N+1, WHERE DTHETA = (D-C)/N IS THE PANEL WIDTH.  N
C       MUST BE IN THE FORM (2**P)(3**Q)(5**R) WHERE P, Q, AND R ARE ANY
C       NON-NEGATIVE INTEGERS.  N MUST BE GREATER THAN 2.
C
C     NBDCND
C       INDICATES THE TYPE OF BOUNDARY CONDITIONS AT THETA = C AND
C       AND THETA = D.
C
C       = 0  IF THE SOLUTION IS PERIODIC IN THETA, I.E.,
C            U(I,1) = U(I,N+1).
C       = 1  IF THE SOLUTION IS SPECIFIED AT THETA = C AND THETA = D
C            (SEE NOTE BELOW).
C       = 2  IF THE SOLUTION IS SPECIFIED AT THETA = C AND THE
C            DERIVATIVE OF THE SOLUTION WITH RESPECT TO THETA IS
C            SPECIFIED AT THETA = D (SEE NOTE BELOW).
C       = 4  IF THE DERIVATIVE OF THE SOLUTION WITH RESPECT TO THETA IS
C            SPECIFIED AT THETA = C AND THE SOLUTION IS SPECIFIED AT
C            THETA = D (SEE NOTE BELOW).
C
C       NOTE:  WHEN NBDCND = 1,2, OR 4, DO NOT USE MBDCND = 5 OR 6
C              (THE FORMER INDICATES THAT THE SOLUTION IS SPECIFIED AT
C              R = 0, THE 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+1 THAT SPECIFIES THE VALUES
C       OF THE DERIVATIVE 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), I = 1,2,...,M+1  .
C
C       WHEN NBDCND HAS ANY OTHER VALUE, BDC IS A DUMMY VARIABLE.
C
C     BDD
C       A ONE-DIMENSIONAL ARRAY OF LENGTH M+1 THAT SPECIFIES THE VALUES
C       OF THE DERIVATIVE 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), I = 1,2,...,M+1  .
C
C       WHEN NBDCND HAS ANY OTHER VALUE, BDD IS A DUMMY VARIABLE.
C
C     ELMBDA
C       THE CONSTANT LAMBDA IN THE HELMHOLTZ EQUATION.  IF
C       LAMBDA .GT. 0, A SOLUTION MAY NOT EXIST.  HOWEVER, PWSPLR WILL
C       ATTEMPT TO FIND A SOLUTION.
C
C     F
C       A TWO-DIMENSIONAL ARRAY THAT SPECIFIES THE VALUES OF THE RIGHT
C       SIDE OF THE HELMHOLTZ EQUATION AND BOUNDARY VALUES (IF ANY).
C       FOR I = 2,3,...,M AND J = 2,3,...,N
C
C            F(I,J) = F(R(I),THETA(J)).
C
C       ON THE BOUNDARIES F IS DEFINED BY
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))   J = 1,2,...,N+1
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)   I = 1,2,...,M+1
C              3      F(R(I),C)         F(R(I),D)
C              4      F(R(I),C)         U(R(I),D)
C
C       F MUST BE DIMENSIONED AT LEAST (M+1)*(N+1).
C
C       NOTE
C
C       IF THE TABLE CALLS FOR BOTH THE SOLUTION U AND THE RIGHT SIDE F
C       AT  A CORNER THEN THE SOLUTION MUST BE SPECIFIED.
C
C     IDIMF
C       THE ROW (OR FIRST) DIMENSION OF THE ARRAY F AS IT APPEARS IN THE
C       PROGRAM CALLING PWSPLR.  THIS PARAMETER IS USED TO SPECIFY THE
C       VARIABLE DIMENSION OF F.  IDIMF MUST BE AT LEAST M+1  .
C
C     W
C       A ONE-DIMENSIONAL ARRAY THAT MUST BE PROVIDED BY THE USER FOR
C       WORK SPACE.  THE LENGTH OF W MUST BE AT LEAST 6(N+1)+8(M+1).
C
C
C     * * * * * * * * * *     ON OUTPUT     * * * * * * * * * *
C
C     F
C       CONTAINS THE SOLUTION U(I,J) OF THE FINITE DIFFERENCE
C       APPROXIMATION FOR THE GRID POINT (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, OR UNSPECIFIED
C       BOUNDARY CONDITIONS IS SPECIFIED FOR A POISSON EQUATION
C       (LAMBDA = 0), A SOLUTION MAY NOT EXIST.  PERTRB IS A CONSTANT,
C       CALCULATED AND SUBTRACTED FROM F, WHICH ENSURES THAT A SOLUTION
C       EXISTS.  PWSPLR THEN COMPUTES THIS SOLUTION, WHICH IS A LEAST
C       SQUARES SOLUTION TO THE ORIGINAL APPROXIMATION.  THIS SOLUTION
C       IS NOT UNIQUE AND IS UNNORMALIZED. THE VALUE OF PERTRB SHOULD
C       BE SMALL COMPARED TO THE RIGHT SIDE F. OTHERWISE , A SOLUTION
C       IS OBTAINED TO AN ESSENTIALLY DIFFERENT PROBLEM. THIS COMPARISON
C       SHOULD ALWAYS BE MADE TO INSURE THAT A MEANINGFUL SOLUTION HAS
C       BEEN OBTAINED
C
C     IERROR
C       AN ERROR FLAG THAT INDICATES INVALID INPUT PARAMETERS.  EXCEPT
C       FOR NUMBERS 0 AND 11, 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 .NE. (2**P)(3**Q)(5**R) OR N .LE. 2  .
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 AND NBDCND .NE. 3  .
C       = 10  IDIMF .LT. M+1  .
C       = 11  LAMBDA .GT. 0  .
C
C       SINCE THIS IS THE ONLY MEANS OF INDICATING A POSSIBLY INCORRECT
C       CALL TO PWSPLR, THE USER SHOULD TEST IERROR AFTER THE CALL.
C
C     W
C       CONTAINS INTERMEDIATE VALUES THAT MUST NOT BE DESTROYED IF
C       PWSPLR WILL BE CALLED AGAIN WITH INTL = 1  .
C
C
C
      DIMENSION       F(IDIMF,1)
      DIMENSION       BDA(1)     ,BDB(1)     ,BDC(1)     ,BDD(1)     ,
     1                W(1)
C
C     CHECK FOR INVALID PARAMETERS.
C
      IERROR = 0
      IF (A .LT. 0.) IERROR = 1
      IF (A .GE. B) IERROR = 2
      IF (MBDCND.LE.0 .OR. MBDCND.GE.7) IERROR = 3
      IF (C .GE. D) IERROR = 4
      IF (NCHECK(N).GT.1 .OR. N.LE.2) IERROR = 5
      IF (NBDCND.LE.-1 .OR. NBDCND.GE.5) IERROR = 6
      IF (A.EQ.0. .AND. (MBDCND.EQ.3 .OR. MBDCND.EQ.4)) IERROR = 7
      IF (A.GT.0. .AND. MBDCND.GE.5) IERROR = 8
      IF (MBDCND.GE.5 .AND. NBDCND.NE.0 .AND. NBDCND.NE.3) IERROR = 9
      IF (IDIMF .LT. M+1) IERROR = 10
      IF (IERROR .NE. 0) RETURN
      MP1 = M+1
      DELTAR = (B-A)/FLOAT(M)
      DLRBY2 = DELTAR/2.
      DLRSQ = DELTAR**2
      NP1 = N+1
      DELTHT = (D-C)/FLOAT(N)
      DLTHSQ = DELTHT**2
      NP = NBDCND+1
C
C     DEFINE RANGE OF INDICES I AND J FOR UNKNOWNS U(I,J).
C
      MSTART = 2
      MSTOP = MP1
      GO TO (101,105,102,103,104,105),MBDCND
  101 MSTOP = M
      GO TO 105
  102 MSTART = 1
      GO TO 105
  103 MSTART = 1
  104 MSTOP = M
  105 MUNK = MSTOP-MSTART+1
      NSTART = 1
      NSTOP = N
      GO TO (109,106,107,108,109),NP
  106 NSTART = 2
      GO TO 109
  107 NSTART = 2
  108 NSTOP = NP1
  109 NUNK = NSTOP-NSTART+1
C
C     DEFINE A,B,C COEFFICIENTS IN W-ARRAY.
C
      ID1 = 6*NUNK+5*MUNK
      ID2 = ID1+MUNK
      ID3 = ID2+MUNK
      ID4 = ID3+MUNK
      ID5 = ID1-5*MUNK
      ID6 = ID5+MUNK
      A1 = 2./DLRSQ
      IJ = 0
      IF (MBDCND.EQ.3 .OR. MBDCND.EQ.4) IJ = 1
      DO 110 I=1,MUNK
         R = A+FLOAT(I-IJ)*DELTAR
         J = ID5+I
         W(J) = R
         J = ID6+I
         W(J) = 1./R**2
         J = ID1+I
         W(J) = (R-DLRBY2)/(R*DLRSQ)
         J = ID3+I
         W(J) = (R+DLRBY2)/(R*DLRSQ)
         J = ID2+I
         W(J) = -A1+ELMBDA
  110 CONTINUE
      GO TO (114,111,112,113,114,111),MBDCND
  111 W(ID2) = A1
      GO TO 114
  112 W(ID2) = A1
  113 W(ID3+1) = A1
  114 CONTINUE
C
C     ENTER BOUNDARY DATA FOR R-BOUNDARIES.
C
      GO TO (115,115,117,117,119,119),MBDCND
  115 A1 = W(ID1+1)
      DO 116 J=NSTART,NSTOP
         F(2,J) = F(2,J)-A1*F(1,J)
  116 CONTINUE
      GO TO 119
  117 A1 = 2.*DELTAR*W(ID1+1)
      DO 118 J=NSTART,NSTOP
         F(1,J) = F(1,J)+A1*BDA(J)
  118 CONTINUE
  119 GO TO (120,122,122,120,120,122),MBDCND
  120 A1 = W(ID4)
      DO 121 J=NSTART,NSTOP
         F(M,J) = F(M,J)-A1*F(MP1,J)
  121 CONTINUE
      GO TO 124
  122 A1 = 2.*DELTAR*W(ID4)
      DO 123 J=NSTART,NSTOP
         F(MP1,J) = F(MP1,J)-A1*BDB(J)
  123 CONTINUE
C
C     ENTER BOUNDARY DATA FOR THETA-BOUNDARIES.
C
  124 A1 = 1./DLTHSQ
      L = ID5-MSTART+1
      LP = ID6-MSTART+1
      GO TO (134,125,125,127,127),NP
  125 DO 126 I=MSTART,MSTOP
         J = I+LP
         F(I,2) = F(I,2)-A1*W(J)*F(I,1)
  126 CONTINUE
      GO TO 129
  127 A1 = 2./DELTHT
      DO 128 I=MSTART,MSTOP
         J = I+LP
         F(I,1) = F(I,1)+A1*W(J)*BDC(I)
  128 CONTINUE
  129 A1 = 1./DLTHSQ
      GO TO (134,130,132,132,130),NP
  130 DO 131 I=MSTART,MSTOP
         J = I+LP
         F(I,N) = F(I,N)-A1*W(J)*F(I,NP1)
  131 CONTINUE
      GO TO 134
  132 A1 = 2./DELTHT
      DO 133 I=MSTART,MSTOP
         J = I+LP
         F(I,NP1) = F(I,NP1)-A1*W(J)*BDD(I)
  133 CONTINUE
  134 CONTINUE
C
C     ADJUST RIGHT SIDE OF EQUATION FOR UNKNOWN AT POLE WHEN HAVE
C     DERIVATIVE SPECIFIED BOUNDARY CONDITIONS.
C
      IF (MBDCND.GE.5 .AND. NBDCND.EQ.3)
     1    F(1,1) = F(1,1)-(BDD(2)-BDC(2))*4./(FLOAT(N)*DELTHT*DLRSQ)
C
C     ADJUST RIGHT SIDE OF SINGULAR PROBLEMS TO INSURE EXISTENCE OF A
C     SOLUTION.
C
      PERTRB = 0.
      IF (ELMBDA) 144,136,135
  135 IERROR = 11
      GO TO 144
  136 IF (NBDCND.NE.0 .AND. NBDCND.NE.3) GO TO 144
      S2 = 0.
      GO TO (144,144,137,144,144,138),MBDCND
  137 W(ID5+1) = .5*(W(ID5+2)-DLRBY2)
      S2 = .25*DELTAR
  138 A2 = 2.
      IF (NBDCND .EQ. 0) A2 = 1.
      J = ID5+MUNK
      W(J) = .5*(W(J-1)+DLRBY2)
      S = 0.
      DO 140 I=MSTART,MSTOP
         S1 = 0.
         IJ = NSTART+1
         K = NSTOP-1
         DO 139 J=IJ,K
            S1 = S1+F(I,J)
  139    CONTINUE
         J = I+L
         S = S+(A2*S1+F(I,NSTART)+F(I,NSTOP))*W(J)
  140 CONTINUE
      S2 = FLOAT(M)*A+DELTAR*(FLOAT((M-1)*(M+1))*.5+.25)+S2
      S1 = (2.+A2*FLOAT(NUNK-2))*S2
      IF (MBDCND .EQ. 3) GO TO 141
      S2 = FLOAT(N)*A2*DELTAR/8.
      S = S+F(1,1)*S2
      S1 = S1+S2
  141 CONTINUE
      PERTRB = S/S1
      DO 143 I=MSTART,MSTOP
         DO 142 J=NSTART,NSTOP
            F(I,J) = F(I,J)-PERTRB
  142    CONTINUE
  143 CONTINUE
  144 CONTINUE
C
C     MULTIPLY I-TH EQUATION THROUGH BY (R(I)*DELTHT)**2.
C
      DO 146 I=MSTART,MSTOP
         K = I-MSTART+1
         J = I+LP
         A1 = DLTHSQ/W(J)
         J = ID1+K
         W(J) = A1*W(J)
         J = ID2+K
         W(J) = A1*W(J)
         J = ID3+K
         W(J) = A1*W(J)
         DO 145 J=NSTART,NSTOP
            F(I,J) = A1*F(I,J)
  145    CONTINUE
  146 CONTINUE
      LP = NBDCND
      IF (LP .NE. 4) GO TO 150
C
C     REVERSE COLUMNS SO THE DERIVATIVE SPECIFIED-SOLUTION SPECIFIED
C     BOUNDARY CONDITIONS BECOME SOLUTION SPECIFIED-DERIVATIVE SPECIFIED
C
      LP = 2
      ID5 = 1
      K = N/2
  147 DO 149 J=1,K
         L = N+1-J
         DO 148 I=MSTART,MSTOP
            S = F(I,L)
            F(I,L) = F(I,J)
            F(I,J) = S
  148    CONTINUE
  149 CONTINUE
      GO TO (150,162),ID5
C
C     CALL POIS TO SOLVE THE SYSTEM OF EQUATIONS.
C
  150 CALL POIS (INTL,LP,NUNK,MBDCND,MUNK,W(ID1+1),W(ID2+1),W(ID3+1),
     1           IDIMF,F(MSTART,NSTART),IERR1,W)
      IF (NBDCND .NE. 4) GO TO 151
      ID5 = 2
      GO TO 147
  151 GO TO (162,162,162,162,153,152),MBDCND
C
C     ADJUST THE SOLUTION AS NECESSARY FOR THE PROBLEMS WHERE A = 0.
C
  152 IF (ELMBDA .NE. 0.) GO TO 153
      YPOLE = 0.
      GO TO 160
  153 CONTINUE
      J = ID5+MUNK
      W(J) = W(ID2)/W(ID3)
      DO 154 IP=3,MUNK
         I = MUNK-IP+2
         J = ID5+I
         IJ = ID1+I
         LP = ID2+I
         K = ID3+I
         W(J) = W(IJ)/(W(LP)-W(K)*W(J+1))
  154 CONTINUE
      W(ID5+1) = -.5*DLTHSQ/(W(ID2+1)-W(ID3+1)*W(ID5+2))
      DO 155 I=2,MUNK
         J = ID5+I
         W(J) = -W(J)*W(J-1)
  155 CONTINUE
      S = 0.
      DO 156 J=NSTART,NSTOP
         S = S+F(2,J)
  156 CONTINUE
      A2 = NUNK
      IF (NBDCND .EQ. 0) GO TO 157
      S = S-.5*(F(2,NSTART)+F(2,NSTOP))
      A2 = A2-1.
  157 YPOLE = (.25*DLRSQ*F(1,1)-S/A2)/(W(ID5+1)-1.+ELMBDA*DLRSQ*.25)
      DO 159 I=MSTART,MSTOP
         K = L+I
         DO 158 J=NSTART,NSTOP
            F(I,J) = F(I,J)+YPOLE*W(K)
  158    CONTINUE
  159 CONTINUE
  160 DO 161 J=1,NP1
         F(1,J) = YPOLE
  161 CONTINUE
  162 CONTINUE
      IF (NBDCND .NE. 0) GO TO 164
      DO 163 I=MSTART,MSTOP
         F(I,NP1) = F(I,1)
  163 CONTINUE
  164 CONTINUE
      RETURN
      END
      SUBROUTINE PWSCYL (INTL,A,B,M,MBDCND,BDA,BDB,C,D,N,NBDCND,BDC,    POI00931
     1                   BDD,ELMBDA,F,IDIMF,PERTRB,IERROR,W)
C
C
C***********************************************************************
C
C          VERSION  2  OCTOBER 1976  INCLUDING ERRATA  OCTOBER 1976
C
C         DOCUMENTATION FOR THIS PROGRAM IS GIVEN IN
C
C        EFFICIENT FORTRAN SUBPROGRAMS FOR THE SOLUTION OF
C            ELLIPTIC PARTIAL DIFFERENTIAL EQUATIONS
C
C                              BY
C
C          PAUL SWARZTRAUBER   AND  ROLAND SWEET
C
C             TECHNICAL NOTE TN/IA-109   JULY 1975
C
C       NATIONAL CENTER FOR ATMOSPHERIC RESEARCH  BOULDER,COLORADO 80307
C
C        WHICH IS SPONSORED BY THE NATIONAL SCIENCE FOUNDATION
C
C***********************************************************************
C
C
C
C     SUBROUTINE PWSCYL SOLVES A FINITE DIFFERENCE APPROXIMATION TO THE
C       MODIFIED HELMHOLTZ EQUATION IN CYLINDRICAL COORDINATES
C
C          (1/R)(D/DR)(R(D/DR)U) + (D/DZ)(D/DZ)U
C
C                                + (LAMBDA/R**2)U = F(R,Z)
C
C     THIS TWO DIMENSIONAL MODIFIED HELMHOLTZ EQUATION RESULTS FROM
C     THE FOURIER TRANSFORM OF THE THREE DIMENSIONAL POISSON EQUATION
C
C
C     THE ARGUMENTS ARE DEFINED AS:
C
C
C     * * * * * * * * * *     ON INPUT     * * * * * * * * * *
C
C     INTL
C       = 0  ON INITIAL ENTRY TO PWSCYL OR IF N AND NBDCND ARE CHANGED
C            FROM PREVIOUS CALL.
C       = 1  IF N AND NBDCND ARE UNCHANGED FROM PREVIOUS CALL TO PWSCYL.
C
C       NOTE:  A CALL WITH INTL = 1 IS ABOUT 1 PERCENT FASTER THAN A
C              CALL WITH INTL = 0  .
C
C     A,B
C       THE RANGE OF R, I.E., A .LE. R .LE. B.  A MUST BE LESS THAN B
C       AND A MUST BE NON-NEGATIVE.
C
C     M
C       THE NUMBER OF PANELS INTO WHICH THE INTERVAL (A,B) IS
C       SUBDIVIDED.  HENCE, THERE WILL BE M+1 GRID POINTS IN THE
C       R-DIRECTION GIVEN BY R(I) = A+(I-1)DR, FOR I = 1,2,...,M+1,
C       WHERE DR = (B-A)/M IS THE PANEL WIDTH.
C
C     MBDCND
C       INDICATES THE TYPE OF BOUNDARY CONDITIONS AT R = A AND R = B.
C
C       = 1  IF THE SOLUTION IS SPECIFIED AT R = A AND R = B.
C       = 2  IF THE SOLUTION IS SPECIFIED AT R = A AND THE DERIVATIVE OF
C            THE SOLUTION WITH RESPECT TO R IS SPECIFIED AT R = B.
C       = 3  IF THE DERIVATIVE OF THE SOLUTION WITH RESPECT TO R IS
C            SPECIFIED AT R = A (SEE NOTE BELOW) AND R = B.
C       = 4  IF THE DERIVATIVE OF THE SOLUTION WITH RESPECT TO R IS
C            SPECIFIED AT R = A (SEE NOTE BELOW) AND THE SOLUTION IS
C            SPECIFIED AT R = B.
C       = 5  IF THE SOLUTION IS UNSPECIFIED AT R = A = 0 AND THE
C            SOLUTION IS SPECIFIED AT R = B.
C       = 6  IF THE SOLUTION IS UNSPECIFIED AT R = A = 0 AND THE
C            DERIVATIVE OF THE SOLUTION WITH RESPECT TO R IS SPECIFIED
C            AT R = B.
C
C       NOTE:  IF A = 0, DO NOT USE MBDCND = 3 OR 4, BUT INSTEAD USE
C              MBDCND = 1,2,5, OR 6  .
C
C     BDA
C       A ONE-DIMENSIONAL ARRAY OF LENGTH N+1 THAT SPECIFIES THE VALUES
C       OF THE DERIVATIVE OF THE SOLUTION WITH RESPECT TO R AT R = A.
C       WHEN MBDCND = 3 OR 4,
C
C            BDA(J) = (D/DR)U(A,Z(J)), J = 1,2,...,N+1  .
C
C       WHEN MBDCND HAS ANY OTHER VALUE, BDA IS A DUMMY VARIABLE.
C
C     BDB
C       A ONE-DIMENSIONAL ARRAY OF LENGTH N+1 THAT SPECIFIES THE VALUES
C       OF THE DERIVATIVE OF THE SOLUTION WITH RESPECT TO R AT R = B.
C       WHEN MBDCND = 2,3, OR 6,
C
C            BDB(J) = (D/DR)U(B,Z(J)), J = 1,2,...,N+1  .
C
C       WHEN MBDCND HAS ANY OTHER VALUE, BDB IS A DUMMY VARIABLE.
C
C     C,D
C       THE RANGE OF Z, I.E., C .LE. Z .LE. D.  C MUST BE LESS THAN D.
C
C     N
C       THE NUMBER OF PANELS INTO WHICH THE INTERVAL (C,D) IS
C       SUBDIVIDED.  HENCE, THERE WILL BE N+1 GRID POINTS IN THE
C       Z-DIRECTION GIVEN BY Z(J) = C+(J-1)DZ, FOR J = 1,2,...,N+1,
C       WHERE DZ = (D-C)/N IS THE PANEL WIDTH.  N MUST BE OF THE FORM
C       (2**P)(3**Q)(5**R) WHERE P, Q, AND R ARE ANY NON-NEGATIVE
C       INTEGERS.  N MUST BE GREATER THAN 2  .
C
C     NBDCND
C       INDICATES THE TYPE OF BOUNDARY CONDITIONS AT Z = C AND Z = D.
C
C       = 0  IF THE SOLUTION IS PERIODIC IN Z, I.E., U(I,1) = U(I,N+1).
C       = 1  IF THE SOLUTION IS SPECIFIED AT Z = C AND Z = D.
C       = 2  IF THE SOLUTION IS SPECIFIED AT Z = C AND THE DERIVATIVE OF
C            THE SOLUTION WITH RESPECT TO Z IS SPECIFIED AT Z = D.
C       = 3  IF THE DERIVATIVE OF THE SOLUTION WITH RESPECT TO Z IS
C            SPECIFIED AT Z = C AND Z = D.
C       = 4  IF THE DERIVATIVE OF THE SOLUTION WITH RESPECT TO Z IS
C            SPECIFIED AT Z = C AND THE SOLUTION IS SPECIFIED AT Z = D.
C
C     BDC
C       A ONE-DIMENSIONAL ARRAY OF LENGTH M+1 THAT SPECIFIES THE VALUES
C       OF THE DERIVATIVE OF THE SOLUTION WITH RESPECT TO Z AT Z = C.
C       WHEN NBDCND = 3 OR 4,
C
C            BDC(I) = (D/DZ)U(R(I),C), I = 1,2,...,M+1  .
C
C       WHEN NBDCND HAS ANY OTHER VALUE, BDC IS A DUMMY VARIABLE.
C
C     BDD
C       A ONE-DIMENSIONAL ARRAY OF LENGTH M+1 THAT SPECIFIES THE VALUES
C       OF THE DERIVATIVE OF THE SOLUTION WITH RESPECT TO Z AT Z = D.
C       WHEN NBDCND = 2 OR 3,
C
C            BDD(I) = (D/DZ)U(R(I),D), I = 1,2,...,M+1  .
C
C       WHEN NBDCND HAS ANY OTHER VALUE, BDD IS A DUMMY VARIABLE.
C
C     ELMBDA
C       THE CONSTANT LAMBDA IN THE HELMHOLTZ EQUATION.  IF
C       LAMBDA .GT. 0, A SOLUTION MAY NOT EXIST.  HOWEVER, PWSCYL WILL
C       ATTEMPT TO FIND A SOLUTION.  LAMBDA MUST BE ZERO WHEN
C       MBDCND = 5 OR 6  .
C
C     F
C       A TWO-DIMENSIONAL ARRAY THAT SPECIFIES THE VALUES OF THE RIGHT
C       SIDE OF THE HELMHOLTZ EQUATION AND BOUNDARY DATA (IF ANY).  FOR
C       I = 2,3,...,M AND J = 2,3,...,N
C
C            F(I,J) = F(R(I),Z(J)).
C
C       ON THE BOUNDARIES F IS DEFINED BY
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))   J = 1,2,...,N+1
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)   I = 1,2,...,M+1
C              3      F(R(I),C)         F(R(I),D)
C              4      F(R(I),C)         U(R(I),D)
C
C       F MUST BE DIMENSIONED AT LEAST (M+1)*(N+1).
C
C       NOTE
C
C       IF THE TABLE CALLS FOR BOTH THE SOLUTION U AND THE RIGHT SIDE F
C       AT  A CORNER THEN THE SOLUTION MUST BE SPECIFIED.
C
C     IDIMF
C       THE ROW (OR FIRST) DIMENSION OF THE ARRAY F AS IT APPEARS IN THE
C       PROGRAM CALLING PWSCYL.  THIS PARAMETER IS USED TO SPECIFY THE
C       VARIABLE DIMENSION OF F.  IDIMF MUST BE AT LEAST M+1  .
C
C     W
C       A ONE-DIMENSIONAL ARRAY THAT MUST BE PROVIDED BY THE USER FOR
C       WORK SPACE.  THE LENGTH OF W MUST BE AT LEAST 6(N+1)+8(M+1).
C
C
C     * * * * * * * * * *     ON OUTPUT     * * * * * * * * * *
C
C     F
C       CONTAINS THE SOLUTION U(I,J) OF THE FINITE DIFFERENCE
C       APPROXIMATION FOR THE GRID POINT (R(I),Z(J)), I = 1,2,...,M+1,
C       J = 1,2,...,N+1  .
C
C     PERTRB
C       IF ONE SPECIFIES A COMBINATION OF PERIODIC, DERIVATIVE, AND
C       UNSPECIFIED BOUNDARY CONDITIONS FOR A POISSON EQUATION
C       (LAMBDA = 0), A SOLUTION MAY NOT EXIST.  PERTRB IS A CONSTANT,
C       CALCULATED AND SUBTRACTED FROM F, WHICH ENSURES THAT A SOLUTION
C       EXISTS.  PWSCYL THEN COMPUTES THIS SOLUTION, WHICH IS A LEAST
C       SQUARES SOLUTION TO THE ORIGINAL APPROXIMATION.  THIS SOLUTION
C       IS NOT UNIQUE AND IS UNNORMALIZED. THE VALUE OF PERTRB SHOULD
C       BE SMALL COMPARED TO THE RIGHT SIDE F. OTHERWISE , A SOLUTION
C       IS OBTAINED TO AN ESSENTIALLY DIFFERENT PROBLEM. THIS COMPARISON
C       SHOULD ALWAYS BE MADE TO INSURE THAT A MEANINGFUL SOLUTION HAS
C       BEEN OBTAINED
C
C     IERROR
C       AN ERROR FLAG WHICH INDICATES INVALID INPUT PARAMETERS.  EXCEPT
C       FOR NUMBERS 0 AND 11, 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 .NE. (2**P)(3**Q)(5**R) OR N .LE. 2  .
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
C       SINCE THIS IS THE ONLY MEANS OF INDICATING A POSSIBLY INCORRECT
C       CALL TO PWSCYL, THE USER SHOULD TEST IERROR AFTER THE CALL.
C
C     W
C       CONTAINS INTERMEDIATE VALUES THAT MUST NOT BE DESTROYED IF
C       PWSCYL WILL BE CALLED AGAIN WITH INTL = 1  .
C
C
C
      DIMENSION       F(IDIMF,1)
      DIMENSION       BDA(1)     ,BDB(1)     ,BDC(1)     ,BDD(1)     ,
     1                W(1)
C
C     CHECK FOR INVALID PARAMETERS.
C
      IERROR = 0
      IF (A .LT. 0.) IERROR = 1
      IF (A .GE. B) IERROR = 2
      IF (MBDCND.LE.0 .OR. MBDCND.GE.7) IERROR = 3
      IF (C .GE. D) IERROR = 4
      IF (NCHECK(N).GT.1 .OR. N.LE.2) IERROR = 5
      IF (NBDCND.LE.-1 .OR. NBDCND.GE.5) IERROR = 6
      IF (A.EQ.0. .AND. (MBDCND.EQ.3 .OR. MBDCND.EQ.4)) IERROR = 7
      IF (A.GT.0. .AND. MBDCND.GE.5) IERROR = 8
      IF (A.EQ.0. .AND. ELMBDA.NE.0. .AND. MBDCND.GE.5) IERROR = 9
      IF (IDIMF .LT. M+1) IERROR = 10
      IF (IERROR .NE. 0) RETURN
      MP1 = M+1
      DELTAR = (B-A)/FLOAT(M)
      DLRBY2 = DELTAR/2.
      DLRSQ = DELTAR**2
      NP1 = N+1
      DELTHT = (D-C)/FLOAT(N)
      DLTHSQ = DELTHT**2
      NP = NBDCND+1
C
C     DEFINE RANGE OF INDICES I AND J FOR UNKNOWNS U(I,J).
C
      MSTART = 2
      MSTOP = M
      GO TO (104,103,102,101,101,102),MBDCND
  101 MSTART = 1
      GO TO 104
  102 MSTART = 1
  103 MSTOP = MP1
  104 MUNK = MSTOP-MSTART+1
      NSTART = 1
      NSTOP = N
      GO TO (108,105,106,107,108),NP
  105 NSTART = 2
      GO TO 108
  106 NSTART = 2
  107 NSTOP = NP1
  108 NUNK = NSTOP-NSTART+1
C
C     DEFINE A,B,C COEFFICIENTS IN W-ARRAY.
C
      ID1 = 6*NUNK+5*MUNK
      ID2 = ID1+MUNK
      ID3 = ID2+MUNK
      ID4 = ID3+MUNK
      ID5 = ID1-5*MUNK
      ID6 = ID5+MUNK
      ISTART = 1
      A1 = 2./DLRSQ
      IJ = 0
      IF (MBDCND.EQ.3 .OR. MBDCND.EQ.4) IJ = 1
      IF (MBDCND .LE. 4) GO TO 109
      W(ID1+1) = 0.
      W(ID2+1) = -2.*A1
      W(ID3+1) = 2.*A1
      ISTART = 2
      IJ = 1
  109 DO 110 I=ISTART,MUNK
         R = A+FLOAT(I-IJ)*DELTAR
         J = ID5+I
         W(J) = R
         J = ID6+I
         W(J) = 1./R**2
         J = ID1+I
         W(J) = (R-DLRBY2)/(R*DLRSQ)
         J = ID3+I
         W(J) = (R+DLRBY2)/(R*DLRSQ)
         K = ID6+I
         J = ID2+I
         W(J) = -A1+ELMBDA*W(K)
  110 CONTINUE
      GO TO (114,111,112,113,114,112),MBDCND
  111 W(ID2) = A1
      GO TO 114
  112 W(ID2) = A1
  113 W(ID3+1) = A1*FLOAT(ISTART)
  114 CONTINUE
C
C     ENTER BOUNDARY DATA FOR R-BOUNDARIES.
C
      GO TO (115,115,117,117,119,119),MBDCND
  115 A1 = W(ID1+1)
      DO 116 J=NSTART,NSTOP
         F(2,J) = F(2,J)-A1*F(1,J)
  116 CONTINUE
      GO TO 119
  117 A1 = 2.*DELTAR*W(ID1+1)
      DO 118 J=NSTART,NSTOP
         F(1,J) = F(1,J)+A1*BDA(J)
  118 CONTINUE
  119 GO TO (120,122,122,120,120,122),MBDCND
  120 A1 = W(ID4)
      DO 121 J=NSTART,NSTOP
         F(M,J) = F(M,J)-A1*F(MP1,J)
  121 CONTINUE
      GO TO 124
  122 A1 = 2.*DELTAR*W(ID4)
      DO 123 J=NSTART,NSTOP
         F(MP1,J) = F(MP1,J)-A1*BDB(J)
  123 CONTINUE
C
C     ENTER BOUNDARY DATA FOR Z-BOUNDARIES.
C
  124 A1 = 1./DLTHSQ
      L = ID5-MSTART+1
      GO TO (134,125,125,127,127),NP
  125 DO 126 I=MSTART,MSTOP
         F(I,2) = F(I,2)-A1*F(I,1)
  126 CONTINUE
      GO TO 129
  127 A1 = 2./DELTHT
      DO 128 I=MSTART,MSTOP
         F(I,1) = F(I,1)+A1*BDC(I)
  128 CONTINUE
  129 A1 = 1./DLTHSQ
      GO TO (134,130,132,132,130),NP
  130 DO 131 I=MSTART,MSTOP
         F(I,N) = F(I,N)-A1*F(I,NP1)
  131 CONTINUE
      GO TO 134
  132 A1 = 2./DELTHT
      DO 133 I=MSTART,MSTOP
         F(I,NP1) = F(I,NP1)-A1*BDD(I)
  133 CONTINUE
  134 CONTINUE
C
C     ADJUST RIGHT SIDE OF SINGULAR PROBLEMS TO INSURE EXISTENCE OF A
C     SOLUTION.
C
      PERTRB = 0.
      IF (ELMBDA) 146,136,135
  135 IERROR = 11
      GO TO 146
  136 W(ID5+1) = .5*(W(ID5+2)-DLRBY2)
      GO TO (146,146,138,146,146,137),MBDCND
  137 W(ID5+1) = .5*W(ID5+1)
  138 GO TO (140,146,146,139,146),NP
  139 A2 = 2.
      GO TO 141
  140 A2 = 1.
  141 K = ID5+MUNK
      W(K) = .5*(W(K-1)+DLRBY2)
      S = 0.
      DO 143 I=MSTART,MSTOP
         S1 = 0.
         NSP1 = NSTART+1
         NSTM1 = NSTOP-1
         DO 142 J=NSP1,NSTM1
            S1 = S1+F(I,J)
  142    CONTINUE
         K = I+L
         S = S+(A2*S1+F(I,NSTART)+F(I,NSTOP))*W(K)
  143 CONTINUE
      S2 = FLOAT(M)*A+(.75+FLOAT((M-1)*(M+1)))*DLRBY2
      IF (MBDCND .EQ. 3) S2 = S2+.25*DLRBY2
      S1 = (2.+A2*FLOAT(NUNK-2))*S2
      PERTRB = S/S1
      DO 145 I=MSTART,MSTOP
         DO 144 J=NSTART,NSTOP
            F(I,J) = F(I,J)-PERTRB
  144    CONTINUE
  145 CONTINUE
  146 CONTINUE
C
C     MULTIPLY I-TH EQUATION THROUGH BY DELTHT**2 TO PUT EQUATION INTO
C     CORRECT FORM FOR SUBROUTINE POIS.
C
      DO 148 I=MSTART,MSTOP
         K = I-MSTART+1
         J = ID1+K
         W(J) = W(J)*DLTHSQ
         J = ID2+K
         W(J) = W(J)*DLTHSQ
         J = ID3+K
         W(J) = W(J)*DLTHSQ
         DO 147 J=NSTART,NSTOP
            F(I,J) = F(I,J)*DLTHSQ
  147    CONTINUE
  148 CONTINUE
      NPEROD = NBDCND
      IF (NPEROD .NE. 4) GO TO 152
C
C     REVERSE COLUMNS SO THE DERIVATIVE SPECIFIED-SOLUTION SPECIFIED
C     BOUNDARY CONDITIONS BECOME SOLUTION SPECIFIED-DERIVATIVE SPECIFIED
C
      NPEROD = 2
      ID5 = 1
      K = N/2
  149 DO 151 J=1,K
         L = N+1-J
         DO 150 I=MSTART,MSTOP
            S = F(I,L)
            F(I,L) = F(I,J)
            F(I,J) = S
  150    CONTINUE
  151 CONTINUE
      GO TO (152,156),ID5
C
C     CALL POIS TO SOLVE THE SYSTEM OF EQUATIONS.
C
  152 CALL POIS (INTL,NPEROD,NUNK,MBDCND,MUNK,W(ID1+1),W(ID2+1),
     1           W(ID3+1),IDIMF,F(MSTART,NSTART),IERR1,W)
      GO TO (154,156,156,156,153),NP
  153 ID5 = 2
      GO TO 149
  154 DO 155 I=MSTART,MSTOP
         F(I,NP1) = F(I,1)
  155 CONTINUE
  156 CONTINUE
      RETURN
      END
      SUBROUTINE PWSSSP (INTL,TS,TF,M,MBDCND,BDTS,BDTF,PS,PF,N,NBDCND,  POI01387
     1                   BDPS,BDPF,ELMBDA,F,IDIMF,PERTRB,IERROR,W)
C
C
C***********************************************************************
C
C          VERSION  2  OCTOBER 1976  INCLUDING ERRATA  OCTOBER 1976
C
C         DOCUMENTATION FOR THIS PROGRAM IS GIVEN IN
C
C        EFFICIENT FORTRAN SUBPROGRAMS FOR THE SOLUTION OF
C            ELLIPTIC PARTIAL DIFFERENTIAL EQUATIONS
C
C                              BY
C
C          PAUL SWARZTRAUBER   AND  ROLAND SWEET
C
C             TECHNICAL NOTE TN/IA-109   JULY 1975
C
C       NATIONAL CENTER FOR ATMOSPHERIC RESEARCH  BOULDER,COLORADO 80307
C
C        WHICH IS SPONSORED BY THE NATIONAL SCIENCE FOUNDATION
C
C***********************************************************************
C
C
C
C     SUBROUTINE PWSSSP SOLVES A FINITE DIFFERENCE APPROXIMATION TO THE
C     HELMHOLTZ EQUATION IN SPHERICAL COORDINATES AND ON THE SURFACE OF
C     THE UNIT SPHERE (RADIUS OF 1):
C
C          (1/SIN(THETA))(D/DTHETA)(SIN(THETA)(D/DTHETA)U)
C
C             + (1/SIN(THETA)**2)(D/DPHI)(D/DPHI)U
C
C             + LAMBDA*U = F(THETA,PHI)
C
C     WHERE THETA IS COLATITUDE AND PHI IS LONGITUDE.
C
C     THE ARGUMENTS ARE DEFINED AS:
C
C
C     * * * * * * * * * *     ON INPUT     * * * * * * * * * *
C
C     INTL
C       = 0  ON INITIAL ENTRY TO PWSSSP OR IF N,NBDCND,PS OR PF ARE
C            CHANGED  FROM A PREVIOUS CALL
C       = 1  IF PS,PF,N AND NBDCND ARE UNCHANGED FROM A PREVIOUS CALL
C
C       NOTE:  A CALL WITH INTL = 1 IS ABOUT 1 PERCENT FASTER THAN A
C              CALL WITH INTL = 0  .
C
C     TS,TF
C       THE RANGE OF THETA (COLATITUDE), I.E., TS .LE. THETA .LE. TF.
C       TS MUST BE LESS THAN TF.  TS AND TF ARE IN RADIANS.  A TS OF
C       ZERO CORRESPONDS TO THE NORTH POLE AND A TF OF PI CORRESPONDS TO
C       THE SOUTH POLE.
C
C     M
C       THE NUMBER OF PANELS INTO WHICH THE INTERVAL (TS,TF) IS
C       SUBDIVIDED.  HENCE, THERE WILL BE M+1 GRID POINTS IN THE
C       THETA-DIRECTION GIVEN BY THETA(I) = (I-1)DTHETA+TS FOR
C       I = 1,2,...,M+1, WHERE DTHETA = (TF-TS)/M IS THE PANEL WIDTH.
C
C     MBDCND
C       INDICATES THE TYPE OF BOUNDARY CONDITION AT THETA = TS AND
C       THETA = TF.
C
C       = 1  IF THE SOLUTION IS SPECIFIED AT THETA = TS AND THETA = TF.
C       = 2  IF THE SOLUTION IS SPECIFIED AT THETA = TS AND THE
C            DERIVATIVE OF THE SOLUTION WITH RESPECT TO THETA IS
C            SPECIFIED AT THETA = TF (SEE NOTE 2 BELOW).
C       = 3  IF THE DERIVATIVE OF THE SOLUTION WITH RESPECT TO THETA IS
C            SPECIFIED AT THETA = TS AND THETA = TF (SEE NOTES 1,2
C            BELOW).
C       = 4  IF THE DERIVATIVE OF THE SOLUTION WITH RESPECT TO THETA IS
C            SPECIFIED AT THETA = TS (SEE NOTE 1 BELOW) AND THE
C            SOLUTION IS SPECIFIED AT THETA = TF.
C       = 5  IF THE SOLUTION IS UNSPECIFIED AT THETA = TS = 0 AND THE
C            SOLUTION IS SPECIFIED AT THETA = TF.
C       = 6  IF THE SOLUTION IS UNSPECIFIED AT THETA = TS = 0 AND THE
C            DERIVATIVE OF THE SOLUTION WITH RESPECT TO THETA IS
C            SPECIFIED AT THETA = TF (SEE NOTE 2 BELOW).
C       = 7  IF THE SOLUTION IS SPECIFIED AT THETA = TS AND THE
C            SOLUTION IS UNSPECIFIED AT THETA = TF = PI.
C       = 8  IF THE DERIVATIVE OF THE SOLUTION WITH RESPECT TO THETA IS
C            SPECIFIED AT THETA = TS (SEE NOTE 1 BELOW) AND THE
C            SOLUTION IS UNSPECIFIED AT THETA = TF = PI.
C       = 9  IF THE SOLUTION IS UNSPECIFIED AT THETA = TS = 0 AND
C            THETA = TF = PI.
C
C       NOTES:  1.  IF TS = 0, DO NOT USE MBDCND = 3,4, OR 8, BUT
C                   INSTEAD USE MBDCND = 5,6, OR 9  .
C               2.  IF TF = PI, DO NOT USE MBDCND = 2,3, OR 6, BUT
C                   INSTEAD USE MBDCND = 7,8, OR 9  .
C
C     BDTS
C       A ONE-DIMENSIONAL ARRAY OF LENGTH N+1 THAT SPECIFIES THE VALUES
C       OF THE DERIVATIVE OF 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)), J = 1,2,...,N+1  .
C
C       WHEN MBDCND HAS ANY OTHER VALUE, BDTS IS A DUMMY VARIABLE.
C
C     BDTF
C       A ONE-DIMENSIONAL ARRAY OF LENGTH N+1 THAT SPECIFIES THE VALUES
C       OF THE DERIVATIVE 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)), J = 1,2,...,N+1  .
C
C       WHEN MBDCND HAS ANY OTHER VALUE, BDTF IS A DUMMY VARIABLE.
C
C     PS,PF
C       THE RANGE OF PHI (LONGITUDE), I.E., PS .LE. PHI .LE. PF.  PS
C       MUST BE LESS THAN PF.  PS AND PF ARE IN RADIANS.  IF PS = 0 AND
C       PF = 2*PI, PERIODIC BOUNDARY CONDITIONS ARE USUALLY PRESCRIBED.
C
C     N
C       THE NUMBER OF PANELS INTO WHICH THE INTERVAL (PS,PF) IS
C       SUBDIVIDED.  HENCE, THERE WILL BE N+1 GRID POINTS IN THE
C       PHI-DIRECTION GIVEN BY PHI(J) = (J-1)DPHI+PS  FOR
C       J = 1,2,...,N+1, WHERE DPHI = (PF-PS)/N IS THE PANEL WIDTH.  N
C       MUST BE OF THE FORM (2**P)(3**Q)(5**R) WHERE P, Q, AND R ARE ANY
C       NON-NEGATIVE INTEGERS.  N MUST BE GREATER THAN 2  .
C
C     NBDCND
C       INDICATES THE TYPE OF BOUNDARY CONDITION AT PHI = PS AND
C       PHI = PF.
C
C       = 0  IF THE SOLUTION IS PERIODIC IN PHI, I.E.,
C            U(I,1) = U(I,N+1).
C       = 1  IF THE SOLUTION IS SPECIFIED AT PHI = PS AND PHI = PF
C            (SEE NOTE BELOW).
C       = 2  IF THE SOLUTION IS SPECIFIED AT PHI = PS (SEE NOTE BELOW)
C            AND THE DERIVATIVE OF THE SOLUTION WITH RESPECT TO PHI IS
C            SPECIFIED AT PHI = PF.
C       = 3  IF THE DERIVATIVE OF THE SOLUTION WITH RESPECT TO PHI IS
C            SPECIFIED AT PHI = PS AND PHI = PF.
C       = 4  IF THE DERIVATIVE OF THE SOLUTION WITH RESPECT TO PHI IS
C            SPECIFIED AT PS AND THE SOLUTION IS SPECIFIED AT PHI = PF
C            (SEE NOTE BELOW).
C
C       NOTE:  NBDCND = 1,2, OR 4 CANNOT BE USED WITH
C              MBDCND = 5,6,7,8, OR 9 (THE FORMER INDICATES THAT THE
C                       SOLUTION IS SPECIFIED AT A POLE, THE LATTER
C                       INDICATES THAT THE SOLUTION IS UNSPECIFIED).
C                       USE INSTEAD
C              MBDCND = 1 OR 2  .
C
C     BDPS
C       A ONE-DIMENSIONAL ARRAY OF LENGTH M+1 THAT SPECIFIES THE VALUES
C       OF THE DERIVATIVE 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), I = 1,2,...,M+1  .
C
C       WHEN NBDCND HAS ANY OTHER VALUE, BDPS IS A DUMMY VARIABLE.
C
C     BDPF
C       A ONE-DIMENSIONAL ARRAY OF LENGTH M+1 THAT SPECIFIES THE VALUES
C       OF THE DERIVATIVE 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), I = 1,2,...,M+1  .
C
C       WHEN NBDCND HAS ANY OTHER VALUE, BDPF IS A DUMMY VARIABLE.
C
C     ELMBDA
C       THE CONSTANT LAMBDA IN THE HELMHOLTZ EQUATION.  IF
C       LAMBDA .GT. 0, A SOLUTION MAY NOT EXIST.  HOWEVER, PWSSSP WILL
C       ATTEMPT TO FIND A SOLUTION.
C
C     F
C       A TWO-DIMENSIONAL ARRAY THAT SPECIFIES THE VALUE OF THE RIGHT
C       SIDE OF THE HELMHOLTZ EQUATION AND BOUNDARY VALUES (IF ANY).
C       FOR I = 2,3,...,M  AND  J = 2,3,...,N
C
C            F(I,J) = F(THETA(I),PHI(J)).
C
C       ON THE BOUNDARIES F IS DEFINED BY
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))   J = 1,2,...,N+1
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)   I = 1,2,...,M+1
C              3      F(THETA(I),PS)    F(THETA(I),PF)
C              4      F(THETA(I),PS)    U(THETA(I),PF)
C
C       F MUST BE DIMENSIONED AT LEAST (M+1)*(N+1).
C
C       NOTE
C
C       IF THE TABLE CALLS FOR BOTH THE SOLUTION U AND THE RIGHT SIDE F
C       AT  A CORNER THEN THE SOLUTION MUST BE SPECIFIED.
C
C     IDIMF
C       THE ROW (OR FIRST) DIMENSION OF THE ARRAY F AS IT APPEARS IN THE
C       PROGRAM CALLING PWSSSP.  THIS PARAMETER IS USED TO SPECIFY THE
C       VARIABLE DIMENSION OF F.  IDIMF MUST BE AT LEAST M+1  .
C
C     W
C       A ONE-DIMENSIONAL ARRAY THAT MUST BE PROVIDED BY THE USER FOR
C       WORK SPACE.  THE LENGTH OF W MUST BE AT LEAST 11(M+1)+6(N+1).
C
C
C     * * * * * * * * * *     ON OUTPUT     * * * * * * * * * *
C
C     F
C       CONTAINS THE SOLUTION U(I,J) OF THE FINITE DIFFERENCE
C       APPROXIMATION FOR THE GRID POINT (THETA(I),PHI(J)),
C       I = 1,2,...,M+1,   J = 1,2,...,N+1  .
C
C     PERTRB
C       IF ONE SPECIFIES A COMBINATION OF PERIODIC, DERIVATIVE OR
C       UNSPECIFIED BOUNDARY CONDITIONS FOR A POISSON EQUATION
C       (LAMBDA = 0), A SOLUTION MAY NOT EXIST.  PERTRB IS A CONSTANT,
C       CALCULATED AND SUBTRACTED FROM F, WHICH ENSURES THAT A SOLUTION
C       EXISTS.  PWSSSP THEN COMPUTES THIS SOLUTION, WHICH IS A LEAST
C       SQUARES SOLUTION TO THE ORIGINAL APPROXIMATION.  THIS SOLUTION
C       IS NOT UNIQUE AND IS UNNORMALIZED. THE VALUE OF PERTRB SHOULD
C       BE SMALL COMPARED TO THE RIGHT SIDE F. OTHERWISE , A SOLUTION
C       IS OBTAINED TO AN ESSENTIALLY DIFFERENT PROBLEM. THIS COMPARISON
C       SHOULD ALWAYS BE MADE TO INSURE THAT A MEANINGFUL SOLUTION HAS
C       BEEN OBTAINED
C
C     IERROR
C       AN ERROR FLAG THAT INDICATES INVALID INPUT PARAMETERS.  EXCEPT
C       FOR NUMBERS 0 AND 8, 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 .GE. PF.
C       = 5  N IS NOT OF THE FORM (2**P)(3**Q)(5**R) OR N .LE. 2  .
C       = 6  NBDCND .LT. 0 OR NBDCND .GT. 4  .
C       = 7  AN NBDCND OF 1,2, OR 4 IS USED WITH AN
C            MBDCND OF 5,6,7,8, OR 9  .
C       = 8  ELMBDA .GT. 0  .
C       = 9  IDIMF .LT. M+1  .
C       = 10 TS=0 AND MBDCND=3,4 OR 8  OR  TF=PI AND MBDCND=2,3 OR 6
C
C       SINCE THIS IS THE ONLY MEANS OF INDICATING A POSSIBLY INCORRECT
C       CALL TO PWSSSP, THE USER SHOULD TEST IERROR AFTER A CALL.
C
C     W
C       CONTAINS INTERMEDIATE VALUES THAT MUST NOT BE DESTROYED IF
C       PWSSSP WILL BE CALLED AGAIN WITH INTL = 1  .
C
C
C
      DIMENSION       F(IDIMF,1) ,BDTS(1)    ,BDTF(1)    ,BDPS(1)    ,
     1                BDPF(1)    ,W(1)
      NBR = NBDCND+1
      PI = 3.14159265358979
      EPS = APXEPS(DUM)
      IERROR = 9
      IF (IDIMF-M) 119,119,101
  101 IERROR = 1
      IF (TS) 119,102,102
  102 IF (PI-TF+EPS) 119,119,103
  103 IERROR = 2
      IF (TF-TS) 119,119,104
  104 IERROR = 3
      IF (MBDCND) 119,119,105
  105 IF (MBDCND-9) 106,106,119
  106 IERROR = 4
      IF (PF-PS) 119,119,107
  107 IERROR = 5
      IF (NCHECK(N)-2) 108,119,108
  108 IERROR = 6
      IF (NBDCND) 119,109,109
  109 IF (NBDCND-4) 110,110,119
  110 IERROR = 7
      IF (MBDCND-4) 112,112,111
  111 GO TO (112,119,119,112,119),NBR
  112 IERROR = 8
      IF (ELMBDA) 113,113,118
  113 IERROR = 10
      IF (TS) 114,114,115
  114 GO TO (115,115,118,118,115,115,115,118,115),MBDCND
  115 IF (PI-TF-EPS) 116,116,117
  116 GO TO (117,118,118,117,117,118,117,117,117),MBDCND
  117 IERROR = 0
  118 MP1 = M+1
      IW1 = 6*(N+1)+5*MP1+1
      IW2 = IW1+MP1
      IW3 = IW2+MP1
      IW4 = IW3+MP1
      IW5 = IW4+MP1
      IW6 = IW5+MP1
      CALL PWSSS1 (INTL,TS,TF,M,MBDCND,BDTS,BDTF,PS,PF,N,NBDCND,BDPS,
     1             BDPF,ELMBDA,F,IDIMF,PERTRB,W(IW1),W(IW2),W(IW3),
     2             W(IW4),W(IW5),W(IW6),W)
  119 RETURN
      END
      SUBROUTINE PWSSS1 (INTL,TS,TF,M,MBDCND,BDTS,BDTF,PS,PF,N,NBDCND,  POI01701
     1                   BDPS,BDPF,ELMBDA,F,IDIMF,PERTRB,AM,BM,CM,SN,
     2                   SS,SINT,D)
      DIMENSION       F(IDIMF,1) ,BDTS(1)    ,BDTF(1)    ,BDPS(1)    ,
     1                BDPF(1)    ,AM(1)      ,BM(1)      ,CM(1)      ,
     2                SS(1)      ,SN(1)      ,D(1)       ,SINT(1)
C
C     MACHINE DEPENDENT CONSTANT
C
C     PI=3.1415926535897932384626433832795028841971693993751058209749446
C
      PI = 3.14159265358979
      TPI = PI+PI
      HPI = PI/2.
      MP1 = M+1
      NP1 = N+1
      FN = N
      FM = M
      DTH = (TF-TS)/FM
      HDTH = DTH/2.
      TDT = DTH+DTH
      DPHI = (PF-PS)/FN
      TDP = DPHI+DPHI
      DPHI2 = DPHI*DPHI
      EDP2 = ELMBDA*DPHI2
      DTH2 = DTH*DTH
      CP = 4./(FN*DTH2)
      WP = FN*SIN(HDTH)/4.
      DO 102 I=1,MP1
         FIM1 = I-1
         THETA = FIM1*DTH+TS
         SINT(I) = SIN(THETA)
         IF (SINT(I)) 101,102,101
  101    T1 = 1./(DTH2*SINT(I))
         AM(I) = T1*SIN(THETA-HDTH)
         CM(I) = T1*SIN(THETA+HDTH)
         BM(I) = -AM(I)-CM(I)+ELMBDA
  102 CONTINUE
      INP = 0
      ISP = 0
C
C BOUNDARY CONDITION AT THETA=TS
C
      MBR = MBDCND+1
      GO TO (103,104,104,105,105,106,106,104,105,106),MBR
  103 ITS = 1
      GO TO 107
  104 AT = AM(2)
      ITS = 2
      GO TO 107
  105 AT = AM(1)
      ITS = 1
      CM(1) = AM(1)+CM(1)
      GO TO 107
  106 AT = AM(2)
      INP = 1
      ITS = 2
C
C BOUNDARY CONDITION THETA=TF
C
  107 GO TO (108,109,110,110,109,109,110,111,111,111),MBR
  108 ITF = M
      GO TO 112
  109 CT = CM(M)
      ITF = M
      GO TO 112
  110 CT = CM(M+1)
      AM(M+1) = AM(M+1)+CM(M+1)
      ITF = M+1
      GO TO 112
  111 ITF = M
      ISP = 1
      CT = CM(M)
C
C COMPUTE HOMOGENEOUS SOLUTION WITH SOLUTION AT POLE EQUAL TO ONE
C
  112 ITSP = ITS+1
      ITFM = ITF-1
      WTS = SINT(ITS+1)*AM(ITS+1)/CM(ITS)
      WTF = SINT(ITF-1)*CM(ITF-1)/AM(ITF)
      MUNK = ITF-ITS+1
      IF (ISP) 116,116,113
  113 D(ITS) = CM(ITS)/BM(ITS)
      DO 114 I=ITSP,M
         D(I) = CM(I)/(BM(I)-AM(I)*D(I-1))
  114 CONTINUE
      SS(M) = -D(M)
      IID = M-ITS
      DO 115 II=1,IID
         I = M-II
         SS(I) = -D(I)*SS(I+1)
  115 CONTINUE
      SS(M+1) = 1.
  116 IF (INP) 120,120,117
  117 SN(1) = 1.
      D(ITF) = AM(ITF)/BM(ITF)
      IID = ITF-2
      DO 118 II=1,IID
         I = ITF-II
         D(I) = AM(I)/(BM(I)-CM(I)*D(I+1))
  118 CONTINUE
      SN(2) = -D(2)
      DO 119 I=3,ITF
         SN(I) = -D(I)*SN(I-1)
  119 CONTINUE
C
C BOUNDARY CONDITIONS AT PHI=PS
C
  120 NBR = NBDCND+1
      WPS = 1.
      WPF = 1.
      GO TO (121,122,122,123,123),NBR
  121 JPS = 1
      GO TO 124
  122 JPS = 2
      GO TO 124
  123 JPS = 1
      WPS = .5
C
C BOUNDARY CONDITION AT PHI=PF
C
  124 GO TO (125,126,127,127,126),NBR
  125 JPF = N
      GO TO 128
  126 JPF = N
      GO TO 128
  127 WPF = .5
      JPF = N+1
  128 JPSP = JPS+1
      JPFM = JPF-1
      NUNK = JPF-JPS+1
      FJJ = JPFM-JPSP+1
C
C SCALE COEFFICIENTS FOR SUBROUTINE POIS
C
      DO 129 I=ITS,ITF
         CF = DPHI2*SINT(I)*SINT(I)
         AM(I) = CF*AM(I)
         BM(I) = CF*BM(I)
         CM(I) = CF*CM(I)
  129 CONTINUE
      ISING = 0
      GO TO (130,138,138,130,138,138,130,138,130,130),MBR
  130 GO TO (131,138,138,131,138),NBR
  131 IF (ELMBDA) 138,132,132
  132 ISING = 1
      SUM = WTS*WPS+WTS*WPF+WTF*WPS+WTF*WPF
      IF (INP) 134,134,133
  133 SUM = SUM+WP
  134 IF (ISP) 136,136,135
  135 SUM = SUM+WP
  136 SUM1 = 0.
      DO 137 I=ITSP,ITFM
         SUM1 = SUM1+SINT(I)
  137 CONTINUE
      SUM = SUM+FJJ*(SUM1+WTS+WTF)
      SUM = SUM+(WPS+WPF)*SUM1
      HNE = SUM
  138 GO TO (146,142,142,144,144,139,139,142,144,139),MBR
  139 IF (NBDCND-3) 146,140,146
  140 YHLD = F(1,JPS)-4./(FN*DPHI*DTH2)*(BDPF(2)-BDPS(2))
      DO 141 J=1,NP1
         F(1,J) = YHLD
  141 CONTINUE
      GO TO 146
  142 DO 143 J=JPS,JPF
         F(2,J) = F(2,J)-AT*F(1,J)
  143 CONTINUE
      GO TO 146
  144 DO 145 J=JPS,JPF
         F(1,J) = F(1,J)+TDT*BDTS(J)*AT
  145 CONTINUE
  146 GO TO (154,150,152,152,150,150,152,147,147,147),MBR
  147 IF (NBDCND-3) 154,148,154
  148 YHLD = F(M+1,JPS)-4./(FN*DPHI*DTH2)*(BDPF(M)-BDPS(M))
      DO 149 J=1,NP1
         F(M+1,J) = YHLD
  149 CONTINUE
      GO TO 154
  150 DO 151 J=JPS,JPF
         F(M,J) = F(M,J)-CT*F(M+1,J)
  151 CONTINUE
      GO TO 154
  152 DO 153 J=JPS,JPF
         F(M+1,J) = F(M+1,J)-TDT*BDTF(J)*CT
  153 CONTINUE
  154 GO TO (159,155,155,157,157),NBR
  155 DO 156 I=ITS,ITF
         F(I,2) = F(I,2)-F(I,1)/(DPHI2*SINT(I)*SINT(I))
  156 CONTINUE
      GO TO 159
  157 DO 158 I=ITS,ITF
         F(I,1) = F(I,1)+TDP*BDPS(I)/(DPHI2*SINT(I)*SINT(I))
  158 CONTINUE
  159 GO TO (164,160,162,162,160),NBR
  160 DO 161 I=ITS,ITF
         F(I,N) = F(I,N)-F(I,N+1)/(DPHI2*SINT(I)*SINT(I))
  161 CONTINUE
      GO TO 164
  162 DO 163 I=ITS,ITF
         F(I,N+1) = F(I,N+1)-TDP*BDPF(I)/(DPHI2*SINT(I)*SINT(I))
  163 CONTINUE
  164 CONTINUE
      PERTRB = 0.
      IF (ISING) 165,176,165
  165 SUM = WTS*WPS*F(ITS,JPS)+WTS*WPF*F(ITS,JPF)+WTF*WPS*F(ITF,JPS)+
     1      WTF*WPF*F(ITF,JPF)
      IF (INP) 167,167,166
  166 SUM = SUM+WP*F(1,JPS)
  167 IF (ISP) 169,169,168
  168 SUM = SUM+WP*F(M+1,JPS)
  169 DO 171 I=ITSP,ITFM
         SUM1 = 0.
         DO 170 J=JPSP,JPFM
            SUM1 = SUM1+F(I,J)
  170    CONTINUE
         SUM = SUM+SINT(I)*SUM1
  171 CONTINUE
      SUM1 = 0.
      SUM2 = 0.
      DO 172 J=JPSP,JPFM
         SUM1 = SUM1+F(ITS,J)
         SUM2 = SUM2+F(ITF,J)
  172 CONTINUE
      SUM = SUM+WTS*SUM1+WTF*SUM2
      SUM1 = 0.
      SUM2 = 0.
      DO 173 I=ITSP,ITFM
         SUM1 = SUM1+SINT(I)*F(I,JPS)
         SUM2 = SUM2+SINT(I)*F(I,JPF)
  173 CONTINUE
      SUM = SUM+WPS*SUM1+WPF*SUM2
      PERTRB = SUM/HNE
      DO 175 J=1,NP1
         DO 174 I=1,MP1
            F(I,J) = F(I,J)-PERTRB
  174    CONTINUE
  175 CONTINUE
C
C SCALE RIGHT SIDE FOR SUBROUTINE POIS
C
  176 DO 178 I=ITS,ITF
         CF = DPHI2*SINT(I)*SINT(I)
         DO 177 J=JPS,JPF
            F(I,J) = CF*F(I,J)
  177    CONTINUE
  178 CONTINUE
      NBDC = NBDCND
      IF (NBDCND-4) 182,179,182
  179 JFN = NUNK/2
      DO 181 J=1,JFN
         JFRD = J+JPS-1
         JBRD = JPF-J+1
         DO 180 I=ITS,ITF
            HLD = F(I,JFRD)
            F(I,JFRD) = F(I,JBRD)
            F(I,JBRD) = HLD
  180    CONTINUE
  181 CONTINUE
      NBDC = 2
  182 CALL POIS (INTL,NBDC,NUNK,MBDCND,MUNK,AM(ITS),BM(ITS),CM(ITS),
     1           IDIMF,F(ITS,JPS),IERROR,D)
      IF (NBDCND-4) 186,183,186
  183 DO 185 J=1,JFN
         JFRD = J+JPS-1
         JBRD = JPF-J+1
         DO 184 I=ITS,ITF
            HLD = F(I,JFRD)
            F(I,JFRD) = F(I,JBRD)
            F(I,JBRD) = HLD
  184    CONTINUE
  185 CONTINUE
  186 IF (ISING) 194,194,187
  187 IF (INP) 191,191,188
  188 IF (ISP) 189,189,194
  189 DO 190 J=1,NP1
         F(1,J) = 0.
  190 CONTINUE
      GO TO 217
  191 IF (ISP) 194,194,192
  192 DO 193 J=1,NP1
         F(M+1,J) = 0.
  193 CONTINUE
      GO TO 217
  194 IF (INP) 201,201,195
  195 SUM = WPS*F(ITS,JPS)+WPF*F(ITS,JPF)
      DO 196 J=JPSP,JPFM
         SUM = SUM+F(ITS,J)
  196 CONTINUE
      DFN = CP*SUM
      DNN = CP*((WPS+WPF+FJJ)*(SN(2)-1.))+ELMBDA
      DSN = CP*(WPS+WPF+FJJ)*SN(M)
      IF (ISP) 197,197,202
  197 CNP = (F(1,1)-DFN)/DNN
      DO 199 I=ITS,ITF
         HLD = CNP*SN(I)
         DO 198 J=JPS,JPF
            F(I,J) = F(I,J)+HLD
  198    CONTINUE
  199 CONTINUE
      DO 200 J=1,NP1
         F(1,J) = CNP
  200 CONTINUE
      GO TO 217
  201 IF (ISP) 217,217,202
  202 SUM = WPS*F(ITF,JPS)+WPF*F(ITF,JPF)
      DO 203 J=JPSP,JPFM
         SUM = SUM+F(ITF,J)
  203 CONTINUE
      DFS = CP*SUM
      DSS = CP*((WPS+WPF+FJJ)*(SS(M)-1.))+ELMBDA
      DNS = CP*(WPS+WPF+FJJ)*SS(2)
      IF (INP) 204,204,208
  204 CSP = (F(M+1,1)-DFS)/DSS
      DO 206 I=ITS,ITF
         HLD = CSP*SS(I)
         DO 205 J=JPS,JPF
            F(I,J) = F(I,J)+HLD
  205    CONTINUE
  206 CONTINUE
      DO 207 J=1,NP1
         F(M+1,J) = CSP
  207 CONTINUE
      GO TO 217
  208 RTN = F(1,1)-DFN
      RTS = F(M+1,1)-DFS
      IF (ISING) 210,210,209
  209 CSP = 0.
      CNP = RTN/DNN
      GO TO 213
  210 IF (ABS(DNN)-ABS(DSN)) 212,212,211
  211 DEN = DSS-DNS*DSN/DNN
      RTS = RTS-RTN*DSN/DNN
      CSP = RTS/DEN
      CNP = (RTN-CSP*DNS)/DNN
      GO TO 213
  212 DEN = DNS-DSS*DNN/DSN
      RTN = RTN-RTS*DNN/DSN
      CSP = RTN/DEN
      CNP = (RTS-DSS*CSP)/DSN
  213 DO 215 I=ITS,ITF
         HLD = CNP*SN(I)+CSP*SS(I)
         DO 214 J=JPS,JPF
            F(I,J) = F(I,J)+HLD
  214    CONTINUE
  215 CONTINUE
      DO 216 J=1,NP1
         F(1,J) = CNP
         F(M+1,J) = CSP
  216 CONTINUE
  217 IF (NBDCND) 220,218,220
  218 DO 219 I=1,MP1
         F(I,JPF+1) = F(I,JPS)
  219 CONTINUE
  220 RETURN
      END
      SUBROUTINE PWSCSP (INTL,TS,TF,M,MBDCND,BDTS,BDTF,RS,RF,N,NBDCND,  POI02058
     1                   BDRS,BDRF,ELMBDA,F,IDIMF,PERTRB,IERROR,W)
C
C
C***********************************************************************
C
C          VERSION  2  OCTOBER 1976  INCLUDING ERRATA  OCTOBER 1976
C
C         DOCUMENTATION FOR THIS PROGRAM IS GIVEN IN
C
C        EFFICIENT FORTRAN SUBPROGRAMS FOR THE SOLUTION OF
C            ELLIPTIC PARTIAL DIFFERENTIAL EQUATIONS
C
C                              BY
C
C          PAUL SWARZTRAUBER   AND  ROLAND SWEET
C
C             TECHNICAL NOTE TN/IA-109   JULY 1975
C
C       NATIONAL CENTER FOR ATMOSPHERIC RESEARCH  BOULDER,COLORADO 80307
C
C        WHICH IS SPONSORED BY THE NATIONAL SCIENCE FOUNDATION
C
C***********************************************************************
C
C
C
C     SUBROUTINE PWSCSP SOLVES A FINITE DIFFERENCE APPROXIMATION TO THE
C       MODIFIED HELMHOLTZ EQUATION IN SPHERICAL COORDINATES ASSUMING
C       AXISYMMETRY  (NO DEPENDENCE ON LONGITUDE)
C
C          (1/R**2)(D/DR)((R**2)(D/DR)U)
C
C             + (1/(R**2)SIN(THETA))(D/DTHETA)(SIN(THETA)(D/DTHETA)U)
C
C             + (LAMBDA/(RSIN(THETA))**2)U = F(THETA,R).
C     THIS TWO DIMENSIONAL MODIFIED HELMHOLTZ EQUATION RESULTS FROM
C     THE FOURIER TRANSFORM OF THE THREE DIMENSIONAL POISSON EQUATION
C
C
C     * * * * * * * * * *     ON INPUT     * * * * * * * * * *
C
C     INTL
C       = 0  ON INITIAL ENTRY TO PWSCSP OR IF ANY OF THE ARGUMENTS
C            RS, RF, N, NBDCND ARE CHANGED FROM A PREVIOUS CALL.
C       = 1  IF RS, RF, N, NBDCND ARE ALL UNCHANGED FROM PREVIOUS CALL
C            TO PWSCSP.
C
C       NOTE   A CALL WITH INTL=0 TAKES APPROXIMATELY 1.5 TIMES AS
C              MUCH TIME AS A CALL WITH INTL = 1  .  ONCE A CALL WITH
C              INTL = 0 HAS BEEN MADE THEN SUBSEQUENT SOLUTIONS
C              CORRESPONDING TO DIFFERENT F, BDTS, BDTF, BDRS, BDRF CAN
C              BE OBTAINED FASTER WITH INTL = 1 SINCE INITIALIZATION IS
C              NOT REPEATED.
C
C     TS,TF
C       THE RANGE OF THETA (COLATITUDE), I.E., TS .LE. THETA .LE. TF.
C       TS MUST BE LESS THAN TF.  TS AND TF ARE IN RADIANS.  A TS OF
C       ZERO CORRESPONDS TO THE NORTH POLE AND A TF OF PI CORRESPONDS
C       TO THE SOUTH POLE.
C     M
C       THE NUMBER OF PANELS INTO WHICH THE INTERVAL (TS,TF) IS
C       SUBDIVIDED.  HENCE, THERE WILL BE M+1 GRID POINTS IN THE
C       THETA-DIRECTION GIVEN BY THETA(K) = (I-1)DTHETA+TS FOR
C       I = 1,2,...,M+1, WHERE DTHETA = (TF-TS)/M IS THE PANEL WIDTH.
C
C     MBDCND
C       INDICATES THE TYPE OF BOUNDARY CONDITION AT THETA = TS AND
C       THETA = TF.
C
C       = 1  IF THE SOLUTION IS SPECIFIED AT THETA = TS AND THETA = TF.
C       = 2  IF THE SOLUTION IS SPECIFIED AT THETA = TS AND THE
C            DERIVATIVE OF THE SOLUTION WITH RESPECT TO THETA IS
C            SPECIFIED AT THETA = TF (SEE NOTE 2 BELOW).
C       = 3  IF THE DERIVATIVE OF THE SOLUTION WITH RESPECT TO THETA IS
C            SPECIFIED AT THETA = TS AND THETA = TF (SEE NOTES 1,2
C            BELOW).
C       = 4  IF THE DERIVATIVE OF THE SOLUTION WITH RESPECT TO THETA IS
C            SPECIFIED AT THETA = TS (SEE NOTE 1 BELOW) AND THE
C            SOLUTION IS SPECIFIED AT THETA = TF.
C       = 5  IF THE SOLUTION IS UNSPECIFIED AT THETA = TS = 0 AND THE
C            SOLUTION IS SPECIFIED AT THETA = TF.
C       = 6  IF THE SOLUTION IS UNSPECIFIED AT THETA = TS = 0 AND THE
C            DERIVATIVE OF THE SOLUTION WITH RESPECT TO THETA IS
C            SPECIFIED AT THETA = TF (SEE NOTE 2 BELOW).
C       = 7  IF THE SOLUTION IS SPECIFIED AT THETA = TS AND THE
C            SOLUTION IS UNSPECIFIED AT THETA = TF = PI.
C       = 8  IF THE DERIVATIVE OF THE SOLUTION WITH RESPECT TO THETA IS
C            SPECIFIED AT THETA = TS (SEE NOTE 1 BELOW) AND THE SOLUTION
C            IS UNSPECIFIED AT THETA = TF = PI.
C       = 9  IF THE SOLUTION IS UNSPECIFIED AT THETA = TS = 0 AND
C            THETA = TF = PI.
C
C       NOTES:  1.  IF TS = 0, DO NOT USE MBDCND = 3,4, OR 8, BUT
C                   INSTEAD USE MBDCND = 5,6, OR 9  .
C               2.  IF TF = PI, DO NOT USE MBDCND = 2,3, OR 6, BUT
C                   INSTEAD USE MBDCND = 7,8, OR 9  .
C
C     BDTS
C       A ONE-DIMENSIONAL ARRAY OF LENGTH N+1 THAT SPECIFIES THE VALUES
C       OF THE DERIVATIVE OF 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)), J = 1,2,...,N+1  .
C
C       WHEN MBDCND HAS ANY OTHER VALUE, BDTS IS A DUMMY VARIABLE.
C
C     BDTF
C       A ONE-DIMENSIONAL ARRAY OF LENGTH N+1 THAT SPECIFIES THE VALUES
C       OF THE DERIVATIVE 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,R(J)), J = 1,2,...,N+1  .
C
C       WHEN MBDCND HAS ANY OTHER VALUE, BDTF IS A DUMMY VARIABLE.
C
C     RS,RF
C       THE RANGE OF R, I.E., RS .LE. R .LT. RF.  RS MUST BE LESS THAN
C       RF.  RS MUST BE NON-NEGATIVE.
C
C       N
C       THE NUMBER OF PANELS INTO WHICH THE INTERVAL (RS,RF) IS
C       SUBDIVIDED.  HENCE, THERE WILL BE N+1 GRID POINTS IN THE
C       R-DIRECTION GIVEN BY R(J) = (J-1)DR+RS FOR J = 1,2,...,N+1,
C       WHERE DR = (RF-RS)/N IS THE PANEL WIDTH.  LET K BE AN INTEGER
C       GREATER THAN ONE, THEN N MUST HAVE THE FOLLOWING FORM DEPENDING
C       ON NBDCND (SEE BELOW).
C
C            IF NBDCND = 2,4, OR 6, N MUST HAVE THE FORM 2**K-1  .
C            IF NBDCND = 1 OR 5, N MUST HAVE THE FORM 2**K.
C            IF NBDCND = 3, N MUST HAVE THE FORM 2**K-2  .
C
C     NBDCND
C       INDICATES THE TYPE OF BOUNDARY CONDITION AT R = RS AND R = RF.
C
C       = 1  IF THE SOLUTION IS SPECIFIED AT R = RS AND R = RF.
C       = 2  IF THE SOLUTION IS SPECIFIED AT R = RS AND THE DERIVATIVE
C            OF THE SOLUTION WITH RESPECT TO R IS SPECIFIED AT R = RF.
C       = 3  IF THE DERIVATIVE OF THE SOLUTION WITH RESPECT TO R IS
C            SPECIFIED AT R = RS AND R = RF.
C       = 4  IF THE DERIVATIVE OF THE SOLUTION WITH RESPECT TO R IS
C            SPECIFIED AT RS AND THE SOLUTION IS SPECIFIED AT R = RF.
C       = 5  IF THE SOLUTION IS UNSPECIFIED AT R = RS = 0 (SEE NOTE
C            BELOW) AND THE SOLUTION IS SPECIFIED AT R = RF.
C       = 6  IF THE SOLUTION IS UNSPECIFIED AT R = RS = 0 (SEE NOTE
C            BELOW) AND THE DERIVATIVE OF THE SOLUTION WITH RESPECT TO
C            R IS SPECIFIED AT R = RF.
C
C       NOTE:  NBDCND = 5 OR 6 CANNOT BE USED WITH
C              MBDCND = 1,2,4,5, OR 7 (THE FORMER INDICATES THAT THE
C                       SOLUTION IS UNSPECIFIED AT R = 0, THE LATTER
C                       INDICATES THAT THE SOLUTION IS SPECIFIED).
C                       USE INSTEAD
C              NBDCND = 1 OR 2  .
C
C     BDRS
C       A ONE-DIMENSIONAL ARRAY OF LENGTH M+1 THAT SPECIFIES THE VALUES
C       OF THE DERIVATIVE OF THE SOLUTION WITH RESPECT TO R AT R = RS.
C       WHEN NBDCND = 3 OR 4,
C
C            BDRS(I) = (D/DR)U(THETA(I),RS), I = 1,2,...,M+1  .
C
C       WHEN NBDCND HAS ANY OTHER VALUE, BDRS IS A DUMMY VARIABLE.
C
C     BDRF
C       A ONE-DIMENSIONAL ARRAY OF LENGTH M+1 THAT SPECIFIES THE VALUES
C       OF THE DERIVATIVE OF THE SOLUTION WITH RESPECT TO R AT R = RF.
C       WHEN NBDCND = 2,3, OR 6,
C
C            BDRF(I) = (D/DR)U(THETA(I),RF), I = 1,2,...,M+1  .
C
C       WHEN NBDCND HAS ANY OTHER VALUE, BDRF IS A DUMMY VARIABLE.
C
C     ELMBDA
C       THE CONSTANT LAMBDA IN THE HELMHOLTZ EQUATION.  IF
C       LAMBDA .GT. 0, A SOLUTION MAY NOT EXIST.  HOWEVER, PWSCSP WILL
C       ATTEMPT TO FIND A SOLUTION.  IF NBDCND = 5 OR 6 OR
C       MBDCND = 5,6,7,8, OR 9, ELMBDA MUST BE ZERO.
C
C     F
C       A TWO-DIMENSIONAL ARRAY THAT SPECIFIES THE VALUE OF THE RIGHT
C       SIDE OF THE HELMHOLTZ EQUATION AND BOUNDARY VALUES (IF ANY).
C       FOR I = 2,3,...,M AND J = 2,3,...,N
C
C            F(I,J) = F(THETA(I),R(J)).
C
C       ON THE BOUNDARIES F IS DEFINED BY
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))   J = 1,2,...,N+1
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)   I = 1,2,...,M+1
C              5      F(TS,0)           U(THETA(I),RF)
C              6      F(TS,0)           F(THETA(I),RF)
C
C       F MUST BE DIMENSIONED AT LEAST (M+1)*(N+1).
C
C       NOTE
C
C       IF THE TABLE CALLS FOR BOTH THE SOLUTION U AND THE RIGHT SIDE F
C       AT  A CORNER THEN THE SOLUTION MUST BE SPECIFIED.
C
C     IDIMF
C       THE ROW (OR FIRST) DIMENSION OF THE ARRAY F AS IT APPEARS IN THE
C       PROGRAM CALLING PWSCSP.  THIS PARAMETER IS USED TO SPECIFY THE
C       VARIABLE DIMENSION OF F.  IDIMF MUST BE AT LEAST M+1  .
C
C     W
C       A ONE-DIMENSIONAL ARRAY THAT MUST BE PROVIDED BY THE USER FOR
C       WORK SPACE.  LET L = 2**K (SEE THE DEFINITION OF N).  THEN THE
C       LENGTH OF W MUST BE AT LEAST
C
C                    2(L+1)(K-1)+6(M+N)+MAX(4N,6M)+14
C
C
C     * * * * * * * * * *     ON OUTPUT     * * * * * * * * * *
C
C     F
C       CONTAINS THE SOLUTION U(I,J) OF THE FINITE DIFFERENCE
C       APPROXIMATION FOR THE GRID POINT (THETA(I),R(J)),
C       I = 1,2,...,M+1,   J = 1,2,...,N+1  .
C
C     PERTRB
C       IF A COMBINATION OF PERIODIC OR DERIVATIVE BOUNDARY CONDITIONS
C       IS SPECIFIED FOR A POISSON EQUATION (LAMBDA = 0), A SOLUTION MAY
C       NOT EXIST.  PERTRB IS A CONSTANT, CALCULATED AND SUBTRACTED FROM
C       F, WHICH ENSURES THAT A SOLUTION EXISTS.  PWSCSP THEN COMPUTES
C       THIS SOLUTION, WHICH IS A LEAST SQUARES SOLUTION TO THE ORIGINAL
C       APPROXIMATION. THIS SOLUTION IS NOT UNIQUE AND IS UNNORMALIZED.
C       THE VALUE OF PERTRB SHOULD BE SMALL COMPARED TO THE RIGHT SIDE
C       F. OTHERWISE , A SOLUTION IS OBTAINED TO AN ESSENTIALLY
C       DIFFERENT PROBLEM. THIS COMPARISON SHOULD ALWAYS BE MADE TO
C       INSURE THAT A MEANINGFUL SOLUTION HAS BEEN OBTAINED.
C
C     IERROR
C       AN ERROR FLAG THAT INDICATES INVALID INPUT PARAMETERS.  EXCEPT
C       FOR NUMBERS 0 AND 10, 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  RS .LT. 0  .
C       =  5  RS .GE. RF.
C       =  6  NBDCND .LT. 1 OR NBDCND .GT. 6  .
C       =  7  N IS NOT OF THE PROPER FORM.
C       =  8  AN NBDCND OF 5 OR 6 IS USED WITH AN
C             MBDCND OF 1,2,4,5, OR 7  .
C       =  9  ELMBDA IS NON-ZERO AND EITHER
C             MBDCND = 5,6,7,8, OR 9 OR NBDCND = 5 OR 6  .
C       = 10  ELMBDA .GT. 0  .
C       = 11  IDIMF .LT. M+1  .
C       = 12  TS=0 AND MBDCND=3,4 OR 8  OR  TF=PI AND MBDCND=2,3 OR 6
C
C       SINCE THIS IS THE ONLY MEANS OF INDICATING A POSSLIBY INCORRECT
C       CALL TO PWSCSP, THE USER SHOULD TEST IERROR AFTER A CALL.
C
C     W
C       CONTAINS INTERMEDIATE VALUES THAT MUST NOT BE DESTROYED IF
C       PWSCSP WILL BE CALLED AGAIN WITH INTL = 1  .
C
C
C
      DIMENSION       F(IDIMF,1) ,BDTS(1)    ,BDTF(1)    ,BDRS(1)    ,
     1                BDRF(1)    ,W(1)
      PI = 3.14159265358979
      EPS = APXEPS(DUM)
      IERROR = 11
      IF (IDIMF-M) 132,132,101
  101 IERROR = 1
      IF (TS) 132,102,102
  102 IF (PI-TF+EPS) 132,132,103
  103 IERROR = 2
      IF (TF-TS) 132,132,104
  104 IERROR = 3
      IF (MBDCND) 132,132,105
  105 IF (MBDCND-9) 106,106,132
  106 IERROR = 4
      IF (RS) 132,107,107
  107 IERROR = 5
      IF (RF-RS) 132,132,108
  108 IERROR = 6
      IF (NBDCND) 132,132,109
  109 IF (NBDCND-6) 110,110,132
  110 IERROR = 7
      NCK = N
      GO TO (113,111,112,111,113,111),NBDCND
  111 NCK = N+1
      GO TO 113
  112 NCK = N+2
  113 K = -1
  114 IF (NCK) 116,116,115
  115 NCK = NCK/2
      K = K+1
      GO TO 114
  116 GO TO (117,118,119,118,117,118),NBDCND
  117 IF (2**K-N) 132,120,132
  118 IF (2**K-1-N) 132,120,132
  119 IF (2**K-2-N) 132,120,132
  120 IERROR = 8
      GO TO (121,121,122,121,121,122,121,122,122),MBDCND
  121 IF (NBDCND-4) 122,122,132
  122 IERROR = 9
      IF (ELMBDA) 123,125,123
  123 IF (MBDCND-4) 124,124,132
  124 IF (NBDCND-4) 125,125,132
  125 IERROR = 10
      IF (ELMBDA) 126,126,131
  126 IERROR = 12
      IF (TS) 127,127,130
  127 GO TO (128,128,131,131,128,128,128,131,128),MBDCND
  128 IF (PI-TF-EPS) 129,129,130
  129 GO TO (130,131,131,130,130,131,130,130,130),MBDCND
  130 IERROR = 0
  131 I1 = 6*M+N+8
      I2 = I1+N+1
      I3 = I2+N+1
      I4 = I3+N+1
      CALL PWSCS1 (INTL,TS,TF,M,MBDCND,BDTS,BDTF,RS,RF,N,NBDCND,BDRS,
     1             BDRF,ELMBDA,F,IDIMF,PERTRB,W,W(M+2),W(2*M+3),
     2             W(3*M+4),W(4*M+5),W(5*M+6),W(6*M+7),W(I1),W(I2),
     3             W(I3),W(I4))
  132 RETURN
      END
      SUBROUTINE PWSCS1 (INTL,TS,TF,M,MBDCND,BDTS,BDTF,RS,RF,N,NBDCND,  POI02399
     1                   BDRS,BDRF,ELMBDA,F,IDIMF,PERTRB,AM,BM,CM,S,
     2                   SINT,BMH,AN,BN,CN,R,W)
      DIMENSION       F(IDIMF,1) ,BDRS(1)    ,BDRF(1)    ,BDTS(1)    ,
     1                BDTF(1)    ,AM(1)      ,BM(1)      ,CM(1)      ,
     2                AN(1)      ,BN(1)      ,CN(1)      ,S(1)       ,
     3                R(1)       ,SINT(1)    ,BMH(1)     ,W(1)
      MP1 = M+1
      DTH = (TF-TS)/FLOAT(M)
      TDT = DTH+DTH
      HDTH = DTH/2.
      SDTS = 1./(DTH*DTH)
      DO 102 I=1,MP1
         THETA = TS+FLOAT(I-1)*DTH
         SINT(I) = SIN(THETA)
         IF (SINT(I)) 101,102,101
  101    T1 = SDTS/SINT(I)
         AM(I) = T1*SIN(THETA-HDTH)
         CM(I) = T1*SIN(THETA+HDTH)
         BM(I) = -(AM(I)+CM(I))
  102 CONTINUE
      NP1 = N+1
      DR = (RF-RS)/FLOAT(N)
      HDR = DR/2.
      TDR = DR+DR
      DR2 = DR*DR
      CZR = 6.*DTH/(DR2*(COS(TS)-COS(TF)))
      DO 103 J=1,NP1
         R(J) = RS+FLOAT(J-1)*DR
         AN(J) = (R(J)-HDR)**2/DR2
         CN(J) = (R(J)+HDR)**2/DR2
         BN(J) = -(AN(J)+CN(J))
  103 CONTINUE
      MP = 1
      NP = 1
C
C BOUNDARY CONDITION AT PHI=PS
C
      GO TO (104,104,105,105,106,106,104,105,106),MBDCND
  104 AT = AM(2)
      ITS = 2
      GO TO 107
  105 AT = AM(1)
      ITS = 1
      CM(1) = CM(1)+AM(1)
      GO TO 107
  106 ITS = 1
      BM(1) = -4.*SDTS
      CM(1) = -BM(1)
C
C BOUNDARY CONDITION AT PHI=PF
C
  107 GO TO (108,109,109,108,108,109,110,110,110),MBDCND
  108 CT = CM(M)
      ITF = M
      GO TO 111
  109 CT = CM(M+1)
      AM(M+1) = AM(M+1)+CM(M+1)
      ITF = M+1
      GO TO 111
  110 ITF = M+1
      AM(M+1) = 4.*SDTS
      BM(M+1) = -AM(M+1)
  111 WTS = SINT(ITS+1)*AM(ITS+1)/CM(ITS)
      WTF = SINT(ITF-1)*CM(ITF-1)/AM(ITF)
      ITSP = ITS+1
      ITFM = ITF-1
C
C BOUNDARY CONDITION AT R=RS
C
      ICTR = 0
      GO TO (112,112,113,113,114,114),NBDCND
  112 AR = AN(2)
      JRS = 2
      GO TO 118
  113 AR = AN(1)
      JRS = 1
      CN(1) = CN(1)+AN(1)
      GO TO 118
  114 JRS = 2
      ICTR = 1
      S(N) = AN(N)/BN(N)
      DO 115 J=3,N
         L = N-J+2
         S(L) = AN(L)/(BN(L)-CN(L)*S(L+1))
  115 CONTINUE
      S(2) = -S(2)
      DO 116 J=3,N
         S(J) = -S(J)*S(J-1)
  116 CONTINUE
      WTNM = WTS+WTF
      DO 117 I=ITSP,ITFM
         WTNM = WTNM+SINT(I)
  117 CONTINUE
      YPS = CZR*WTNM*(S(2)-1.)
C
C BOUNDARY CONDITION AT R=RF
C
  118 GO TO (119,120,120,119,119,120),NBDCND
  119 CR = CN(N)
      JRF = N
      GO TO 121
  120 CR = CN(N+1)
      AN(N+1) = AN(N+1)+CN(N+1)
      JRF = N+1
  121 WRS = AN(JRS+1)*R(JRS)**2/CN(JRS)
      WRF = CN(JRF-1)*R(JRF)**2/AN(JRF)
      WRZ = AN(JRS)/CZR
      JRSP = JRS+1
      JRFM = JRF-1
      MUNK = ITF-ITS+1
      NUNK = JRF-JRS+1
      DO 122 I=ITS,ITF
         BMH(I) = BM(I)
  122 CONTINUE
      ISING = 0
      GO TO (132,132,123,132,132,123),NBDCND
  123 GO TO (132,132,124,132,132,124,132,124,124),MBDCND
  124 IF (ELMBDA) 132,125,125
  125 ISING = 1
      SUM = WTS*WRS+WTS*WRF+WTF*WRS+WTF*WRF
      IF (ICTR) 126,127,126
  126 SUM = SUM+WRZ
  127 DO 129 J=JRSP,JRFM
         R2 = R(J)**2
         DO 128 I=ITSP,ITFM
            SUM = SUM+R2*SINT(I)
  128    CONTINUE
  129 CONTINUE
      DO 130 J=JRSP,JRFM
         SUM = SUM+(WTS+WTF)*R(J)**2
  130 CONTINUE
      DO 131 I=ITSP,ITFM
         SUM = SUM+(WRS+WRF)*SINT(I)
  131 CONTINUE
      HNE = SUM
  132 GO TO (133,133,133,133,134,134,133,133,134),MBDCND
  133 BM(ITS) = BMH(ITS)+ELMBDA/SINT(ITS)**2
  134 GO TO (135,135,135,135,135,135,136,136,136),MBDCND
  135 BM(ITF) = BMH(ITF)+ELMBDA/SINT(ITF)**2
  136 DO 137 I=ITSP,ITFM
         BM(I) = BMH(I)+ELMBDA/SINT(I)**2
  137 CONTINUE
      GO TO (138,138,140,140,142,142,138,140,142),MBDCND
  138 DO 139 J=JRS,JRF
         F(2,J) = F(2,J)-AT*F(1,J)/R(J)**2
  139 CONTINUE
      GO TO 142
  140 DO 141 J=JRS,JRF
         F(1,J) = F(1,J)+TDT*BDTS(J)*AT/R(J)**2
  141 CONTINUE
  142 GO TO (143,145,145,143,143,145,147,147,147),MBDCND
  143 DO 144 J=JRS,JRF
         F(M,J) = F(M,J)-CT*F(M+1,J)/R(J)**2
  144 CONTINUE
      GO TO 147
  145 DO 146 J=JRS,JRF
         F(M+1,J) = F(M+1,J)-TDT*BDTF(J)*CT/R(J)**2
  146 CONTINUE
  147 GO TO (151,151,153,153,148,148),NBDCND
  148 IF (MBDCND-3) 155,149,155
  149 YHLD = F(ITS,1)-CZR/TDT*(SIN(TF)*BDTF(2)-SIN(TS)*BDTS(2))
      DO 150 I=1,MP1
         F(I,1) = YHLD
  150 CONTINUE
      GO TO 155
  151 RS2 = (RS+DR)**2
      DO 152 I=ITS,ITF
         F(I,2) = F(I,2)-AR*F(I,1)/RS2
  152 CONTINUE
      GO TO 155
  153 DO 154 I=ITS,ITF
         F(I,1) = F(I,1)+TDR*BDRS(I)*AR/RS**2
  154 CONTINUE
  155 GO TO (156,158,158,156,156,158),NBDCND
  156 RF2 = (RF-DR)**2
      DO 157 I=ITS,ITF
         F(I,N) = F(I,N)-CR*F(I,N+1)/RF2
  157 CONTINUE
      GO TO 160
  158 DO 159 I=ITS,ITF
         F(I,N+1) = F(I,N+1)-TDR*BDRF(I)*CR/RF**2
  159 CONTINUE
  160 CONTINUE
      PERTRB = 0.
      IF (ISING) 161,170,161
  161 SUM = WTS*WRS*F(ITS,JRS)+WTS*WRF*F(ITS,JRF)+WTF*WRS*F(ITF,JRS)+
     1      WTF*WRF*F(ITF,JRF)
      IF (ICTR) 162,163,162
  162 SUM = SUM+WRZ*F(ITS,1)
  163 DO 165 J=JRSP,JRFM
         R2 = R(J)**2
         DO 164 I=ITSP,ITFM
            SUM = SUM+R2*SINT(I)*F(I,J)
  164    CONTINUE
  165 CONTINUE
      DO 166 J=JRSP,JRFM
         SUM = SUM+R(J)**2*(WTS*F(ITS,J)+WTF*F(ITF,J))
  166 CONTINUE
      DO 167 I=ITSP,ITFM
         SUM = SUM+SINT(I)*(WRS*F(I,JRS)+WRF*F(I,JRF))
  167 CONTINUE
      PERTRB = SUM/HNE
      DO 169 J=1,NP1
         DO 168 I=1,MP1
            F(I,J) = F(I,J)-PERTRB
  168    CONTINUE
  169 CONTINUE
  170 DO 172 J=JRS,JRF
         RSQ = R(J)**2
         DO 171 I=ITS,ITF
            F(I,J) = RSQ*F(I,J)
  171    CONTINUE
  172 CONTINUE
      IFLG = INTL
  173 CALL BLKTRI (IFLG,NP,NUNK,AN(JRS),BN(JRS),CN(JRS),MP,MUNK,
     1             AM(ITS),BM(ITS),CM(ITS),IDIMF,F(ITS,JRS),IERROR,W)
      IFLG = IFLG+1
      IF (IFLG-1) 174,173,174
  174 IF (NBDCND) 177,175,177
  175 DO 176 I=1,MP1
         F(I,JRF+1) = F(I,JRS)
  176 CONTINUE
  177 IF (MBDCND) 180,178,180
  178 DO 179 J=1,NP1
         F(ITF+1,J) = F(ITS,J)
  179 CONTINUE
  180 XP = 0.
      IF (ICTR) 181,188,181
  181 IF (ISING) 186,182,186
  182 SUM = WTS*F(ITS,2)+WTF*F(ITF,2)
      DO 183 I=ITSP,ITFM
         SUM = SUM+SINT(I)*F(I,2)
  183 CONTINUE
      YPH = CZR*SUM
      XP = (F(ITS,1)-YPH)/YPS
      DO 185 J=JRS,JRF
         XPS = XP*S(J)
         DO 184 I=ITS,ITF
            F(I,J) = F(I,J)+XPS
  184    CONTINUE
  185 CONTINUE
  186 DO 187 I=1,MP1
         F(I,1) = XP
  187 CONTINUE
  188 RETURN
      END
      SUBROUTINE POIS (IFLG,NPEROD,N,MPEROD,M,A,B,C,IDIMY,Y,IERROR,W)   POI02647
C
C
C***********************************************************************
C
C          VERSION  2  OCTOBER 1976  INCLUDING ERRATA  OCTOBER 1976
C
C         DOCUMENTATION FOR THIS PROGRAM IS GIVEN IN
C
C        EFFICIENT FORTRAN SUBPROGRAMS FOR THE SOLUTION OF
C            ELLIPTIC PARTIAL DIFFERENTIAL EQUATIONS
C
C                              BY
C
C          PAUL SWARZTRAUBER   AND  ROLAND SWEET
C
C             TECHNICAL NOTE TN/IA-109   JULY 1975
C
C       NATIONAL CENTER FOR ATMOSPHERIC RESEARCH  BOULDER,COLORADO 80307
C
C        WHICH IS SPONSORED BY THE NATIONAL SCIENCE FOUNDATION
C
C***********************************************************************
C
C
C
C     SUBROUTINE POIS SOLVES THE LINEAR SYSTEM OF EQUATIONS
C
C          A(I)*X(I-1,J) + B(I)*X(I,J) + C(I)*X(I+1,J)
C
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     THE INDICES I+1 AND I-1 ARE EVALUATED MODULO M, I.E.,
C     X(0,J) = X(M,J) AND X(M+1,J) = X(1,J), AND X(I,0) MAY BE EQUAL TO
C     0, X(I,2), OR X(I,N) AND X(I,N+1) MAY BE EQUAL TO 0, X(I,N-1), OR
C     X(I,1) DEPENDING ON AN INPUT PARAMETER.
C
C
C     * * * * * * * * * *     ON INPUT     * * * * * * * * * *
C
C     IFLG
C       = 0  ON INITIAL ENTRY TO POIS OR IF N AND NPEROD ARE CHANGED
C            FROM PREVIOUS CALL.
C       = 1  IF N AND NPEROD ARE UNCHANGED FROM PREVIOUS CALL TO POIS.
C
C       NOTE:  A CALL WITH IFLG = 1 IS ABOUT 1 PERCENT FASTER THAN A
C              CALL WITH IFLG = 0  .
C
C     NPEROD
C       INDICATES THE VALUES WHICH X(I,0) AND X(I,N+1) ARE ASSUMED TO
C       HAVE.
C
C       = 0  IF X(I,0) = X(I,N) AND X(I,N+1) = 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) = X(I,N-1).
C
C     N
C       THE NUMBER OF UNKNOWNS IN THE J-DIRECTION.  N IS DEPENDENT ON
C       NPEROD AND MUST HAVE THE FOLLOWING FORM:
C
C            NPEROD
C              = 0 OR 2, THEN N = (2**P)(3**Q)(5**R)
C              = 1, THEN N = (2**P)(3**Q)(5**R)-1
C              = 3, THEN N = (2**P)(3**Q)(5**R)+1
C
C            WHERE P, Q, AND R MAY BE ANY NON-NEGATIVE INTEGERS.  N MUST
C            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.  M MAY BE ANY INTEGER
C       GREATER THAN 1  .
C
C     A,B,C
C       ONE-DIMENSIONAL ARRAYS OF LENGTH M WHICH SPECIFY THE
C       COEFFICIENTS IN THE LINEAR EQUATIONS GIVEN ABOVE.
C
C     IDIMY
C       THE ROW (OR FIRST) DIMENSION OF THE TWO-DIMENSIONAL ARRAY Y AS
C       IT APPEARS IN THE PROGRAM CALLING POIS.  THIS PARAMETER IS USED
C       TO SPECIFY THE VARIABLE DIMENSION OF Y.  IDIMY MUST BE AT LEAST
C       M.
C
C     Y
C       A TWO-DIMENSIONAL ARRAY WHICH SPECIFIES THE VALUES OF THE RIGHT
C       SIDE OF THE LINEAR SYSTEM OF EQUATIONS GIVEN ABOVE.  Y MUST BE
C       DIMENSIONED AT LEAST M*N.
C
C     W
C       A ONE-DIMENSIONAL ARRAY-WHICH MUST BE PROVIDED BY THE USER FOR
C       WORK SPACE.  THE LENGTH OF W MUST BE AT LEAST 6N+5M.
C
C
C     * * * * * * * * * *     ON OUTPUT     * * * * * * * * * *
C
C     Y
C       CONTAINS THE SOLUTION X.
C
C     IERROR
C       AN ERROR FLAG WHICH INDICATES INVALID INPUT PARAMETERS  EXCEPT
C       FOR NUMBER ZERO, A SOLUTION IS NOT ATTEMPTED.
C
C       = 0  NO ERROR.
C       = 1  M .LE. 2  .
C       = 2  N .LE. 2 OR NOT OF THE RIGHT FORM.
C       = 3  IDIMY .LT. M.
C       = 4  NPEROD .LT. 0 OR NPEROD .GT. 3  .
C
C     W
C       CONTAINS INTERMEDIATE VALUES THAT MUST NOT BE DESTROYED IF
C       POIS WILL BE CALLED AGAIN WITH IFLAG = 1  .
C
C
C
      EXTERNAL        TRID       ,TRIDP
      DIMENSION       Y(IDIMY,1)
      DIMENSION       W(1)       ,B(1)       ,A(1)       ,C(1)
      IERROR = 0
      IF (M .LE. 2) IERROR = 1
      I = NCHECK(NPEROD-2*((2*NPEROD)/3)+N)
      IF (N.LE.2 .OR. I.GT.1) IERROR = 2
      IF (IDIMY .LT. M) IERROR = 3
      IF (NPEROD.LT.0 .OR. NPEROD.GT.3) IERROR = 4
      IF (IERROR .NE. 0) GO TO 105
      IWDIM1 = 6*N+1
      IWDIM2 = IWDIM1+M
      IWDIM3 = IWDIM2+M
      IWDIM4 = IWDIM3+M
      IWDIM5 = IWDIM4+M
      DO 101 I=1,M
         A(I) = -A(I)
         C(I) = -C(I)
         K = IWDIM5+I-1
         W(K) = -B(I)+2.
  101 CONTINUE
      IF (MPEROD .EQ. 0) GO TO 102
      CALL POISGN (NPEROD,N,IFLG,M,A,W(IWDIM5),C,IDIMY,Y,W(1),
     1             W(IWDIM1),W(IWDIM2),W(IWDIM3),W(IWDIM4),TRID)
      GO TO 103
  102 CALL POISGN (NPEROD,N,IFLG,M,A,W(IWDIM5),C,IDIMY,Y,W(1),
     1             W(IWDIM1),W(IWDIM2),W(IWDIM3),W(IWDIM4),TRIDP)
  103 DO 104 I=1,M
         A(I) = -A(I)
         C(I) = -C(I)
  104 CONTINUE
  105 RETURN
      END
      SUBROUTINE POISGN (NPEROD,N,IFLG,M,BA,BB,BC,IDIMQ,Q,TWOCOS,B,T,D, POI02801
     1                   W,TRI)
      DIMENSION       Q(IDIMQ,1)
      DIMENSION       BA(1)      ,BB(1)      ,BC(1)      ,TWOCOS(1)  ,
     1                B(1)       ,T(1)       ,D(1)       ,W(1)
      IF (IFLG .NE. 0) GO TO 101
C
C     DO INITIALIZATION IF FIRST TIME THROUGH.
C
      CALL POINIT (NPEROD,N,IEX2,IEX3,IEX5,N2PW,N2P3P,N2P3P5,KS3,KS5,
     1             NPSTOP,TWOCOS)
  101 MM1 = M-1
      DO 104 J=1,N
         DO 102 I=1,M
            B(I) = -Q(I,J)
  102    CONTINUE
         CALL TRI (1,1,1,M,MM1,BA,BB,BC,B,TWOCOS,D,W)
         DO 103 I=1,M
            Q(I,J) = B(I)
  103    CONTINUE
  104 CONTINUE
      NP = 1
C
C     START REDUCTION FOR POWERS OF TWO
C
      IF (IEX2 .EQ. 0) GO TO 112
      L = IEX2
      IF (IEX3+IEX5 .NE. 0) GO TO 105
      IF (NPEROD .EQ. 1) L = L-1
      IF (L .EQ. 0) GO TO 138
  105 DO 111 KOUNT=1,L
         K = NP
         NP = 2*NP
         K2 = NP-1
         K3 = NP
         K4 = 2*NP-1
         JSTART = NP
         IF (NPEROD .EQ. 3) JSTART = 1
         DO 110 J=JSTART,N,NP
            JM1 = J-K
            JP1 = J+K
            IF (J .EQ. 1) JM1 = JP1
            IF (J .NE. N) GO TO 106
            JP1 = JM1
            IF (NPEROD .EQ. 0) JP1 = K
  106       DO 107 I=1,M
               B(I) = Q(I,JM1)+Q(I,JP1)
  107       CONTINUE
            CALL TRI (K,K2,1,M,MM1,BA,BB,BC,B,TWOCOS,D,W)
            DO 108 I=1,M
               T(I) = Q(I,J)+B(I)
               B(I) = T(I)
  108       CONTINUE
            CALL TRI (K3,K4,1,M,MM1,BA,BB,BC,B,TWOCOS,D,W)
            DO 109 I=1,M
               Q(I,J) = T(I)+2.*B(I)
  109       CONTINUE
  110    CONTINUE
  111 CONTINUE
C
C     START REDUCTION FOR POWERS OF THREE
C
  112 IF (IEX3 .EQ. 0) GO TO 124
      L = IEX3
      IF (IEX5 .NE. 0) GO TO 113
      IF (NPEROD .EQ. 1) L = L-1
      IF (L .EQ. 0) GO TO 138
  113 K2 = NP-1
      DO 123 KOUNT=1,L
         K = NP
         NP = 3*NP
         K1 = K2+1
         K2 = K2+K
         K3 = K2+1
         K4 = K2+NP
         JSTART = NP
         IF (NPEROD .EQ. 3) JSTART = 1
         DO 122 J=JSTART,N,NP
            IF (J .NE. 1) GO TO 114
            JM1 = J+K
            JM2 = JM1+K
            GO TO 116
  114       JM1 = J-K
            JM2 = JM1-K
            IF (J .NE. N) GO TO 116
            IF (NPEROD .EQ. 0) GO TO 115
            JP1 = JM1
            JP2 = JM2
            GO TO 117
  115       JP1 = K
            JP2 = JP1+K
            GO TO 117
  116       JP1 = J+K
            JP2 = JP1+K
  117       DO 118 I=1,M
               B(I) = 2.*Q(I,J)+Q(I,JM2)+Q(I,JP2)
  118       CONTINUE
            CALL TRI (K1,K2,1,M,MM1,BA,BB,BC,B,TWOCOS,D,W)
            DO 119 I=1,M
               T(I) = B(I)+Q(I,JM1)+Q(I,JP1)
               B(I) = T(I)
  119       CONTINUE
            CALL TRI (K1,K2,1,M,MM1,BA,BB,BC,B,TWOCOS,D,W)
            DO 120 I=1,M
               Q(I,J) = Q(I,J)+B(I)
               B(I) = T(I)
  120       CONTINUE
            CALL TRI (K3,K4,1,M,MM1,BA,BB,BC,B,TWOCOS,D,W)
            DO 121 I=1,M
               Q(I,J) = Q(I,J)+3.*B(I)
  121       CONTINUE
  122    CONTINUE
  123 CONTINUE
C
C     START REDUCTION FOR POWERS OF FIVE
C
  124 L = IEX5
      IF (NPEROD .EQ. 1) L = L-1
      IF (L .LE. 0) GO TO 138
      K2 = (N2PW+N2P3P)/2-1
      DO 137 KOUNT=1,L
         K = NP
         NP = 5*NP
         K1 = K2+1
         K2 = K2+K
         K3 = K2+1
         K4 = K2+NP
         JSTART = NP
         IF (NPEROD .EQ. 3) JSTART = 1
         DO 136 J=JSTART,N,NP
            IF (J .NE. 1) GO TO 125
            JM1 = J+K
            JM2 = JM1+K
            JM3 = JM2+K
            JM4 = JM3+K
            GO TO 127
  125       JM1 = J-K
            JM2 = JM1-K
            JM3 = JM2-K
            JM4 = JM3-K
            IF (J .NE. N) GO TO 127
            IF (NPEROD .EQ. 0) GO TO 126
            JP1 = JM1
            JP2 = JM2
            JP3 = JM3
            JP4 = JM4
            GO TO 128
  126       JP1 = K
            JP2 = JP1+K
            JP3 = JP2+K
            JP4 = JP3+K
            GO TO 128
  127       JP1 = J+K
            JP2 = JP1+K
            JP3 = JP2+K
            JP4 = JP3+K
  128       DO 129 I=1,M
               B(I) = 6.*Q(I,J)+4.*(Q(I,JM2)+Q(I,JP2))+Q(I,JM4)+Q(I,JP4)
  129       CONTINUE
            CALL TRI (K1,K2,1,M,MM1,BA,BB,BC,B,TWOCOS,D,W)
            DO 130 I=1,M
               B(I) = B(I)+3.*(Q(I,JM1)+Q(I,JP1))+Q(I,JM3)+Q(I,JP3)
  130       CONTINUE
            CALL TRI (K1,K2,1,M,MM1,BA,BB,BC,B,TWOCOS,D,W)
            DO 131 I=1,M
               T(I) = B(I)
               B(I) = 2.*Q(I,J)+Q(I,JM2)+Q(I,JP2)+B(I)
  131       CONTINUE
            CALL TRI (K1,K2,1,M,MM1,BA,BB,BC,B,TWOCOS,D,W)
            DO 132 I=1,M
               B(I) = B(I)+Q(I,JM1)+Q(I,JP1)
  132       CONTINUE
            CALL TRI (K1,K2,1,M,MM1,BA,BB,BC,B,TWOCOS,D,W)
            DO 133 I=1,M
               TEMP = B(I)+Q(I,J)
               B(I) = 4.*Q(I,J)+3.*(Q(I,JM2)+Q(I,JP2))+Q(I,JM4)+
     1                Q(I,JP4)-T(I)
               Q(I,J) = TEMP
  133       CONTINUE
            CALL TRI (K1,K2,1,M,MM1,BA,BB,BC,B,TWOCOS,D,W)
            DO 134 I=1,M
               B(I) = B(I)+2.*(Q(I,JM1)+Q(I,JP1))+Q(I,JM3)+Q(I,JP3)
  134       CONTINUE
            CALL TRI (K3,K4,1,M,MM1,BA,BB,BC,B,TWOCOS,D,W)
            DO 135 I=1,M
               Q(I,J) = Q(I,J)+5.*B(I)
  135       CONTINUE
  136    CONTINUE
  137 CONTINUE
C
C     INITIAL PHASE OF BACK SUBSTITUTION
C
  138 IF (NPEROD.EQ.1 .OR. NPEROD.EQ.2) GO TO 147
      IF (NPEROD .EQ. 0) GO TO 141
      DO 139 I=1,M
         B(I) = 2.*Q(I,1)
  139 CONTINUE
      CALL TRI (K3,K4,1,M,MM1,BA,BB,BC,B,TWOCOS,D,W)
      DO 140 I=1,M
         Q(I,N) = Q(I,N)+B(I)
         B(I) = 4.*Q(I,N)
  140 CONTINUE
      CALL TRI (K4+1,K4+2*NP-1,2,M,MM1,BA,BB,BC,B,TWOCOS,D,W)
      GO TO 143
  141 DO 142 I=1,M
         B(I) = 2.*Q(I,N)
  142 CONTINUE
      CALL TRI (K4+1,K4+NP-1,2,M,MM1,BA,BB,BC,B,TWOCOS,D,W)
  143 DO 144 I=1,M
         Q(I,N) = Q(I,N)+B(I)
  144 CONTINUE
      IF (NPEROD .EQ. 0) GO TO 147
      DO 145 I=1,M
         B(I) = 2.*Q(I,N)
  145 CONTINUE
      CALL TRI (K3,K4,1,M,MM1,BA,BB,BC,B,TWOCOS,D,W)
      DO 146 I=1,M
         Q(I,1) = Q(I,1)+B(I)
  146 CONTINUE
C
C     REGULAR BACK SUBSTITUTION FOR POWERS OF FIVE
C
  147 CONTINUE
      IF (IEX5 .EQ. 0) GO TO 171
      NP = N2P3P5
      K8 = KS5
      IF (NPEROD .EQ. 1) K3 = K3+NP/5
      DO 170 KOUNT=1,IEX5
         K = NP
         NP = NP/5
         K4 = K3-1
         K3 = K3-NP
         K1 = K8+1
         K2 = K8+2*NP
         K5 = K2+1
         K6 = K2+4*NP
         K7 = K6+1
         K8 = K6+2*NP
         JSTART = NP
         IF (NPEROD .EQ. 3) JSTART = 1+NP
         DO 169 J=JSTART,N,K
            JM1 = J-NP
            JP1 = J+NP
            JP2 = JP1+NP
            JP3 = JP2+NP
            JP4 = JP3+NP
            IF (JM1 .NE. 0) GO TO 151
            IF (NPEROD .EQ. 0) GO TO 149
            DO 148 I=1,M
               B(I) = Q(I,JP1)
  148       CONTINUE
            GO TO 153
  149       DO 150 I=1,M
               B(I) = Q(I,JP1)+Q(I,N)
  150       CONTINUE
            GO TO 153
  151       DO 152 I=1,M
               B(I) = Q(I,JP1)+Q(I,JM1)
  152       CONTINUE
  153       CALL TRI (K3,K4,1,M,MM1,BA,BB,BC,B,TWOCOS,D,W)
            DO 154 I=1,M
               Q(I,J) = Q(I,J)+B(I)
               B(I) = Q(I,JP1)+Q(I,JP3)
  154       CONTINUE
            CALL TRI (K3,K4,1,M,MM1,BA,BB,BC,B,TWOCOS,D,W)
            DO 155 I=1,M
               Q(I,JP2) = Q(I,JP2)+B(I)
  155       CONTINUE
            IF (JP4 .GT. N) GO TO 157
            DO 156 I=1,M
               B(I) = 2.*Q(I,JP2)+Q(I,J)+Q(I,JP4)
  156       CONTINUE
            GO TO 159
  157       DO 158 I=1,M
               B(I) = 2.*Q(I,JP2)+Q(I,J)
  158       CONTINUE
  159       CALL TRI (K1,K2,1,M,MM1,BA,BB,BC,B,TWOCOS,D,W)
            DO 160 I=1,M
               Q(I,JP2) = Q(I,JP2)+B(I)
               B(I) = Q(I,JP2)+Q(I,J)
  160       CONTINUE
            CALL TRI (K5,K6,1,M,MM1,BA,BB,BC,B,TWOCOS,D,W)
            DO 161 I=1,M
               Q(I,JP2) = Q(I,JP2)+B(I)
               B(I) = Q(I,J)+Q(I,JP2)
  161       CONTINUE
            CALL TRI (K7,K8,1,M,MM1,BA,BB,BC,B,TWOCOS,D,W)
            DO 162 I=1,M
               Q(I,J) = Q(I,J)+B(I)
               B(I) = Q(I,J)+Q(I,JP2)
  162       CONTINUE
            CALL TRI (K3,K4,1,M,MM1,BA,BB,BC,B,TWOCOS,D,W)
            DO 163 I=1,M
               Q(I,JP1) = Q(I,JP1)+B(I)
  163       CONTINUE
            IF (JP4 .GT. N) GO TO 165
            DO 164 I=1,M
               B(I) = Q(I,JP2)+Q(I,JP4)
  164       CONTINUE
            GO TO 167
  165       DO 166 I=1,M
               B(I) = Q(I,JP2)
  166       CONTINUE
  167       CALL TRI (K3,K4,1,M,MM1,BA,BB,BC,B,TWOCOS,D,W)
            DO 168 I=1,M
               Q(I,JP3) = Q(I,JP3)+B(I)
  168       CONTINUE
  169    CONTINUE
  170 CONTINUE
C
C     REGULAR BACK SUBSTITUTION FOR POWERS OF THREE
C
  171 IF (IEX3 .EQ. 0) GO TO 191
      NP = N2P3P
      K2 = KS3
      IF (NPEROD.EQ.1 .AND. IEX5.EQ.0) K3 = K3+NP/3
      DO 190 KOUNT=1,IEX3
         K = NP
         NP = NP/3
         K4 = K3-1
         K3 = K3-NP
         K1 = K2+1
         K2 = K2+2*NP
         JSTART = NP
         IF (NPEROD .EQ. 3) JSTART = NP+1
         DO 189 J=JSTART,N,K
            JM1 = J-NP
            JP1 = J+NP
            JP2 = JP1+NP
            IF (JM1 .EQ. 0) GO TO 173
            DO 172 I=1,M
               B(I) = Q(I,JP1)+Q(I,JM1)
  172       CONTINUE
            GO TO 177
  173       IF (NPEROD .EQ. 0) GO TO 175
            DO 174 I=1,M
               B(I) = Q(I,JP1)
  174       CONTINUE
            GO TO 177
  175       DO 176 I=1,M
               B(I) = Q(I,JP1)+Q(I,N)
  176       CONTINUE
  177       CALL TRI (K3,K4,1,M,MM1,BA,BB,BC,B,TWOCOS,D,W)
            DO 178 I=1,M
               Q(I,J) = Q(I,J)+B(I)
  178       CONTINUE
            IF (JP2 .GT. N) GO TO 180
            DO 179 I=1,M
               B(I) = Q(I,J)+Q(I,JP2)
  179       CONTINUE
            GO TO 182
  180       DO 181 I=1,M
               B(I) = Q(I,J)
  181       CONTINUE
  182       CALL TRI (K1,K2,1,M,MM1,BA,BB,BC,B,TWOCOS,D,W)
            DO 183 I=1,M
               Q(I,J) = Q(I,J)+B(I)
  183       CONTINUE
            IF (JP2 .GT. N) GO TO 185
            DO 184 I=1,M
               B(I) = Q(I,J)+Q(I,JP2)
  184       CONTINUE
            GO TO 187
  185       DO 186 I=1,M
               B(I) = Q(I,J)
  186       CONTINUE
  187       CALL TRI (K3,K4,1,M,MM1,BA,BB,BC,B,TWOCOS,D,W)
            DO 188 I=1,M
               Q(I,JP1) = Q(I,JP1)+B(I)
  188       CONTINUE
  189    CONTINUE
  190 CONTINUE
C
C     REGULAR BACK SUBSTITUTION FOR POWERS OF TWO
C
  191 IF (IEX2 .EQ. 0) GO TO 202
      NP = N2PW
      DO 201 KOUNT=1,IEX2
         K = NP
         NP = NP/2
         K3 = K-1
         JSTART = NP
         IF (NPEROD .EQ. 3) JSTART = 1+NP
         DO 200 J=JSTART,N,K
            JM1 = J-NP
            JP1 = J+NP
            IF (JM1 .NE. 0) GO TO 194
            IF (JP1 .GT. N) GO TO 200
            IF (NPEROD.EQ.1 .OR. NPEROD.EQ.2) GO TO 192
            JM1 = N
            GO TO 196
  192       DO 193 I=1,M
               B(I) = Q(I,JP1)
  193       CONTINUE
            GO TO 198
  194       IF (JP1 .LE. N) GO TO 196
            DO 195 I=1,M
               B(I) = Q(I,JM1)
  195       CONTINUE
            GO TO 198
  196       DO 197 I=1,M
               B(I) = Q(I,JM1)+Q(I,JP1)
  197       CONTINUE
  198       CALL TRI (NP,K3,1,M,MM1,BA,BB,BC,B,TWOCOS,D,W)
            DO 199 I=1,M
               Q(I,J) = Q(I,J)+B(I)
  199       CONTINUE
  200    CONTINUE
  201 CONTINUE
  202 RETURN
      END
      SUBROUTINE POINIT (NPEROD,N,IEX2,IEX3,IEX5,N2PW,N2P3P,N2P3P5,KS3, POI03213
     1                   KS5,NPSTOP,TWOCOS)
      DIMENSION       TWOCOS(1)
C
C     PARAMETER NPSTOP IS NOT USED IN THIS SUBROUTINE.
C
C
C     MACHINE DEPENDENT CONSTANT
C
C     PI=3.1415926535897932384626433832795028841971693993751058209749446
C
      PI = 3.14159265358979
C
C     COMPUTE EXPONENTS OF 2,3, AND 5 IN N.
C
      NP = N
      IF (NPEROD .EQ. 1) NP = NP+1
      IF (NPEROD .EQ. 3) NP = NP-1
      IEX2 = 0
  101 K = NP/2
      IF (2*K .NE. NP) GO TO 102
      IEX2 = IEX2+1
      NP = K
      GO TO 101
  102 IEX3 = 0
  103 K = NP/3
      IF (3*K .NE. NP) GO TO 104
      IEX3 = IEX3+1
      NP = K
      GO TO 103
  104 IEX5 = 0
  105 K = NP/5
      IF (5*K .NE. NP) GO TO 106
      IEX5 = IEX5+1
      NP = K
      GO TO 105
  106 CONTINUE
      N2PW = 2**IEX2
      N2P3P = N2PW*(3**IEX3)
      N2P3P5 = N2P3P*(5**IEX5)
C
C     COMPUTE NECESSARY VALUES OF 2*COS(X)
C
      NP = 1
      TWOCOS(1) = 0.
      K = 1
      IF (IEX2 .EQ. 0) GO TO 110
      L = IEX2
      IF (IEX3+IEX5 .NE. 0) GO TO 107
      IF (NPEROD .EQ. 1) L = L-1
      IF (L .EQ. 0) GO TO 129
  107 DO 109 KOUNT=1,L
         NP = 2*NP
         DO 108 I=1,NP
            J = K+I
            TWOCOS(J) = 2.*COS((FLOAT(I)-.5)*PI/FLOAT(NP))
  108    CONTINUE
         K = K+NP
  109 CONTINUE
  110 IF (IEX3 .EQ. 0) GO TO 114
      L = IEX3
      IF (IEX5 .NE. 0) GO TO 111
      IF (NPEROD .EQ. 1) L = L-1
      IF (L .EQ. 0) GO TO 117
  111 DO 113 KOUNT=1,L
         NP = 3*NP
         DO 112 I=1,NP
            J = K+I
            TWOCOS(J) = 2.*COS((FLOAT(I)-.5)*PI/FLOAT(NP))
  112    CONTINUE
         K = K+NP
  113 CONTINUE
  114 L = IEX5
      IF (NPEROD .EQ. 1) L = L-1
      IF (L .LE. 0) GO TO 117
      DO 116 KOUNT=1,L
         NP = 5*NP
         DO 115 I=1,NP
            J = K+I
            TWOCOS(J) = 2.*COS((FLOAT(I)-.5)*PI/FLOAT(NP))
  115    CONTINUE
         K = K+NP
  116 CONTINUE
  117 IF (NPEROD.EQ.1 .OR. NPEROD.EQ.2) GO TO 121
      IF (NPEROD .EQ. 0) GO TO 119
      NPT2 = 2*NP
      DO 118 I=1,NPT2
         J = K+I
         TWOCOS(J) = 2.*COS(FLOAT(I)*PI/FLOAT(NP))
  118 CONTINUE
      K = K+NPT2
      GO TO 121
  119 DO 120 I=1,NP
         J = K+I
         TWOCOS(J) = 2.*COS(2.*FLOAT(I)*PI/FLOAT(NP))
  120 CONTINUE
      K = K+NP
  121 NP = N2P3P5
      IF (IEX5 .EQ. 0) GO TO 126
      KS5 = K
      DO 125 KOUNT=1,IEX5
         NP = NP/5
         NPT2 = 2*NP
         DO 122 I=1,NPT2
            J = K+I
            TWOCOS(J) = 2.*COS((FLOAT(I)-.5)*PI/FLOAT(NPT2))
  122    CONTINUE
         K = K+NPT2
         DO 123 I=1,NP
            J = K+4*I
            TWOCOS(J-3) = 2.*COS((FLOAT(I)-.8)*PI/FLOAT(NP))
            TWOCOS(J-2) = 2.*COS((FLOAT(I)-.6)*PI/FLOAT(NP))
            TWOCOS(J-1) = 2.*COS((FLOAT(I)-.4)*PI/FLOAT(NP))
            TWOCOS(J) = 2.*COS((FLOAT(I)-.2)*PI/FLOAT(NP))
  123    CONTINUE
         K = K+4*NP
         DO 124 I=1,NP
            J = K+2*I
            TWOCOS(J-1) = 2.*COS(FLOAT(3*I-2)*PI/FLOAT(3*NP))
            TWOCOS(J) = 2.*COS(FLOAT(3*I-1)*PI/FLOAT(3*NP))
  124    CONTINUE
         K = K+2*NP
  125 CONTINUE
  126 IF (IEX3 .EQ. 0) GO TO 129
      KS3 = K
      DO 128 KOUNT=1,IEX3
         NP = NP/3
         DO 127 I=1,NP
            J = K+2*I
            TWOCOS(J-1) = 2.*COS(FLOAT(3*I-2)*PI/FLOAT(3*NP))
            TWOCOS(J) = 2.*COS(FLOAT(3*I-1)*PI/FLOAT(3*NP))
  127    CONTINUE
         K = K+2*NP
  128 CONTINUE
  129 RETURN
      END
      SUBROUTINE TRID (KSTART,KSTOP,ISING,M,MM1,A,B,C,Y,TWOCOS,D,W)     POI03350
      DIMENSION       A(1)       ,B(1)       ,C(1)       ,Y(1)       ,
     1                TWOCOS(1)  ,D(1)       ,W(1)
C
C     SUBROUTINE TO SOLVE TRIDIAGONAL SYSTEMS
C
C
C     PARAMETER W NOT USED IN THIS SUBROUTINE.
C
      DO 103 K=KSTART,KSTOP
         X = -TWOCOS(K)
         D(1) = C(1)/(B(1)+X)
         Y(1) = Y(1)/(B(1)+X)
         DO 101 I=2,M
            Z = B(I)+X-A(I)*D(I-1)
            D(I) = C(I)/Z
            Y(I) = (Y(I)-A(I)*Y(I-1))/Z
  101    CONTINUE
         DO 102 IP=1,MM1
            I = M-IP
            Y(I) = Y(I)-D(I)*Y(I+1)
  102    CONTINUE
  103 CONTINUE
      IF (ISING .EQ. 1) RETURN
      D(1) = C(1)/(B(1)-2.)
      Y(1) = Y(1)/(B(1)-2.)
      DO 104 I=2,MM1
         Z = B(I)-2.-A(I)*D(I-1)
         D(I) = C(I)/Z
         Y(I) = (Y(I)-A(I)*Y(I-1))/Z
  104 CONTINUE
      Z = B(M)-2.-A(M)*D(M-1)
      X = Y(M)-A(M)*Y(M-1)
      IF (Z .NE. 0.) GO TO 105
      Y(M) = 0.
      GO TO 106
  105 Y(M) = X/Z
  106 DO 107 IP=1,MM1
         I = M-IP
         Y(I) = Y(I)-D(I)*Y(I+1)
  107 CONTINUE
      RETURN
      END
      SUBROUTINE TRIDP (KSTART,KSTOP,ISING,M,MM1,A,B,C,Y,TWOCOS,D,W)    POI03394
      DIMENSION       A(1)       ,B(1)       ,C(1)       ,Y(1)       ,
     1                TWOCOS(1)  ,D(1)       ,W(1)
C
C     SUBROUTINE TO SOLVE PERIODIC TRIDIAGONAL SYSTEM
C
      DO 103 K=KSTART,KSTOP
         X = -TWOCOS(K)
         D(1) = C(1)/(B(1)+X)
         W(1) = A(1)/(B(1)+X)
         Y(1) = Y(1)/(B(1)+X)
         BM = B(M)
         Z = C(M)
         DO 101 I=2,MM1
            DEN = B(I)+X-A(I)*D(I-1)
            D(I) = C(I)/DEN
            W(I) = -A(I)*W(I-1)/DEN
            Y(I) = (Y(I)-A(I)*Y(I-1))/DEN
            Y(M) = Y(M)-Z*Y(I-1)
            BM = BM-Z*W(I-1)
            Z = -Z*D(I-1)
  101    CONTINUE
         D(MM1) = D(MM1)+W(MM1)
         Z = A(M)+Z
         DEN = BM+X-Z*D(MM1)
         Y(M) = Y(M)-Z*Y(M-1)
         Y(M) = Y(M)/DEN
         Y(MM1) = Y(MM1)-D(MM1)*Y(M)
         DO 102 IP=2,MM1
            I = M-IP
            Y(I) = Y(I)-D(I)*Y(I+1)-W(I)*Y(M)
  102    CONTINUE
  103 CONTINUE
      IF (ISING .EQ. 1) RETURN
      D(1) = C(1)/(B(1)-2.)
      W(1) = A(1)/(B(1)-2.)
      Y(1) = Y(1)/(B(1)-2.)
      BM = B(M)
      Z = C(M)
      DO 104 I=2,MM1
         DEN = B(I)-2.-A(I)*D(I-1)
         D(I) = C(I)/DEN
         W(I) = -A(I)*W(I-1)/DEN
         Y(I) = (Y(I)-A(I)*Y(I-1))/DEN
         Y(M) = Y(M)-Z*Y(I-1)
         BM = BM-Z*W(I-1)
         Z = -Z*D(I-1)
  104 CONTINUE
      D(MM1) = D(MM1)+W(MM1)
      Z = A(M)+Z
      DEN = BM-2.-Z*D(MM1)
      Y(M) = Y(M)-Z*Y(M-1)
      IF (DEN .NE. 0.) GO TO 105
      Y(M) = 0.
      GO TO 106
  105 Y(M) = Y(M)/DEN
  106 Y(MM1) = Y(MM1)-D(MM1)*Y(M)
      DO 107 IP=2,MM1
         I = M-IP
         Y(I) = Y(I)-D(I)*Y(I+1)-W(I)*Y(M)
  107 CONTINUE
      RETURN
      END
      SUBROUTINE BLKTRI (IFLG,NP,N,AN,BN,CN,MP,M,AM,BM,CM,IDIMY,Y,      POI03458
     1                   IERROR,W)
C
C
C***********************************************************************
C
C          VERSION  2  OCTOBER 1976  INCLUDING ERRATA  OCTOBER 1976
C
C         DOCUMENTATION FOR THIS PROGRAM IS GIVEN IN
C
C        EFFICIENT FORTRAN SUBPROGRAMS FOR THE SOLUTION OF
C            ELLIPTIC PARTIAL DIFFERENTIAL EQUATIONS
C
C                              BY
C
C          PAUL SWARZTRAUBER   AND  ROLAND SWEET
C
C             TECHNICAL NOTE TN/IA-109   JULY 1975
C
C       NATIONAL CENTER FOR ATMOSPHERIC RESEARCH  BOULDER,COLORADO 80307
C
C        WHICH IS SPONSORED BY THE NATIONAL SCIENCE FOUNDATION
C
C***********************************************************************
C
C
C
C     SUBROUTINE BLKTRI SOLVES A SYSTEM OF LINEAR EQUATIONS OF THE FORM
C
C          AN(J)*X(I,J-1) + AM(I)*X(I-1,J) + (BN(J)+BM(I))*X(I,J)
C
C          + CN(J)*X(I,J+1) + 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 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 DISCRETIZATION OF
C     SEPARABLE ELLIPTIC EQUATIONS.  BOUNDARY CONDITIONS MAY BE
C     DIRICHLET, NEUMANN, OR PERIODIC.
C
C
C     * * * * * * * * * *     ON INPUT     * * * * * * * * * *
C
C     IFLG
C       = 0  INITIALIZATION ONLY.  CERTAIN QUANTITIES THAT DEPEND ON NP,
C                                  N, AN, BN, AND CN ARE COMPUTED AND
C                                  STORED IN THE WORK ARRAY  W.
C       = 1  THE QUANTITIES THAT WERE COMPUTED IN THE INITIALIZATION ARE
C            USED TO OBTAIN THE SOLUTION X(I,J).
C
C       NOTE   A CALL WITH IFLG=0 TAKES APPROXIMATELY ONE HALF THE TIME
C              TIME AS A CALL WITH IFLG = 1  .  HOWEVER, THE
C              INITIALIZATION DOES NOT HAVE TO BE REPEATED UNLESS NP, N,
C              AN, BN, OR CN CHANGE.
C
C     NP
C       = 0  IF AN(1) AND CN(N) ARE NOT ZERO, WHICH CORRESPONDS TO
C            PERIODIC BOUNARY CONDITIONS.
C       = 1  IF AN(1) AND CN(N) ARE ZERO.
C
C     N
C       THE NUMBER OF UNKNOWNS IN THE J-DIRECTION.  IF NP = 1, N MUST BE
C       OF THE FORM 2**K-1 WHERE K IS AN INTEGER .GT. 1  .  IF NP = 0, N
C       MUST BE OF THE FORM 2**K.  (THE OPERATION COUNT OF THE ALGORITHM
C       IS PROPORTIONAL TO MN LOG2N AND, HENCE, N SHOULD BE SELECTED
C       LESS THAN OR EQUAL TO M.)
C
C     AN,BN,CN
C       ONE-DIMENSIONAL ARRAYS OF LENGTH N THAT SPECIFY THE COEFFICIENTS
C       IN THE LINEAR EQUATIONS GIVEN ABOVE.
C
C     MP
C       = 0  IF AM(1) AND CM(M) ARE NOT ZERO, WHICH CORRESPONDS TO
C            PERIODIC BOUNDARY CONDITIONS.
C       = 1  IF AM(1) = CM(M) = 0  .
C
C     M
C       THE NUMBER OF UNKNOWNS IN THE I-DIRECTION.  M MAY BE ANY INTEGER
C       GREATER THAN 4.
C
C     AM,BM,CM
C       ONE-DIMENSIONAL ARRAYS OF LENGTH M THAT SPECIFY THE COEFFICIENTS
C       IN THE LINEAR EQUATIONS GIVEN ABOVE.
C
C     IDIMY
C       THE ROW (OR FIRST) DIMENSION OF THE TWO-DIMENSIONAL ARRAY Y AS
C       IT APPEARS IN THE PROGRAM CALLING BLKTRI.  THIS PARAMETER IS
C       USED TO SPECIFY THE VARIABLE DIMENSION OF Y.  IDIMY MUST BE AT
C       LEAST M.
C
C     Y
C       A TWO-DIMENSIONAL ARRAY THAT SPECIFIES THE VALUES OF THE RIGHT
C       SIDE OF THE LINEAR SYSTEM OF EQUATIONS GIVEN ABOVE.  Y MUST BE
C       DIMENSIONED AT LEAST M*N.
C
C     W
C       A ONE-DIMENSIONAL ARRAY THAT MUST BE PROVIDED BY THE USER FOR
C       WORK SPACE.  IF NP = 0, THE LENGTH OF W MUST BE AT LEAST
C                               (2NLOG2(N)+N+2+MAX(4N,6M)).
C                    IF NP = 1, (2(N+1)(LOG2(N+1)-1)+2+MAX(2N,6M)).
C
C
C     * * * * * * * * * *     ON OUTPUT     * * * * * * * * * *
C
C     Y
C       CONTAINS THE SOLUTION X.
C
C     IERROR
C       AN ERROR FLAG THAT INDICATES INVALID INPUT PARAMETERS.  EXCEPT
C       FOR NUMBER ZERO, A SOLUTION IS NOT ATTEMPTED.
C
C       = 0  NO ERROR.
C       = 1 M .LT. 5  .
C       = 2  N IS NOT THE FORM 2**K-1 WHEN NP = 1  .
C       = 3  N IS NOT OF THE FORM 2**K WHEN NP = 0  .
C       = 4  BLKTRI FAILED WHILE COMPUTING RESULTS THAT DEPEND ON THE
C            COEFFICIENT ARRAYS AN, BN, CN.  CHECK THESE ARRAYS.
C       = 5  IDIMY.LT. M.
C
C     W
C       CONTAINS INTERMEDIATE VALUES THAT MUST NOT BE DESTROYED IF
C       BLKTRI WILL BE CALLED AGAIN WITH IFLG = 1  .
C
C
C
      DIMENSION       AN(1)      ,BN(1)      ,CN(1)      ,AM(1)      ,
     1                BM(1)      ,CM(1)      ,Y(IDIMY,1) ,W(1)
      EXTERNAL        PROD       ,PRODP      ,CPROD      ,CPRODP
      COMMON /CBLKT/  NPP        ,K          ,EPS        ,CNV        ,
     1                NCMPLX     ,IK         ,IZ
C
C TEST M AND N FOR THE PROPER FORM
C
      IERROR = 1
      IF (M-5) 117,101,101
  101 NH = N
      NPP = NP
      IF (NPP) 102,103,102
  102 NH = NH+1
  103 IK = 2
      K = 0
  104 IK = IK+IK
      K = K+1
      IF (NH/IK) 105,105,104
  105 IF (NPP) 106,108,106
  106 IERROR = 2
      IWCN = 2*(N+1)*(K-1)-N+3
      IW1 = IWCN+N
      IWAH = IW1
      IWBH = IWAH+N
      IF (K-2) 117,107,107
  107 NCK = 2**K-1
      IF (N-NCK) 117,110,117
  108 IERROR = 3
      IWCN = 2*K*N+3
      IW1 = IWCN+N
      IWAH = IW1
      IWBH = IWAH+N+N
      IF (K-2) 117,109,109
  109 NCK = 2**K
      IF (N-NCK) 117,110,117
C
C DIVIDE W INTO SEVERAL SUB WORKING ARRAYS
C
  110 IERROR = 5
      IF (IDIMY-M) 117,111,111
  111 IERROR = 0
      IW2 = IW1+M
      IW3 = IW2+M
      IWD = IW3+M
      IWW = IWD+M
      IWU = IWW+M
      IF (IFLG) 114,112,114
  112 W(IWCN) = CN(N)
      I = IWCN
      DO 113 J=2,N
         I = I+1
         W(I) = CN(J-1)
  113 CONTINUE
C
C SUBROUTINE COMP B COMPUTES THE ROOTS OF THE B POLYNOMIALS
C
      CALL COMPB (N,IERROR,AN,BN,W(IWCN),W,W(IWAH),W(IWBH))
      GO TO 117
  114 IF (MP) 115,116,115
C
C SUBROUTINE BLKTR1 SOLVES THE LINEAR SYSTEM
C
  115 CALL BLKTR1 (N,AN,BN,W(IWCN),M,AM,BM,CM,IDIMY,Y,W,W(IW1),W(IW2),
     1             W(IW3),W(IWD),W(IWW),W(IWU),PROD,CPROD)
      GO TO 117
  116 CALL BLKTR1 (N,AN,BN,W(IWCN),M,AM,BM,CM,IDIMY,Y,W,W(IW1),W(IW2),
     1             W(IW3),W(IWD),W(IWW),W(IWU),PRODP,CPRODP)
  117 CONTINUE
      RETURN
      END
      SUBROUTINE BLKTR1 (N,AN,BN,CN,M,AM,BM,CM,IDIMY,Y,B,W1,W2,W3,WD,   POI03659
     1                   WW,WU,PRDCT,CPRDCT)
C
C BLKTR1 SOLVES THE LINEAR SYSTEM
C
C B  CONTAINS THE ROOTS OF ALL THE B POLYNOMIALS
C W1,W2,W3,WD,WW,WU  ARE ALL WORKING ARRAYS
C PRDCT  IS EITHER PRODP OR PROD DEPENDING ON WHETHER THE BOUNDARY
C CONDITIONS IN THE M DIRECTION ARE PERIODIC OR NOT
C CPRDCT IS EITHER CPRODP OR CPROD WHICH ARE THE COMPLEX VERSIONS
C OF PRODP AND PROD. THESE ARE CALLED IN THE EVENT THAT SOME
C OF THE ROOTS OF THE B SUB P POLYNOMIAL ARE COMPLEX
C
C
      DIMENSION       AN(1)      ,BN(1)      ,CN(1)      ,AM(1)      ,
     1                BM(1)      ,CM(1)      ,B(1)       ,W1(1)      ,
     2                W2(1)      ,W3(1)      ,WD(1)      ,WW(1)      ,
     3                WU(1)      ,Y(IDIMY,1)
      COMMON /CBLKT/  NPP        ,K          ,EPS        ,CNV        ,
     1                NCMPLX     ,IK         ,IZ
      NH = 2**K
      IH1 = NH+NH
C
C BEGIN REDUCTION PHASE
C
      KDO = K
      IF (NPP) 101,102,101
  101 KDO = K-1
  102 DO 108 L=1,KDO
         IR = L-1
         IZ = 2**IR
         ISGN = (-1)**IR
         MSGN = -ISGN
         IH2 = 2**(K-IR+1)
         LM = (IR-2)*IH1+IH2+IH2+1
         LZ = (IR-1)*IH1+IH2+1
         IIM = IZ-1
         IIZ = IIM+IIM+1
         JM1 = IIM+IIM+LM
         I1 = IZ+IZ
         CALL PRDCT (IIZ,B(LZ),IIM,B(LM),IIM,B(JM1),0,DUM,Y(1,IZ),W3,M,
     1               AM,BM,CM,WD,WW,WU,ISGN)
         IF = 2**(K-IR-1)
         DO 107 JJ=1,IF
            I = JJ*I1
            I6 = I
            I7 = I-IZ
            I9 = I+IZ
            J2 = JJ+JJ
            J4 = J2+J2
            JM1 = (J4-2)*IIM+LM
            JP1 = J4*IIM+LM
            JP2 = J2*IIZ+LZ
            JP3 = (J4+2)*IIM+LM
            IF (JJ-IF) 105,103,103
  103       IF (NPP) 107,104,107
  104       JP1 = LM
            JP2 = LZ
            JP3 = IIM+IIM+LM
            I6 = 0
            I9 = IZ
  105       CALL PRDCT (IIM,B(JM1),0,DUM,0,DUM,IZ,AN(I7+1),W3,W1,M,AM,
     1                  BM,CM,WD,WW,WU,MSGN)
            CALL PRDCT (IIZ,B(JP2),IIM,B(JP1),IIM,B(JP3),0,DUM,Y(1,I9),
     1                  W3,M,AM,BM,CM,WD,WW,WU,ISGN)
            CALL PRDCT (IIM,B(JP1),0,DUM,0,DUM,IZ,CN(I6+1),W3,W2,M,AM,
     1                  BM,CM,WD,WW,WU,MSGN)
            DO 106 J=1,M
               Y(J,I) = W1(J)+W2(J)-Y(J,I)
  106       CONTINUE
  107    CONTINUE
  108 CONTINUE
      IF (NPP) 112,109,112
  109 J2 = 2*N*(K-1)+3
      J1 = 2*N*(K-2)+5
      IF (NCMPLX) 110,111,110
  110 CALL CPRDCT (N,B(J2),N-1,B(J1),0,DUM,0,DUM,Y(1,N),Y(1,N),M,AM,BM,
     1             CM,W1,W3,WW,MSGN)
      GO TO 112
  111 CALL PRDCT (N,B(J2),N-1,B(J1),0,DUM,0,DUM,Y(1,N),Y(1,N),M,AM,BM,
     1            CM,WD,WW,WU,MSGN)
C
C BEGIN BACK SUBSTITUTION PHASE
C
  112 DO 126 LL=1,K
         L = K-LL+1
         IR = L-1
         ISGN = (-1)**IR
         MSGN = -ISGN
         IZ = 2**IR
         IIM = IZ-1
         IIZ = IIM+IIM+1
         IH2 = 2**(K-IR+1)
         LM = (IR-2)*IH1+IH2+IH2+1
         LZ = (IR-1)*IH1+IH2+1
         IF = 2**(K-IR)-1
         DO 125 JJ=1,IF,2
            I = JJ*IZ
            I5 = I-IZ
            I6 = I+IZ
            I7 = I5
            J2 = JJ+JJ
            JM1 = (J2-2)*IIM+LM
            JZ = (JJ-1)*IIZ+LZ
            JP1 = J2*IIM+LM
            IF (JJ-1) 113,113,117
  113       IF (NPP) 115,114,115
  114       I7 = N
            GO TO 117
  115       DO 116 J=1,M
               W1(J) = 0.
  116       CONTINUE
            GO TO 118
  117       CALL PRDCT (IIM,B(JM1),0,DUM,0,DUM,IZ,AN(I5+1),Y(1,I7),W1,
     1                  M,AM,BM,CM,WD,WW,WU,MSGN)
  118       IF (JJ-IF) 122,119,119
  119       IF (NPP) 120,122,120
  120       DO 121 J=1,M
               W2(J) = 0.
  121       CONTINUE
            GO TO 123
  122       CALL PRDCT (IIM,B(JP1),0,DUM,0,DUM,IZ,CN(I+1),Y(1,I6),W2,M,
     1                  AM,BM,CM,WD,WW,WU,MSGN)
  123       DO 124 J=1,M
               W1(J) = Y(J,I)-W1(J)-W2(J)
  124       CONTINUE
            CALL PRDCT (IIZ,B(JZ),IIM,B(JM1),IIM,B(JP1),0,DUM,W1,
     1                  Y(1,I),M,AM,BM,CM,WD,WW,WU,ISGN)
  125    CONTINUE
  126 CONTINUE
      RETURN
      END
      SUBROUTINE PROD (ND,BD,NM1,BM1,NM2,BM2,NA,AA,X,Y,M,A,B,C,D,W,U,IS)POI03792
C
C PROD APPLIES A SEQUENCE OF MATRIX OPERATIONS TO THE VECTOR X AND
C STORES THE RESULT IN Y
C BD,BM1,BM2 ARE ARRAYS CONTAINING ROOTS OF CERTIAN B POLYNOMIALS
C ND,NM1,NM2 ARE THE LENGTHS OF THE ARRAYS BD,BM1,BM2 RESPECTIVELY
C AA   ARRAY CONTAINING SCALAR MULTIPLIERS OF THE VECTOR X
C NA IS THE LENGTH OF THE ARRAY AA
C X,Y  THE MATRIX OPERATIONS ARE APPLIED TO X AND THE RESULT IS Y
C A,B,C  ARE ARRAYS WHICH CONTAIN THE TRIDIAGONAL MATRIX
C M  IS THE ORDER OF THE MATRIX
C D,W,U ARE WORKING ARRAYS
C IS  DETERMINES WHETHER OR NOT A CHANGE IN SIGN IS MADE
C
      DIMENSION       A(1)       ,B(1)       ,C(1)       ,X(1)       ,
     1                Y(1)       ,D(1)       ,W(1)       ,BD(1)      ,
     2                BM1(1)     ,BM2(1)     ,AA(1)      ,U(1)
      IF (ND) 102,102,101
  101 IF (IS) 104,104,102
  102 DO 103 J=1,M
         W(J) = X(J)
         Y(J) = X(J)
  103 CONTINUE
      GO TO 106
  104 DO 105 J=1,M
         W(J) = -X(J)
         Y(J) = W(J)
  105 CONTINUE
  106 MM = M-1
      ID = ND
      IBR = 0
      M1 = NM1
      M2 = NM2
      IA = NA
  107 IF (IA) 110,110,108
  108 RT = AA(IA)
      IA = IA-1
C
C SCALAR MULTIPLICATION
C
      DO 109 J=1,M
         Y(J) = RT*W(J)
  109 CONTINUE
  110 IF (ID) 130,130,111
  111 RT = BD(ID)
      ID = ID-1
      IF (ID .EQ. 0) IBR = 1
C
C BEGIN SOLUTION TO SYSTEM
C
      D(M) = A(M)/(B(M)-RT)
      W(M) = Y(M)/(B(M)-RT)
      DO 112 J=2,MM
         K = M-J
         DEN = B(K+1)-RT-C(K+1)*D(K+2)
         D(K+1) = A(K+1)/DEN
         W(K+1) = (Y(K+1)-C(K+1)*W(K+2))/DEN
  112 CONTINUE
      DEN = B(1)-RT-C(1)*D(2)
      W(1) = 1.
      IF (DEN) 113,114,113
  113 W(1) = (Y(1)-C(1)*W(2))/DEN
  114 DO 115 J=2,M
         W(J) = W(J)-D(J)*W(J-1)
  115 CONTINUE
      IF (NA) 118,118,107
  116 DO 117 J=1,M
         Y(J) = W(J)
  117 CONTINUE
      IBR = 1
      GO TO 107
  118 IF (M1) 119,119,120
  119 IF (M2) 116,116,125
  120 IF (M2) 122,122,121
  121 IF (ABS(BM1(M1))-ABS(BM2(M2))) 125,125,122
  122 IF (IBR) 123,123,124
  123 IF (ABS(BM1(M1)-BD(ID))-ABS(BM1(M1)-RT)) 116,124,124
  124 RT = RT-BM1(M1)
      M1 = M1-1
      GO TO 128
  125 IF (IBR) 126,126,127
  126 IF (ABS(BM2(M2)-BD(ID))-ABS(BM2(M2)-RT)) 116,127,127
  127 RT = RT-BM2(M2)
      M2 = M2-1
  128 DO 129 J=1,M
         Y(J) = Y(J)+RT*W(J)
  129 CONTINUE
      GO TO 107
  130 RETURN
      END
      SUBROUTINE PRODP (ND,BD,NM1,BM1,NM2,BM2,NA,AA,X,Y,M,A,B,C,D,U,W,  POI03883
     1                  IS)
C
C PRODP APPLIES A SEQUENCE OF MATRIX OPERATIONS TO THE VECTOR X AND
C STORES THE RESULT IN Y        PERIODIC BOUNDARY CONDITIONS
C
C BD,BM1,BM2 ARE ARRAYS CONTAINING ROOTS OF CERTIAN B POLYNOMIALS
C ND,NM1,NM2 ARE THE LENGTHS OF THE ARRAYS BD,BM1,BM2 RESPECTIVELY
C AA   ARRAY CONTAINING SCALAR MULTIPLIERS OF THE VECTOR X
C NA IS THE LENGTH OF THE ARRAY AA
C X,Y  THE MATRIX OPERATIONS ARE APPLIED TO X AND THE RESULT IS Y
C A,B,C  ARE ARRAYS WHICH CONTAIN THE TRIDIAGONAL MATRIX
C M  IS THE ORDER OF THE MATRIX
C D,U,W ARE WORKING ARRAYS
C IS  DETERMINES WHETHER OR NOT A CHANGE IN SIGN IS MADE
C
      DIMENSION       A(1)       ,B(1)       ,C(1)       ,X(1)       ,
     1                Y(1)       ,D(1)       ,U(1)       ,BD(1)      ,
     2                BM1(1)     ,BM2(1)     ,AA(1)      ,W(1)
      IF (ND) 102,102,101
  101 IF (IS) 104,104,102
  102 DO 103 J=1,M
         Y(J) = X(J)
         W(J) = X(J)
  103 CONTINUE
      GO TO 106
  104 DO 105 J=1,M
         Y(J) = -X(J)
         W(J) = Y(J)
  105 CONTINUE
  106 MM = M-1
      MM2 = M-2
      ID = ND
      IBR = 0
      M1 = NM1
      M2 = NM2
      IA = NA
  107 IF (IA) 110,110,108
  108 RT = AA(IA)
      IA = IA-1
      DO 109 J=1,M
         Y(J) = RT*W(J)
  109 CONTINUE
  110 IF (ID) 131,131,111
  111 RT = BD(ID)
      ID = ID-1
      IF (ID .EQ. 0) IBR = 1
C
C BEGIN SOLUTION TO SYSTEM
C
      BH = B(M)-RT
      YM = Y(M)
      DEN = B(1)-RT
      D(1) = C(1)/DEN
      U(1) = A(1)/DEN
      W(1) = Y(1)/DEN
      V = C(M)
      DO 112 J=2,MM2
         DEN = B(J)-RT-A(J)*D(J-1)
         D(J) = C(J)/DEN
         U(J) = -A(J)*U(J-1)/DEN
         W(J) = (Y(J)-A(J)*W(J-1))/DEN
         BH = BH-V*U(J-1)
         YM = YM-V*W(J-1)
         V = -V*D(J-1)
  112 CONTINUE
      DEN = B(M-1)-RT-A(M-1)*D(M-2)
      D(M-1) = (C(M-1)-A(M-1)*U(M-2))/DEN
      W(M-1) = (Y(M-1)-A(M-1)*W(M-2))/DEN
      AM = A(M)-V*D(M-2)
      BH = BH-V*U(M-2)
      YM = YM-V*W(M-2)
      DEN = BH-AM*D(M-1)
      IF (DEN) 113,114,113
  113 W(M) = (YM-AM*W(M-1))/DEN
      GO TO 115
  114 W(M) = 1.
  115 W(M-1) = W(M-1)-D(M-1)*W(M)
      DO 116 J=2,MM
         K = M-J
         W(K) = W(K)-D(K)*W(K+1)-U(K)*W(M)
  116 CONTINUE
      IF (NA) 119,119,107
  117 DO 118 J=1,M
         Y(J) = W(J)
  118 CONTINUE
      IBR = 1
      GO TO 107
  119 IF (M1) 120,120,121
  120 IF (M2) 117,117,126
  121 IF (M2) 123,123,122
  122 IF (ABS(BM1(M1))-ABS(BM2(M2))) 126,126,123
  123 IF (IBR) 124,124,125
  124 IF (ABS(BM1(M1)-BD(ID))-ABS(BM1(M1)-RT)) 117,125,125
  125 RT = RT-BM1(M1)
      M1 = M1-1
      GO TO 129
  126 IF (IBR) 127,127,128
  127 IF (ABS(BM2(M2)-BD(ID))-ABS(BM2(M2)-RT)) 117,128,128
  128 RT = RT-BM2(M2)
      M2 = M2-1
  129 DO 130 J=1,M
         Y(J) = Y(J)+RT*W(J)
  130 CONTINUE
      GO TO 107
  131 RETURN
      END
      SUBROUTINE CPROD (ND,BD,NM1,BM1,NM2,BM2,NA,AA,X,YY,M,A,B,C,D,W,Y, POI03991
     1                  ISGN)
C
C PROD APPLIES A SEQUENCE OF MATRIX OPERATIONS TO THE VECTOR X AND
C STORES THE RESULT IN YY           (COMPLEX CASE)
C AA   ARRAY CONTAINING SCALAR MULTIPLIERS OF THE VECTOR X
C ND,NM1,NM2 ARE THE LENGTHS OF THE ARRAYS BD,BM1,BM2 RESPECTIVELY
C BD,BM1,BM2 ARE ARRAYS CONTAINING ROOTS OF CERTIAN B POLYNOMIALS
C NA IS THE LENGTH OF THE ARRAY AA
C X,YY THE MATRIX OPERATIONS ARE APPLIED TO X AND THE RESULT IS YY
C A,B,C  ARE ARRAYS WHICH CONTAIN THE TRIDIAGONAL MATRIX
C M  IS THE ORDER OF THE MATRIX
C D,W,Y ARE WORKING ARRAYS
C ISGN  DETERMINES WHETHER OR NOT A CHANGE IN SIGN IS MADE
C
      COMPLEX         Y          ,D          ,W          ,BD         ,
     1                CRT        ,DEN        ,Y1         ,Y2
      DIMENSION       A(1)       ,B(1)       ,C(1)       ,X(1)       ,
     1                Y(1)       ,D(1)       ,W(1)       ,BD(1)      ,
     2                BM1(1)     ,BM2(1)     ,AA(1)      ,YY(1)
      IF (ND) 102,102,101
  101 IF (ISGN) 104,104,102
  102 DO 103 J=1,M
         Y(J) = CMPLX(X(J),0.)
  103 CONTINUE
      GO TO 106
  104 DO 105 J=1,M
         Y(J) = CMPLX(-X(J),0.)
  105 CONTINUE
  106 MM = M-1
      ID = ND
      M1 = NM1
      M2 = NM2
      IA = NA
  107 IFLG = 0
      IF (ID) 114,114,108
  108 CRT = BD(ID)
      ID = ID-1
      IFLG = 1
C
C BEGIN SOLUTION TO SYSTEM
C
      D(M) = A(M)/(B(M)-CRT)
      W(M) = Y(M)/(B(M)-CRT)
      DO 109 J=2,MM
         K = M-J
         DEN = B(K+1)-CRT-C(K+1)*D(K+2)
         D(K+1) = A(K+1)/DEN
         W(K+1) = (Y(K+1)-C(K+1)*W(K+2))/DEN
  109 CONTINUE
      DEN = B(1)-CRT-C(1)*D(2)
      IF (CABS(DEN)) 110,111,110
  110 Y(1) = (Y(1)-C(1)*W(2))/DEN
      GO TO 112
  111 Y(1) = (1.,0.)
  112 DO 113 J=2,M
         Y(J) = W(J)-D(J)*Y(J-1)
  113 CONTINUE
  114 IF (M1) 115,115,117
  115 IF (M2) 126,126,116
  116 RT = BM2(M2)
      M2 = M2-1
      GO TO 122
  117 IF (M2) 118,118,119
  118 RT = BM1(M1)
      M1 = M1-1
      GO TO 122
  119 IF (ABS(BM1(M1))-ABS(BM2(M2))) 121,121,120
  120 RT = BM1(M1)
      M1 = M1-1
      GO TO 122
  121 RT = BM2(M2)
      M2 = M2-1
  122 Y1 = (B(1)-RT)*Y(1)+C(1)*Y(2)
      IF (MM-2) 125,123,123
C
C MATRIX MULTIPLICATION
C
  123 DO 124 J=2,MM
         Y2 = A(J)*Y(J-1)+(B(J)-RT)*Y(J)+C(J)*Y(J+1)
         Y(J-1) = Y1
         Y1 = Y2
  124 CONTINUE
  125 Y(M) = A(M)*Y(M-1)+(B(M)-RT)*Y(M)
      Y(M-1) = Y1
      IFLG = 1
      GO TO 107
  126 IF (IA) 129,129,127
  127 RT = AA(IA)
      IA = IA-1
      IFLG = 1
C
C SCALAR MULTIPLICATION
C
      DO 128 J=1,M
         Y(J) = RT*Y(J)
  128 CONTINUE
  129 IF (IFLG) 130,130,107
  130 DO 131 J=1,M
         YY(J) = REAL(Y(J))
  131 CONTINUE
      RETURN
      END
      SUBROUTINE CPRODP (ND,BD,NM1,BM1,NM2,BM2,NA,AA,X,YY,M,A,B,C,D,U,  POI04095
     1                   Y,ISGN)
C
C PRODP APPLIES A SEQUENCE OF MATRIX OPERATIONS TO THE VECTOR X AND
C STORES THE RESULT IN YY       PERIODIC BOUNDARY CONDITIONS
C AND  COMPLEX  CASE
C
C BD,BM1,BM2 ARE ARRAYS CONTAINING ROOTS OF CERTIAN B POLYNOMIALS
C ND,NM1,NM2 ARE THE LENGTHS OF THE ARRAYS BD,BM1,BM2 RESPECTIVELY
C AA   ARRAY CONTAINING SCALAR MULTIPLIERS OF THE VECTOR X
C NA IS THE LENGTH OF THE ARRAY AA
C X,YY THE MATRIX OPERATIONS ARE APPLIED TO X AND THE RESULT IS YY
C A,B,C  ARE ARRAYS WHICH CONTAIN THE TRIDIAGONAL MATRIX
C M  IS THE ORDER OF THE MATRIX
C D,U,Y ARE WORKING ARRAYS
C ISGN  DETERMINES WHETHER OR NOT A CHANGE IN SIGN IS MADE
C
      COMPLEX         Y          ,D          ,U          ,V          ,
     1                DEN        ,BH         ,YM         ,AM         ,
     2                Y1         ,Y2         ,YH         ,BD         ,
     3                CRT
      DIMENSION       A(1)       ,B(1)       ,C(1)       ,X(1)       ,
     1                Y(1)       ,D(1)       ,U(1)       ,BD(1)      ,
     2                BM1(1)     ,BM2(1)     ,AA(1)      ,YY(1)
      IF (ND) 102,102,101
  101 IF (ISGN) 104,104,102
  102 DO 103 J=1,M
         Y(J) = CMPLX(X(J),0.)
  103 CONTINUE
      GO TO 106
  104 DO 105 J=1,M
         Y(J) = CMPLX(-X(J),0.)
  105 CONTINUE
  106 MM = M-1
      MM2 = M-2
      ID = ND
      M1 = NM1
      M2 = NM2
      IA = NA
  107 IFLG = 0
      IF (ID) 114,114,108
  108 CRT = BD(ID)
      ID = ID-1
      IFLG = 1
C
C BEGIN SOLUTION TO SYSTEM
C
      BH = B(M)-CRT
      YM = Y(M)
      DEN = B(1)-CRT
      D(1) = C(1)/DEN
      U(1) = A(1)/DEN
      Y(1) = Y(1)/DEN
      V = CMPLX(C(M),0.)
      DO 109 J=2,MM2
         DEN = B(J)-CRT-A(J)*D(J-1)
         D(J) = C(J)/DEN
         U(J) = -A(J)*U(J-1)/DEN
         Y(J) = (Y(J)-A(J)*Y(J-1))/DEN
         BH = BH-V*U(J-1)
         YM = YM-V*Y(J-1)
         V = -V*D(J-1)
  109 CONTINUE
      DEN = B(M-1)-CRT-A(M-1)*D(M-2)
      D(M-1) = (C(M-1)-A(M-1)*U(M-2))/DEN
      Y(M-1) = (Y(M-1)-A(M-1)*Y(M-2))/DEN
      AM = A(M)-V*D(M-2)
      BH = BH-V*U(M-2)
      YM = YM-V*Y(M-2)
      DEN = BH-AM*D(M-1)
      IF (CABS(DEN)) 110,111,110
  110 Y(M) = (YM-AM*Y(M-1))/DEN
      GO TO 112
  111 Y(M) = (1.,0.)
  112 Y(M-1) = Y(M-1)-D(M-1)*Y(M)
      DO 113 J=2,MM
         K = M-J
         Y(K) = Y(K)-D(K)*Y(K+1)-U(K)*Y(M)
  113 CONTINUE
  114 IF (M1) 115,115,117
  115 IF (M2) 126,126,116
  116 RT = BM2(M2)
      M2 = M2-1
      GO TO 122
  117 IF (M2) 118,118,119
  118 RT = BM1(M1)
      M1 = M1-1
      GO TO 122
  119 IF (ABS(BM1(M1))-ABS(BM2(M2))) 121,121,120
  120 RT = BM1(M1)
      M1 = M1-1
      GO TO 122
  121 RT = BM2(M2)
      M2 = M2-1
C
C MATRIX MULTIPLICATION
C
  122 YH = Y(1)
      Y1 = (B(1)-RT)*Y(1)+C(1)*Y(2)+A(1)*Y(M)
      IF (MM-2) 125,123,123
  123 DO 124 J=2,MM
         Y2 = A(J)*Y(J-1)+(B(J)-RT)*Y(J)+C(J)*Y(J+1)
         Y(J-1) = Y1
         Y1 = Y2
  124 CONTINUE
  125 Y(M) = A(M)*Y(M-1)+(B(M)-RT)*Y(M)+C(M)*YH
      Y(M-1) = Y1
      IFLG = 1
      GO TO 107
  126 IF (IA) 129,129,127
  127 RT = AA(IA)
      IA = IA-1
      IFLG = 1
C
C SCALAR MULTIPLICATION
C
      DO 128 J=1,M
         Y(J) = RT*Y(J)
  128 CONTINUE
  129 IF (IFLG) 130,130,107
  130 DO 131 J=1,M
         YY(J) = REAL(Y(J))
  131 CONTINUE
      RETURN
      END
      SUBROUTINE PPADD (N,IERROR,A,C,CBP,BP,BH,BN)                      POI04221
C
C PPADD COMPUTES THE ROOTS OF THE B SUB P POLYNOMIAL
C THIS ROUTINE IS CALLED AT THE LAST STEP OF THE PREPROCESSING PHASE
C IN THE CASE OF PERIODIC BOUNDARY CONDITIONS
C
C N IS THE ORDER OF THE BH AND BP POLYNOMIALS
C BP IS WHERE THE ROOTS OF THE B SUB P POLYNOMIAL ARE STORED
C CBP IS THE SAME AS BP EXCEPT TYPE COMPLEX
C BH IS USED TO TEMPORARILY STORE THE ROOTS OF THE B HAT POLYNOMIAL
C WHICH ENTERS THROUGH BP
C BN IS TEMPORARY STORAGE USED TO INDICATE THE TYPE OF ROOT IN BP
C WHETHER REAL, DOUBLE OR COMPLEX
C
      COMPLEX         CF         ,CX         ,FSG        ,HSG        ,
     1                DD         ,F          ,FP         ,FPP        ,
     2                CDIS       ,R1         ,R2         ,R3         ,
     3                CBP
      DIMENSION       A(1)       ,C(1)       ,BP(1)      ,BH(1)      ,
     1                BN(1)      ,CBP(1)
      COMMON /CBLKT/  NPP        ,K          ,EPS        ,CNV        ,
     1                NCMPLX     ,IK         ,IZ
      EXTERNAL        PSGF       ,PPSPF      ,PPSGF
      SCNV = SQRT(CNV)
      IZ = N
      IZM2 = IZ-2
      DO 101 J=1,IZ
         BH(J) = BP(J)
  101 CONTINUE
      XL = BH(1)
      DB = BH(3)-BH(1)
  102 XL = XL-DB
      IF (PSGF(XL,IZ,C,A,BH)) 102,103,103
  103 SGN = -1.
      CBP(1) = CMPLX(BSRH(XL,BH(1),IZ,C,A,BH,PSGF,SGN),0.)
      XR = BH(IZ)
      DB = BH(IZ)-BH(IZ-2)
  104 XR = XR+DB
      IF (PSGF(XR,IZ,C,A,BH)) 104,105,105
  105 SGN = 1.
      CBP(IZ) = CMPLX(BSRH(BH(IZ),XR,IZ,C,A,BH,PSGF,SGN),0.)
      DO 121 IG=2,IZM2,2
         XL = BH(IG)
         XR = BH(IG+1)
         SGN = -1.
         XM = BSRH(XL,XR,IZ,C,A,BH,PPSPF,SGN)
         PSG = PSGF(XM,IZ,C,A,BH)
         IF (PSG-EPS) 107,106,106
C
C     CASE OF A REAL ZERO
C
  106    SGN = 1.
         CBP(IG) = CMPLX(BSRH(BH(IG),XM,IZ,C,A,BH,PSGF,SGN),0.)
         SGN = -1.
         CBP(IG+1) = CMPLX(BSRH(XM,BH(IG+1),IZ,C,A,BH,PSGF,SGN),0.)
         BN(IG) = 0.
         BN(IG+1) = 0.
         GO TO 121
C
C     CASE OF A COMPLEX ZERO
C
  107    IT = 0
         ICV = 0
         CX = CMPLX(XM,0.)
  108    FSG = (1.,0.)
         HSG = (1.,0.)
         FP = (0.,0.)
         FPP = (0.,0.)
         DO 109 J=1,IZ
            DD = 1./(CX-BH(J))
            FSG = FSG*A(J)*DD
            HSG = HSG*C(J)*DD
            FP = FP+DD
            FPP = FPP-DD*DD
  109    CONTINUE
         F = (1.,0.)-FSG-HSG
         I3 = 0
         IF (CABS(FP)) 111,111,110
  110    I3 = 1
         R3 = -F/FP
  111    I2 = 0
         IF (CABS(FPP)) 117,117,112
  112    I2 = 1
         CDIS = CSQRT(FP**2-2.*F*FPP)
         R1 = CDIS-FP
         R2 = -FP-CDIS
         IF (CABS(R1)-CABS(R2)) 114,114,113
  113    R1 = R1/FPP
         GO TO 115
  114    R1 = R2/FPP
  115    R2 = 2.*F/FPP/R1
         IF (CABS(R2) .LT. CABS(R1)) R1 = R2
         IF (I3) 118,118,116
  116    IF (CABS(R3) .LT. CABS(R1)) R1 = R3
         GO TO 118
  117    R1 = R3
  118    CX = CX+R1
         IT = IT+1
         IF (IT .GT. 50) GO TO 124
         IF (CABS(R1) .GT. SCNV) GO TO 108
         IF (ICV) 119,119,120
  119    ICV = 1
         GO TO 108
  120    CBP(IG) = CX
         CBP(IG+1) = CONJG(CX)
  121 CONTINUE
      NCMPLX = 1
      DO 122 J=2,IZ
         IF (AIMAG(CBP(J))) 125,122,125
  122 CONTINUE
      NCMPLX = 0
      DO 123 J=2,IZ
         BP(J) = REAL(CBP(J))
  123 CONTINUE
      GO TO 125
  124 IERROR = 4
  125 CONTINUE
      RETURN
      END
      FUNCTION PSGF (X,IZ,C,A,BH)                                       POI04341
      DIMENSION       A(1)       ,C(1)       ,BH(1)
      FSG = 1.
      HSG = 1.
      DO 101 J=1,IZ
         DD = 1./(X-BH(J))
         FSG = FSG*A(J)*DD
         HSG = HSG*C(J)*DD
  101 CONTINUE
      PSGF = 1.-FSG-HSG
      RETURN
      END
      FUNCTION BSRH (XLL,XRR,IZ,C,A,BH,F,SGN)                           POI04354
      DIMENSION       A(1)       ,C(1)       ,BH(1)
      COMMON /CBLKT/  NPP        ,K          ,EPS        ,CNV        ,
     1                NCMPLX     ,IK         ,IZZ
      XL = XLL
      XR = XRR
      DX = .5*ABS(XR-XL)
  101 X = .5*(XL+XR)
      IF (SGN*F(X,IZ,C,A,BH)) 103,105,102
  102 XR = X
      GO TO 104
  103 XL = X
  104 DX = .5*DX
      IF (DX-CNV) 105,105,101
  105 BSRH = .5*(XL+XR)
      RETURN
      END
      FUNCTION PPSGF (X,IZ,C,A,BH)                                      POI04372
      DIMENSION       A(1)       ,C(1)       ,BH(1)
      SUM = 0.
      DO 101 J=1,IZ
         SUM = SUM-1./(X-BH(J))**2
  101 CONTINUE
      PPSGF = SUM
      RETURN
      END
      FUNCTION PPSPF (X,IZ,C,A,BH)                                      POI04382
      DIMENSION       A(1)       ,C(1)       ,BH(1)
      SUM = 0.
      DO 101 J=1,IZ
         SUM = SUM+1./(X-BH(J))
  101 CONTINUE
      PPSPF = SUM
      RETURN
      END
      SUBROUTINE COMPB (N,IERROR,AN,BN,CN,B,AH,BH)                      POI04392
C
C     COMPB COMPUTES THE ROOTS OF THE B POLYNOMIALS USING THE EISPACK
C     SUBROUTINE IMTQL1.  IERROR IS SET TO 4 IF IF EITHER IMTQL1 FAILS
C     OR IF A(J+1)*C(J) IS LESS THAN ZERO FOR SOME J.
C     AH,BH ARE TEMPORARY WORK ARRAYS
C
      DIMENSION       AN(1)      ,BN(1)      ,CN(1)      ,B(1)       ,
     1                AH(1)      ,BH(1)
      COMMON /CBLKT/  NPP        ,K          ,EPS        ,CNV        ,
     1                NCMPLX     ,IK         ,IZ
      EPS = APXEPS(DUM)
      BNORM = ABS(BN(1))
      DO 101 J=2,N
         BNORM = AMAX1(BNORM,ABS(BN(J)))
  101 CONTINUE
      CNV = EPS*BNORM
      DO 107 J=1,N
         IF (J-1) 103,102,103
  102    IF (NPP) 107,103,107
  103    ARG = AN(J)*CN(J)
         IF (ARG) 126,104,104
  104    CHLD = SQRT(ARG)
         IF (CN(J)) 106,105,105
  105    B(J) = CHLD
         GO TO 107
  106    B(J) = -CHLD
  107 CONTINUE
      IF = 2**K
      LH = IF
      LH1 = IF+1
      I1 = 1
      DO 119 L=1,K
         I1 = I1+I1
         NN = I1+I1-1
         IFL = IF-I1+1
         DO 118 I=1,IFL,I1
            IF (I-IFL) 113,108,108
  108       IF (NPP) 109,110,109
  109       LH = LH+NN
            GO TO 118
  110       LS = 0
            DO 111 J=I,IF
               LS = LS+1
               BH(LS) = BN(J)
               AH(LS) = B(J)
  111       CONTINUE
            I1M = I1-1
            DO 112 J=1,I1M
               LS = LS+1
               BH(LS) = BN(J)
               AH(LS) = B(J)
  112       CONTINUE
            GO TO 115
  113       LS = 0
            JFL = I+NN-1
            DO 114 J=I,JFL
               LS = LS+1
               BH(LS) = BN(J)
               AH(LS) = B(J)
  114       CONTINUE
  115       CALL TQLRAT (NN,BH,AH,IERROR)
            IF (IERROR) 126,116,126
  116       DO 117 J=1,NN
               LH = LH+1
               B(LH) = -BH(J)
  117       CONTINUE
  118    CONTINUE
         LH1 = LH+1
  119 CONTINUE
      DO 120 J=1,N
         B(J) = -BN(J)
  120 CONTINUE
      IF (NPP) 125,121,125
  121 J2 = 2*N*(K-1)+4
      LH = J2
      J1 = J2-N-N+1
      N2M2 = J2+N+N-4
  122 D1 = ABS(B(J1)-B(J2-1))
      D2 = ABS(B(J1)-B(J2))
      D3 = ABS(B(J1)-B(J2+1))
      IF ((D2 .LT. D1) .AND. (D2 .LT. D3)) GO TO 123
      B(LH) = B(J2)
      J2 = J2+1
      LH = LH+1
      IF (J2-N2M2) 122,122,124
  123 J2 = J2+1
      J1 = J1+1
      IF (J2-N2M2) 122,122,124
  124 B(LH) = B(N2M2+1)
      J1 = 2*N*(K-1)+3
      J2 = J1+N+N+N
      J3 = J2+N
      CALL PPADD (N,IERROR,AN,CN,B(J1),B(J1),B(J2),B(J3))
  125 RETURN
  126 IERROR = 4
      RETURN
      END
      SUBROUTINE TQLRAT (N,D,E2,IERR)                                   POI04491
C
      INTEGER         I          ,J          ,L          ,M          ,
     1                N          ,II         ,L1         ,MML        ,
     2                IERR
      REAL            D(N)       ,E2(N)
      REAL            B          ,C          ,F          ,G          ,
     1                H          ,P          ,R          ,S          ,
     2                MACHEP
C
C     REAL SQRT,ABS,SIGN
C
      COMMON /CBLKT/  NPP        ,K          ,MACHEP     ,CNV        ,
     1                NCMPLX     ,IK         ,IZ
C
C     THIS SUBROUTINE IS A TRANSLATION OF THE ALGOL PROCEDURE TQLRAT,
C     ALGORITHM 464, COMM. ACM 16, 689(1973) BY REINSCH.
C
C     THIS SUBROUTINE FINDS THE EIGENVALUES OF A SYMMETRIC
C     TRIDIAGONAL MATRIX BY THE RATIONAL QL METHOD.
C
C     ON INPUT-
C
C        N IS THE ORDER OF THE MATRIX,
C
C        D CONTAINS THE DIAGONAL ELEMENTS OF THE INPUT MATRIX,
C
C        E2 CONTAINS THE                SUBDIAGONAL ELEMENTS OF THE
C          INPUT MATRIX IN ITS LAST N-1 POSITIONS.  E2(1) IS ARBITRARY.
C
C      ON OUTPUT-
C
C        D CONTAINS THE EIGENVALUES IN ASCENDING ORDER.  IF AN
C          ERROR EXIT IS MADE, THE EIGENVALUES ARE CORRECT AND
C          ORDERED FOR INDICES 1,2,...IERR-1, BUT MAY NOT BE
C          THE SMALLEST EIGENVALUES,
C
C        E2 HAS BEEN DESTROYED,
C
C        IERR IS SET TO
C          ZERO       FOR NORMAL RETURN,
C          J          IF THE J-TH EIGENVALUE HAS NOT BEEN
C                     DETERMINED AFTER 30 ITERATIONS.
C
C     QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO B. S. GARBOW,
C     APPLIED MATHEMATICS DIVISION, ARGONNE NATIONAL LABORATORY
C
C
C     ********** MACHEP IS A MACHINE DEPENDENT PARAMETER SPECIFYING
C                THE RELATIVE PRECISION OF FLOATING POINT ARITHMETIC.
C
C                **********
C
      IERR = 0
      IF (N .EQ. 1) GO TO 114
C
      DO 101 I=2,N
         E2(I-1) = E2(I)*E2(I)
  101 CONTINUE
C
      F = 0.0
      B = 0.0
      E2(N) = 0.0
C
      DO 112 L=1,N
         J = 0
         H = MACHEP*(ABS(D(L))+SQRT(E2(L)))
         IF (B .GT. H) GO TO 102
         B = H
         C = B*B
C
C     ********** LOOK FOR SMALL SQUARED SUB-DIAGONAL ELEMENT **********
C
  102    DO 103 M=L,N
            IF (E2(M) .LE. C) GO TO 104
C
C     ********** E2(N) IS ALWAYS ZERO, SO THERE IS NO EXIT
C                THROUGH THE BOTTOM OF THE LOOP **********
C
  103    CONTINUE
C
  104    IF (M .EQ. L) GO TO 108
  105    IF (J .EQ. 30) GO TO 113
         J = J+1
C
C     ********** FORM SHIFT **********
C
         L1 = L+1
         S = SQRT(E2(L))
         G = D(L)
         P = (D(L1)-G)/(2.0*S)
         R = SQRT(P*P+1.0)
         D(L) = S/(P+SIGN(R,P))
         H = G-D(L)
C
         DO 106 I=L1,N
            D(I) = D(I)-H
  106    CONTINUE
C
         F = F+H
C
C     ********** RATIONAL QL TRANSFORMATION **********
C
         G = D(M)
         IF (G .EQ. 0.0) G = B
         H = G
         S = 0.0
         MML = M-L
C
C     ********** FOR I=M-1 STEP -1 UNTIL L DO -- **********
C
         DO 107 II=1,MML
            I = M-II
            P = G*H
            R = P+E2(I)
            E2(I+1) = S*R
            S = E2(I)/R
            D(I+1) = H+S*(H+D(I))
            G = D(I)-E2(I)/G
            IF (G .EQ. 0.0) G = B
            H = G*P/R
  107    CONTINUE
C
         E2(L) = S*G
         D(L) = H
C
C     ********** GUARD AGAINST UNDERFLOWED H **********
C
         IF (H .EQ. 0.0) GO TO 108
         IF (ABS(E2(L)) .LE. ABS(C/H)) GO TO 108
         E2(L) = H*E2(L)
         IF (E2(L) .NE. 0.0) GO TO 105
  108    P = D(L)+F
C
C     ********** ORDER EIGENVALUES **********
C
         IF (L .EQ. 1) GO TO 110
C
C     ********** FOR I=L STEP -1 UNTIL 2 DO -- **********
C
         ABSP = ABS(P)
         DO 109 II=2,L
            I = L+2-II
            IF (ABSP .GE. ABS(D(I-1))) GO TO 111
            D(I) = D(I-1)
  109    CONTINUE
C
  110    I = 1
  111    D(I) = P
  112 CONTINUE
C
      GO TO 114
C
C     ********** SET ERROR -- NO CONVERGENCE TO AN
C                EIGENVALUE AFTER 30 ITERATIONS **********
C
  113 IERR = L
  114 RETURN
C
C     ********** LAST CARD OF TQLRAT **********
C
      END
      FUNCTION NCHECK (N)                                               POI04654
C
C     THIS SUBPROGRAM CHECKS THE FORM OF N.
C     IF N = 2**P, THEN NCHECK = 0.
C     IF N = (2**P)(3**Q)(5**Q), THEN NCHECK = 1.
C     OTHERWISE, NCHECK = 2.
C
      NP = N
  101 K = NP/2
      IF (2*K .NE. NP) GO TO 102
      NP = K
      GO TO 101
  102 IF (NP .NE. 1) GO TO 103
      NCHECK = 0
      RETURN
  103 K = NP/3
      IF (3*K .NE. NP) GO TO 104
      NP = K
      GO TO 103
  104 K = NP/5
      IF (5*K .NE. NP) GO TO 105
      NP = K
      GO TO 104
  105 IF (NP .NE. 1) GO TO 106
      NCHECK = 1
      RETURN
  106 NCHECK = 2
      RETURN
      END
      FUNCTION APXEPS (DUM)                                             POI04684
      COMMON /VALUE/  V
      EPS = 1.
  101 EPS = EPS/10.
      CALL STORE (EPS+1.)
      IF (V-1.) 102,102,101
  102 APXEPS = 100.*EPS
      RETURN
      END
      SUBROUTINE STORE (X)                                              POI04694
      COMMON /VALUE/  V
      V = X
      RETURN
      END
C     PROGRAM XAMPLE                                                    POI04700
C                                                                       POI04701
C***********************************************************************POI04702
C                                                                       POI04703
C          VERSION  2  OCTOBER 1976  INCLUDING ERRATA  OCTOBER 1976     POI04704
C                                                                       POI04705
C         DOCUMENTATION FOR THIS PROGRAM IS GIVEN IN                    POI04706
C                                                                       POI04707
C        EFFICIENT FORTRAN SUBPROGRAMS FOR THE SOLUTION OF              POI04708
C            ELLIPTIC PARTIAL DIFFERENTIAL EQUATIONS                    POI04709
C                                                                       POI04710
C                              BY                                       POI04711
C                                                                       POI04712
C          PAUL SWARZTRAUBER   AND  ROLAND SWEET                        POI04713
C                                                                       POI04714
C             TECHNICAL NOTE TN/IA-109   JULY 1975                      POI04715
C                                                                       POI04716
C       NATIONAL CENTER FOR ATMOSPHERIC RESEARCH  BOULDER,COLORADO 80307POI04717
C                                                                       POI04718
C        WHICH IS SPONSORED BY THE NATIONAL SCIENCE FOUNDATION          POI04719
C                                                                       POI04720
C***********************************************************************POI04721
C                                                                       POI04722
C                                                                       POI04723
C     PROGRAM TO ILLUSTRATE THE USE OF PWSCRT.                          POI04724
C                                                                       POI04725
      DIMENSION       F(120,100) ,BDB(81)    ,W(1294)    ,X(101)     ,  POI04726
     1                Y(81)                                             POI04727
C                                                                       POI04728
C     FROM DIMENSION STATEMENT WE GET VALUE OF IDIMF.  ALSO NOTE THAT W POI04729
C     IS DIMENSIONED 6*(N+1) + 8*(M+1).                                 POI04730
C                                                                       POI04731
      IDIMF = 120                                                       POI04732
      INTL = 0                                                          POI04733
      A = 0.                                                            POI04734
      B = 2.                                                            POI04735
      M = 100                                                           POI04736
      MBDCND = 2                                                        POI04737
      C = -1.                                                           POI04738
      D = 3.                                                            POI04739
      N = 80                                                            POI04740
      NBDCND = 0                                                        POI04741
      ELMBDA = -4.                                                      POI04742
C                                                                       POI04743
C     AUXILIARY QUANTITIES.                                             POI04744
C                                                                       POI04745
      PI = 3.14159265358979                                             POI04746
      PIBY2 = PI/2.                                                     POI04747
      PISQ = PI**2                                                      POI04748
      MP1 = M+1                                                         POI04749
      NP1 = N+1                                                         POI04750
C                                                                       POI04751
C     GENERATE AND STORE GRID POINTS FOR THE PURPOSE OF COMPUTING       POI04752
C     BOUNDARY DATA AND THE RIGHT SIDE OF THE HELMHOLTZ EQUATION.       POI04753
C                                                                       POI04754
      DO 101 I=1,MP1                                                    POI04755
         X(I) = FLOAT(I-1)/50.                                          POI04756
  101 CONTINUE                                                          POI04757
      DO 102 J=1,NP1                                                    POI04758
         Y(J) = -1.+FLOAT(J-1)/20.                                      POI04759
  102 CONTINUE                                                          POI04760
C                                                                       POI04761
C     GENERATE BOUNDARY DATA.                                           POI04762
C                                                                       POI04763
      DO 103 J=1,NP1                                                    POI04764
         BDB(J) = 4.*COS((Y(J)+1.)*PIBY2)                               POI04765
  103 CONTINUE                                                          POI04766
C                                                                       POI04767
C     BDA, BDC, AND BDD ARE DUMMY VARIABLES.                            POI04768
C                                                                       POI04769
      DO 104 J=1,NP1                                                    POI04770
         F(1,J) = 0.                                                    POI04771
  104 CONTINUE                                                          POI04772
C                                                                       POI04773
C     GENERATE RIGHT SIDE OF EQUATION.                                  POI04774
C                                                                       POI04775
      DO 106 I=2,MP1                                                    POI04776
         DO 105 J=1,NP1                                                 POI04777
            F(I,J) = (2.-(4.+PISQ/4.)*X(I)**2)*COS((Y(J)+1.)*PIBY2)     POI04778
  105    CONTINUE                                                       POI04779
  106 CONTINUE                                                          POI04780
      CALL PWSCRT (INTL,A,B,M,MBDCND,BDA,BDB,C,D,N,NBDCND,BDC,BDD,      POI04781
     1             ELMBDA,F,IDIMF,PERTRB,IERROR,W)                      POI04782
C                                                                       POI04783
C     COMPUTE DISCRETIZATION ERROR.  THE EXACT SOLUTION IS              POI04784
C                U(X,Y) = X**2*COS((Y+1)*PIBY2)                         POI04785
C                                                                       POI04786
      ERR = 0.                                                          POI04787
      DO 108 I=1,MP1                                                    POI04788
         DO 107 J=1,NP1                                                 POI04789
            Z = ABS(F(I,J)-X(I)**2*COS((Y(J)+1.)*PIBY2))                POI04790
            IF (Z .GT. ERR) ERR = Z                                     POI04791
  107    CONTINUE                                                       POI04792
  108 CONTINUE                                                          POI04793
      PRINT 1001 , IERROR,ERR                                           POI04794
C                                                                       POI04795
C                                                                       POI04796
C                                                                       POI04797
 1001 FORMAT (///9H IERROR =,I2,10X,22HDISCRETIZATION ERROR =,E12.5)    POI04798
C                                                                       POI04799
      END                                                               POI04800
C     PROGRAM XAMPLE                                                    POI04802
C                                                                       POI04803
C***********************************************************************POI04804
C                                                                       POI04805
C          VERSION  2  OCTOBER 1976  INCLUDING ERRATA  OCTOBER 1976     POI04806
C                                                                       POI04807
C         DOCUMENTATION FOR THIS PROGRAM IS GIVEN IN                    POI04808
C                                                                       POI04809
C        EFFICIENT FORTRAN SUBPROGRAMS FOR THE SOLUTION OF              POI04810
C            ELLIPTIC PARTIAL DIFFERENTIAL EQUATIONS                    POI04811
C                                                                       POI04812
C                              BY                                       POI04813
C                                                                       POI04814
C          PAUL SWARZTRAUBER   AND  ROLAND SWEET                        POI04815
C                                                                       POI04816
C             TECHNICAL NOTE TN/IA-109   JULY 1975                      POI04817
C                                                                       POI04818
C       NATIONAL CENTER FOR ATMOSPHERIC RESEARCH  BOULDER,COLORADO 80307POI04819
C                                                                       POI04820
C        WHICH IS SPONSORED BY THE NATIONAL SCIENCE FOUNDATION          POI04821
C                                                                       POI04822
C***********************************************************************POI04823
C                                                                       POI04824
C                                                                       POI04825
C     PROGRAM TO ILLUSTRATE THE USE OF PWSPLR.                          POI04826
C                                                                       POI04827
      DIMENSION       F(100,50)  ,BDC(51)    ,BDD(51)    ,W(702)     ,  POI04828
     1                R(51)      ,THETA(49)                             POI04829
C                                                                       POI04830
C     FROM DIMENSION STATEMENT WE GET VALUE OF IDIMF.  ALSO NOTE THAT W POI04831
C     IS DIMENSIONED 6*(N+1) + 8*(M+1).                                 POI04832
C                                                                       POI04833
      IDIMF = 100                                                       POI04834
      INTL = 0                                                          POI04835
      A = 0.                                                            POI04836
      B = 1.                                                            POI04837
      M = 50                                                            POI04838
      MBDCND = 5                                                        POI04839
      C = 0.                                                            POI04840
      PI = 3.14159265358979                                             POI04841
      D = PI/2.                                                         POI04842
      N = 48                                                            POI04843
      NBDCND = 3                                                        POI04844
      ELMBDA = 0.                                                       POI04845
C                                                                       POI04846
C     AUXILIARY QUANTITIES.                                             POI04847
C                                                                       POI04848
      MP1 = M+1                                                         POI04849
      NP1 = N+1                                                         POI04850
C                                                                       POI04851
C     GENERATE AND STORE GRID POINTS FOR THE PURPOSE OF COMPUTING       POI04852
C     BOUNDARY DATA AND THE RIGHT SIDE OF THE POISSON EQUATION.         POI04853
C                                                                       POI04854
      DO 101 I=1,MP1                                                    POI04855
         R(I) = FLOAT(I-1)/50.                                          POI04856
  101 CONTINUE                                                          POI04857
      DO 102 J=1,NP1                                                    POI04858
         THETA(J) = FLOAT(J-1)*PI/96.                                   POI04859
  102 CONTINUE                                                          POI04860
C                                                                       POI04861
C     GENERATE BOUNDARY DATA.                                           POI04862
C                                                                       POI04863
      DO 103 I=1,MP1                                                    POI04864
         BDC(I) = 0.                                                    POI04865
         BDD(I) = 0.                                                    POI04866
  103 CONTINUE                                                          POI04867
C                                                                       POI04868
C     BDA AND BDB ARE DUMMY VARIABLES.                                  POI04869
C                                                                       POI04870
      DO 104 J=1,NP1                                                    POI04871
         F(MP1,J) = 1.-COS(4.*THETA(J))                                 POI04872
  104 CONTINUE                                                          POI04873
C                                                                       POI04874
C     GENERATE RIGHT SIDE OF EQUATION.                                  POI04875
C                                                                       POI04876
      DO 106 I=1,M                                                      POI04877
         DO 105 J=1,NP1                                                 POI04878
            F(I,J) = 16.*R(I)**2                                        POI04879
  105    CONTINUE                                                       POI04880
  106 CONTINUE                                                          POI04881
      CALL PWSPLR (INTL,A,B,M,MBDCND,BDA,BDB,C,D,N,NBDCND,BDC,BDD,      POI04882
     1             ELMBDA,F,IDIMF,PERTRB,IERROR,W)                      POI04883
C                                                                       POI04884
C     COMPUTE DISCRETIZATION ERROR.  THE EXACT SOLUTION IS              POI04885
C                U(R,THETA) = R**4*(1 - COS(4*THETA))                   POI04886
C                                                                       POI04887
      ERR = 0.                                                          POI04888
      DO 108 I=1,MP1                                                    POI04889
         DO 107 J=1,NP1                                                 POI04890
            Z = ABS(F(I,J)-R(I)**4*(1.-COS(4.*THETA(J))))               POI04891
            IF (Z .GT. ERR) ERR = Z                                     POI04892
  107    CONTINUE                                                       POI04893
  108 CONTINUE                                                          POI04894
      PRINT 1001 , IERROR,ERR                                           POI04895
      STOP                                                              POI04896
C                                                                       POI04897
C                                                                       POI04898
C                                                                       POI04899
 1001 FORMAT (///9H IERROR =,I2,10X,22HDISCRETIZATION ERROR =,E12.5)    POI04900
C                                                                       POI04901
      END                                                               POI04902
C     PROGRAM XAMPLE                                                    POI04904
C                                                                       POI04905
C***********************************************************************POI04906
C                                                                       POI04907
C          VERSION  2  OCTOBER 1976  INCLUDING ERRATA  OCTOBER 1976     POI04908
C                                                                       POI04909
C         DOCUMENTATION FOR THIS PROGRAM IS GIVEN IN                    POI04910
C                                                                       POI04911
C        EFFICIENT FORTRAN SUBPROGRAMS FOR THE SOLUTION OF              POI04912
C            ELLIPTIC PARTIAL DIFFERENTIAL EQUATIONS                    POI04913
C                                                                       POI04914
C                              BY                                       POI04915
C                                                                       POI04916
C          PAUL SWARZTRAUBER   AND  ROLAND SWEET                        POI04917
C                                                                       POI04918
C             TECHNICAL NOTE TN/IA-109   JULY 1975                      POI04919
C                                                                       POI04920
C       NATIONAL CENTER FOR ATMOSPHERIC RESEARCH  BOULDER,COLORADO 80307POI04921
C                                                                       POI04922
C        WHICH IS SPONSORED BY THE NATIONAL SCIENCE FOUNDATION          POI04923
C                                                                       POI04924
C***********************************************************************POI04925
C                                                                       POI04926
C                                                                       POI04927
C     PROGRAM TO ILLUSTRATE THE USE OF PWSCYL.                          POI04928
C                                                                       POI04929
      DIMENSION       F(75,105)  ,BDA(101)   ,BDB(101)   ,BDC(51)    ,  POI04930
     1                BDD(51)    ,W(1014)    ,R(51)      ,Z(101)        POI04931
C                                                                       POI04932
C     FROM DIMENSION STATEMENT WE GET VALUE OF IDIMF.  ALSO NOTE THAT W POI04933
C     IS DIMENSIONED 6*(N+1) + 8*(M+1).                                 POI04934
C                                                                       POI04935
      IDIMF = 75                                                        POI04936
      INTL = 0                                                          POI04937
      A = 0.                                                            POI04938
      B = 1.                                                            POI04939
      M = 50                                                            POI04940
      MBDCND = 6                                                        POI04941
      C = 0.                                                            POI04942
      D = 1.                                                            POI04943
      N = 100                                                           POI04944
      NBDCND = 3                                                        POI04945
      ELMBDA = 0.                                                       POI04946
C                                                                       POI04947
C     AUXILIARY QUANTITIES.                                             POI04948
C                                                                       POI04949
      MP1 = M+1                                                         POI04950
      NP1 = N+1                                                         POI04951
C                                                                       POI04952
C     GENERATE AND STORE GRID POINTS FOR THE PURPOSE OF COMPUTING       POI04953
C     BOUNDARY DATA AND THE RIGHT SIDE OF THE POISSON EQUATION.         POI04954
C                                                                       POI04955
      DO 101 I=1,MP1                                                    POI04956
         R(I) = FLOAT(I-1)/50.                                          POI04957
  101 CONTINUE                                                          POI04958
      DO 102 J=1,NP1                                                    POI04959
         Z(J) = FLOAT(J-1)/100.                                         POI04960
  102 CONTINUE                                                          POI04961
C                                                                       POI04962
C     GENERATE BOUNDARY DATA.                                           POI04963
C                                                                       POI04964
      DO 103 J=1,NP1                                                    POI04965
         BDB(J) = 4.*Z(J)**4                                            POI04966
  103 CONTINUE                                                          POI04967
      DO 104 I=1,MP1                                                    POI04968
         BDC(I) = 0.                                                    POI04969
         BDD(I) = 4.*R(I)**4                                            POI04970
  104 CONTINUE                                                          POI04971
C                                                                       POI04972
C     BDA IS A DUMMY VARIABLE.                                          POI04973
C                                                                       POI04974
C                                                                       POI04975
C     GENERATE RIGHT SIDE OF EQUATION.                                  POI04976
C                                                                       POI04977
      DO 106 I=1,MP1                                                    POI04978
         DO 105 J=1,NP1                                                 POI04979
            F(I,J) = 4.*R(I)**2*Z(J)**2*(4.*Z(J)**2+3.*R(I)**2)         POI04980
  105    CONTINUE                                                       POI04981
  106 CONTINUE                                                          POI04982
      CALL PWSCYL (INTL,A,B,M,MBDCND,BDA,BDB,C,D,N,NBDCND,BDC,BDD,      POI04983
     1             ELMBDA,F,IDIMF,PERTRB,IERROR,W)                      POI04984
C                                                                       POI04985
C     COMPUTE DISCRETIZATION ERROR BY MINIMIZING OVER ALL A THE FUNCTIONPOI04986
C     NORM(F(I,J) - A*1 - U(R(I),Z(J))).  THE EXACT SOLUTION IS         POI04987
C                U(R,Z) = (R*Z)**4 + ARBITRARY CONSTANT.                POI04988
C                                                                       POI04989
      X = 0.                                                            POI04990
      DO 108 I=1,MP1                                                    POI04991
         DO 107 J=1,NP1                                                 POI04992
            X = X+F(I,J)-(R(I)*Z(J))**4                                 POI04993
  107    CONTINUE                                                       POI04994
  108 CONTINUE                                                          POI04995
      X = X/FLOAT(NP1*MP1)                                              POI04996
      DO 110 I=1,MP1                                                    POI04997
         DO 109 J=1,NP1                                                 POI04998
            F(I,J) = F(I,J)-X                                           POI04999
  109    CONTINUE                                                       POI05000
  110 CONTINUE                                                          POI05001
      ERR = 0.                                                          POI05002
      DO 112 I=1,MP1                                                    POI05003
         DO 111 J=1,NP1                                                 POI05004
            X = ABS(F(I,J)-(R(I)*Z(J))**4)                              POI05005
            IF (X .GT. ERR) ERR = X                                     POI05006
  111    CONTINUE                                                       POI05007
  112 CONTINUE                                                          POI05008
      PRINT 1001 , PERTRB,IERROR,ERR                                    POI05009
      STOP                                                              POI05010
C                                                                       POI05011
C                                                                       POI05012
C                                                                       POI05013
 1001 FORMAT (///9H PERTRB =,E12.5,10X,8HIERROR =,I2,10X,               POI05014
     1        22HDISCRETIZATION ERROR =,E12.5)                          POI05015
C                                                                       POI05016
      END                                                               POI05017
C     PROGRAM XAMPLE                                                    POI05019
C                                                                       POI05020
C***********************************************************************POI05021
C                                                                       POI05022
C          VERSION  2  OCTOBER 1976  INCLUDING ERRATA  OCTOBER 1976     POI05023
C                                                                       POI05024
C         DOCUMENTATION FOR THIS PROGRAM IS GIVEN IN                    POI05025
C                                                                       POI05026
C        EFFICIENT FORTRAN SUBPROGRAMS FOR THE SOLUTION OF              POI05027
C            ELLIPTIC PARTIAL DIFFERENTIAL EQUATIONS                    POI05028
C                                                                       POI05029
C                              BY                                       POI05030
C                                                                       POI05031
C          PAUL SWARZTRAUBER   AND  ROLAND SWEET                        POI05032
C                                                                       POI05033
C             TECHNICAL NOTE TN/IA-109   JULY 1975                      POI05034
C                                                                       POI05035
C       NATIONAL CENTER FOR ATMOSPHERIC RESEARCH  BOULDER,COLORADO 80307POI05036
C                                                                       POI05037
C        WHICH IS SPONSORED BY THE NATIONAL SCIENCE FOUNDATION          POI05038
C                                                                       POI05039
C***********************************************************************POI05040
C                                                                       POI05041
C                                                                       POI05042
C     PROGRAM TO ILLUSTRATE THE USE OF PWSSSP                           POI05043
C                                                                       POI05044
      DIMENSION       F(19,73)   ,BDTF(73)   ,SINT(19)   ,SINP(73)   ,  POI05045
     1                W(647)                                            POI05046
C                                                                       POI05047
C     THE VALUE OF IDIMF IS THE FIRST DIMENSION OF F. W IS DIMENSIONED  POI05048
C     11*(M+1)+6X(N+1)=647 SINCE M=18 AND N=72                          POI05049
C                                                                       POI05050
      PI = 3.141592653589793                                            POI05051
      INTL = 0                                                          POI05052
      TS = 0                                                            POI05053
      TF = PI/2.                                                        POI05054
      M = 18                                                            POI05055
      MBDCND = 6                                                        POI05056
      PS = 0                                                            POI05057
      PF = PI+PI                                                        POI05058
      N = 72                                                            POI05059
      NBDCND = 0                                                        POI05060
      ELMBDA = 0.                                                       POI05061
      IDIMF = 19                                                        POI05062
C                                                                       POI05063
C     GENERATE SINES FOR USE IN SUBSEQUENT COMPUTATIONS                 POI05064
C                                                                       POI05065
      DTHETA = TF/FLOAT(M)                                              POI05066
      MP1 = M+1                                                         POI05067
      DO 101 I=1,MP1                                                    POI05068
         SINT(I) = SIN(FLOAT(I-1)*DTHETA)                               POI05069
  101 CONTINUE                                                          POI05070
      DPHI = (PI+PI)/FLOAT(N)                                           POI05071
      NP1 = N+1                                                         POI05072
      DO 102 J=1,NP1                                                    POI05073
         SINP(J) = SIN(FLOAT(J-1)*DPHI)                                 POI05074
  102 CONTINUE                                                          POI05075
C                                                                       POI05076
C     COMPUTE RIGHT SIDE OF EQUATION AND STORE IN F                     POI05077
C                                                                       POI05078
      DO 104 J=1,NP1                                                    POI05079
         DO 103 I=1,MP1                                                 POI05080
            F(I,J) = 2.-6.*(SINT(I)*SINP(J))**2                         POI05081
  103    CONTINUE                                                       POI05082
  104 CONTINUE                                                          POI05083
C                                                                       POI05084
C     STORE DERIVATIVE DATA AT THE EQUATOR                              POI05085
C                                                                       POI05086
      DO 105 J=1,NP1                                                    POI05087
         BDTF(J) = 0.                                                   POI05088
  105 CONTINUE                                                          POI05089
C                                                                       POI05090
      CALL PWSSSP (INTL,TS,TF,M,MBDCND,BDTS,BDTF,PS,PF,N,NBDCND,BDPS,   POI05091
     1             BDPF,ELMBDA,F,IDIMF,PERTRB,IERROR,W)                 POI05092
C                                                                       POI05093
C     COMPUTE DISCRETIZATION ERROR. SINCE PROBLEM IS SINGULAR, THE      POI05094
C     SOLUTION MUST BE NORMALIZED.                                      POI05095
C                                                                       POI05096
      ERR = 0                                                           POI05097
      DO 107 J=1,NP1                                                    POI05098
         DO 106 I=1,MP1                                                 POI05099
            Z = ABS(F(I,J)-(SINT(I)*SINP(J))**2-F(1,1))                 POI05100
            IF (Z .GT. ERR) ERR = Z                                     POI05101
  106    CONTINUE                                                       POI05102
  107 CONTINUE                                                          POI05103
C                                                                       POI05104
      PRINT 1001 , IERROR,ERR,PERTRB                                    POI05105
      STOP                                                              POI05106
C                                                                       POI05107
C                                                                       POI05108
C                                                                       POI05109
 1001 FORMAT (///9H IERROR= ,I3,10X,22H DISCRETIZATION ERR = ,E12.4,    POI05110
     1        14H PERTURBATION=,E12.4)                                  POI05111
C                                                                       POI05112
      END                                                               POI05113
C     PROGRAM XAMPLE                                                    POI05115
C                                                                       POI05116
C***********************************************************************POI05117
C                                                                       POI05118
C          VERSION  2  OCTOBER 1976  INCLUDING ERRATA  OCTOBER 1976     POI05119
C                                                                       POI05120
C         DOCUMENTATION FOR THIS PROGRAM IS GIVEN IN                    POI05121
C                                                                       POI05122
C        EFFICIENT FORTRAN SUBPROGRAMS FOR THE SOLUTION OF              POI05123
C            ELLIPTIC PARTIAL DIFFERENTIAL EQUATIONS                    POI05124
C                                                                       POI05125
C                              BY                                       POI05126
C                                                                       POI05127
C          PAUL SWARZTRAUBER   AND  ROLAND SWEET                        POI05128
C                                                                       POI05129
C             TECHNICAL NOTE TN/IA-109   JULY 1975                      POI05130
C                                                                       POI05131
C       NATIONAL CENTER FOR ATMOSPHERIC RESEARCH  BOULDER,COLORADO 80307POI05132
C                                                                       POI05133
C        WHICH IS SPONSORED BY THE NATIONAL SCIENCE FOUNDATION          POI05134
C                                                                       POI05135
C***********************************************************************POI05136
C                                                                       POI05137
C                                                                       POI05138
C     PROGRAM TO ILLUSTRATE THE USE OF PWSCSP                           POI05139
C                                                                       POI05140
      DIMENSION       F(48,33)   ,BDTF(33)   ,W(902)     ,R(33)      ,  POI05141
     1                THETA(48)                                         POI05142
C                                                                       POI05143
C     THE VALUE OF IDIMF IS THE FIRST DIMENSION OF F. SINCE N=31,L=32   POI05144
C     THEREFORE K=5 AND W IS DIMENSIONED 2(L+1)(K-1)+6(M+N)+MAX(4N,6M)  POI05145
C     +14 = 902                                                         POI05146
C                                                                       POI05147
      PI = 3.141592653589793                                            POI05148
      INTL = 0                                                          POI05149
      TS = 0.                                                           POI05150
      TF = PI/2.                                                        POI05151
      M = 36                                                            POI05152
      MBDCND = 6                                                        POI05153
      RS = 0.                                                           POI05154
      RF = 1.                                                           POI05155
      N = 32                                                            POI05156
      NBDCND = 5                                                        POI05157
      ELMBDA = 0.                                                       POI05158
      IDIMF = 48                                                        POI05159
C                                                                       POI05160
C     GENERATE AND STORE GRID POINTS FOR THE PURPOSE OF COMPUTING THE   POI05161
C     BOUNDARY DATA AND THE RIGHT SIDE OF THE EQUATION.                 POI05162
C                                                                       POI05163
      MP1 = M+1                                                         POI05164
      DTHETA = TF/FLOAT(M)                                              POI05165
      DO 101 I=1,MP1                                                    POI05166
         THETA(I) = FLOAT(I-1)*DTHETA                                   POI05167
  101 CONTINUE                                                          POI05168
      NP1 = N+1                                                         POI05169
      DR = 1./FLOAT(N)                                                  POI05170
      DO 102 J=1,NP1                                                    POI05171
         R(J) = FLOAT(J-1)*DR                                           POI05172
  102 CONTINUE                                                          POI05173
C                                                                       POI05174
C     GENERATE NORMAL DERIVATIVE DATA AT EQUATOR                        POI05175
C                                                                       POI05176
      DO 103 J=1,NP1                                                    POI05177
         BDTF(J) = 0.                                                   POI05178
  103 CONTINUE                                                          POI05179
C                                                                       POI05180
C     COMPUTE BOUNDARY DATA ON THE SURFACE OF THE SPHERE                POI05181
C                                                                       POI05182
      DO 104 I=1,MP1                                                    POI05183
         F(I,N+1) = COS(THETA(I))**4                                    POI05184
  104 CONTINUE                                                          POI05185
C                                                                       POI05186
C     COMPUTE RIGHT SIDE OF EQUATION                                    POI05187
C                                                                       POI05188
      DO 106 I=1,MP1                                                    POI05189
         CI4 = 12.*COS(THETA(I))**2                                     POI05190
         DO 105 J=1,N                                                   POI05191
            F(I,J) = CI4*R(J)**2                                        POI05192
  105    CONTINUE                                                       POI05193
  106 CONTINUE                                                          POI05194
C                                                                       POI05195
      CALL PWSCSP (INTL,TS,TF,M,MBDCND,BDTS,BDTF,RS,RF,N,NBDCND,BDRS,   POI05196
     1             BDRF,ELMBDA,F,IDIMF,PERTRB,IERROR,W)                 POI05197
C                                                                       POI05198
C     COMPUTE DISCRETIZATION ERROR                                      POI05199
C                                                                       POI05200
      ERR = 0.                                                          POI05201
      DO 108 I=1,MP1                                                    POI05202
         CI4 = COS(THETA(I))**4                                         POI05203
         DO 107 J=1,N                                                   POI05204
            Z = ABS(F(I,J)-CI4*R(J)**4)                                 POI05205
            IF (Z .GT. ERR) ERR = Z                                     POI05206
  107    CONTINUE                                                       POI05207
  108 CONTINUE                                                          POI05208
      PRINT 1001 , IERROR,ERR                                           POI05209
C                                                                       POI05210
C     THE FOLLOWING PROGRAM ILLUSTRATES THE USE OF PWSCSP TO SOLVE      POI05211
C     A THREE DIMENSIONAL PROBLEM WHICH HAS LONGITUDNAL DEPENDENCE      POI05212
C                                                                       POI05213
      MBDCND = 2                                                        POI05214
      NBDCND = 1                                                        POI05215
      DPHI = PI/72.                                                     POI05216
      ELMBDA = -2.*(1.-COS(DPHI))/DPHI**2                               POI05217
C                                                                       POI05218
C     COMPUTE BOUNDARY DATA ON THE SURFACE OF THE SPHERE                POI05219
C                                                                       POI05220
      DO 109 I=1,MP1                                                    POI05221
         F(I,N+1) = SIN(THETA(I))                                       POI05222
  109 CONTINUE                                                          POI05223
C                                                                       POI05224
C     COMPUTE RIGHT SIDE OF THE EQUATION                                POI05225
C                                                                       POI05226
      DO 111 J=1,N                                                      POI05227
         DO 110 I=1,MP1                                                 POI05228
            F(I,J) = 0.                                                 POI05229
  110    CONTINUE                                                       POI05230
  111 CONTINUE                                                          POI05231
C                                                                       POI05232
      CALL PWSCSP (INTL,TS,TF,M,MBDCND,BDTS,BDTF,RS,RF,N,NBDCND,BDRS,   POI05233
     1             BDRF,ELMBDA,F,IDIMF,PERTRB,IERROR,W)                 POI05234
C                                                                       POI05235
C     COMPUTE DISCRETIZATION ERROR   (FOURIER COEFFICIENTS)             POI05236
C                                                                       POI05237
      ERR = 0                                                           POI05238
      DO 113 I=1,MP1                                                    POI05239
         SI = SIN(THETA(I))                                             POI05240
         DO 112 J=1,NP1                                                 POI05241
            Z = ABS(F(I,J)-R(J)*SI)                                     POI05242
            IF (Z .GT. ERR) ERR = Z                                     POI05243
  112    CONTINUE                                                       POI05244
  113 CONTINUE                                                          POI05245
C                                                                       POI05246
      PRINT 1001 , IERROR,ERR                                           POI05247
      STOP                                                              POI05248
C                                                                       POI05249
C                                                                       POI05250
C                                                                       POI05251
 1001 FORMAT (///9H IERROR =,I3,10X,22HDISCRETIZATION ERROR =,E12.4)    POI05252
C                                                                       POI05253
      END                                                               POI05254
C     PROGRAM XAMPLE                                                    POI05256
C                                                                       POI05257
C***********************************************************************POI05258
C                                                                       POI05259
C          VERSION  3  OCTOBER 1978                                     POI05260
C                                                                       POI05261
C         DOCUMENTATION FOR THIS PROGRAM IS GIVEN IN                    POI05262
C                                                                       POI05263
C        EFFICIENT FORTRAN SUBPROGRAMS FOR THE SOLUTION OF              POI05264
C            ELLIPTIC PARTIAL DIFFERENTIAL EQUATIONS                    POI05265
C                                                                       POI05266
C                              BY                                       POI05267
C                                                                       POI05268
C          PAUL SWARZTRAUBER   AND  ROLAND SWEET                        POI05269
C                                                                       POI05270
C             TECHNICAL NOTE TN/IA-109   JULY 1975                      POI05271
C                                                                       POI05272
C       NATIONAL CENTER FOR ATMOSPHERIC RESEARCH  BOULDER,COLORADO 80307POI05273
C                                                                       POI05274
C        WHICH IS SPONSORED BY THE NATIONAL SCIENCE FOUNDATION          POI05275
C                                                                       POI05276
C***********************************************************************POI05277
C                                                                       POI05278
C                                                                       POI05279
C     PROGRAM TO ILLUSTRATE THE USE OF SUBROUTINE POIS.                 POI05280
C                                                                       POI05281
      DIMENSION       F(25,130)  ,A(20)      ,B(20)      ,C(20)      ,  POI05282
     1                W(820)     ,X(20)      ,Y(120)                    POI05283
C                                                                       POI05284
C     FROM DIMENSION STATEMENT WE GET VALUE OF IDIMY.  ALSO NOTE THAT W POI05285
C     IS DIMENSIONED 6*(N+1) + 5*(M+1).                                 POI05286
C                                                                       POI05287
      IDIMY = 25                                                        POI05288
      IFLG = 0                                                          POI05289
      MPEROD = 1                                                        POI05290
      M = 20                                                            POI05291
      DELTAX = 1./FLOAT(M)                                              POI05292
      NPEROD = 0                                                        POI05293
      N = 120                                                           POI05294
      PI = 3.14159265358979                                             POI05295
      DELTAY = 2.*PI/FLOAT(N)                                           POI05296
C                                                                       POI05297
C     GENERATE AND STORE GRID POINTS FOR THE PURPOSE OF COMPUTING       POI05298
C     COEFFICIENTS AND RIGHT SIDE OF EQUATION.                          POI05299
C                                                                       POI05300
      DO 101 I=1,M                                                      POI05301
         X(I) = FLOAT(I-1)*DELTAX                                       POI05302
  101 CONTINUE                                                          POI05303
      DO 102 J=1,120                                                    POI05304
         Y(J) = -PI+FLOAT(J-1)*DELTAY                                   POI05305
  102 CONTINUE                                                          POI05306
C                                                                       POI05307
C     GENERATE COEFFICIENTS.                                            POI05308
C                                                                       POI05309
      S = (DELTAY/DELTAX)**2                                            POI05310
      T = S*DELTAX                                                      POI05311
      A(1) = 0.                                                         POI05312
      B(1) = -2.*S                                                      POI05313
      C(1) = 2.*S                                                       POI05314
      DO 103 I=2,M                                                      POI05315
         A(I) = (1.+X(I))**2*S+(1.+X(I))*T                              POI05316
         C(I) = (1.+X(I))**2*S-(1.+X(I))*T                              POI05317
         B(I) = -2.*(1.+X(I))**2*S                                      POI05318
  103 CONTINUE                                                          POI05319
      C(M) = 0.                                                         POI05320
C                                                                       POI05321
C     GENERATE RIGHT SIDE OF EQUATION FOR I = 1 SHOWING INTRODUCTION OF POI05322
C     BOUNDARY DATA.                                                    POI05323
C                                                                       POI05324
      DYSQ = DELTAY**2                                                  POI05325
      DO 104 J=1,N                                                      POI05326
         F(1,J) = DYSQ*(11.+8./DELTAX)*SIN(Y(J))                        POI05327
  104 CONTINUE                                                          POI05328
C                                                                       POI05329
C     GENERATE RIGHT SIDE.                                              POI05330
C                                                                       POI05331
      MM1 = M-1                                                         POI05332
      DO 106 I=2,MM1                                                    POI05333
         DO 105 J=1,N                                                   POI05334
            F(I,J) = DYSQ*3.*(1.+X(I))**4*SIN(Y(J))                     POI05335
  105    CONTINUE                                                       POI05336
  106 CONTINUE                                                          POI05337
C                                                                       POI05338
C     GENERATE RIGHT SIDE FOR I = M SHOWING INTRODUCTION OF             POI05339
C     BOUNDARY DATA.                                                    POI05340
C                                                                       POI05341
      DO 107 J=1,N                                                      POI05342
         F(M,J) = DYSQ*(3.*(1.+X(M))**4-16.*((1.+X(M))/DELTAX)**2+      POI05343
     1                                   16.*(1.+X(M))/DELTAX)*SIN(Y(J))POI05344
  107 CONTINUE                                                          POI05345
      CALL POIS (IFLG,NPEROD,N,MPEROD,M,A,B,C,IDIMY,F,IERROR,W)         POI05346
C                                                                       POI05347
C     COMPUTE DISCRETIATION ERROR.  THE EXACT SOLUTION IS               POI05348
C                   U(X,Y) = (1+X)**4*SIN(Y)                            POI05349
C                                                                       POI05350
      ERR = 0.                                                          POI05351
      DO 109 I=1,M                                                      POI05352
         DO 108 J=1,N                                                   POI05353
            Z = ABS(F(I,J)-(1.+X(I))**4*SIN(Y(J)))                      POI05354
            IF (Z .GT. ERR) ERR = Z                                     POI05355
  108    CONTINUE                                                       POI05356
  109 CONTINUE                                                          POI05357
      PRINT 1001 , IERROR,ERR                                           POI05358
      STOP                                                              POI05359
C                                                                       POI05360
C                                                                       POI05361
C                                                                       POI05362
 1001 FORMAT (///9H IERROR =,I3,10X,22HDISCRETIZATION ERROR =,E12.4)    POI05363
C                                                                       POI05364
      END                                                               POI05365
C     PROGRAM XAMPLE                                                    POI05367
C                                                                       POI05368
C***********************************************************************POI05369
C                                                                       POI05370
C          VERSION  2  OCTOBER 1976  INCLUDING ERRATA  OCTOBER 1976     POI05371
C                                                                       POI05372
C         DOCUMENTATION FOR THIS PROGRAM IS GIVEN IN                    POI05373
C                                                                       POI05374
C        EFFICIENT FORTRAN SUBPROGRAMS FOR THE SOLUTION OF              POI05375
C            ELLIPTIC PARTIAL DIFFERENTIAL EQUATIONS                    POI05376
C                                                                       POI05377
C                              BY                                       POI05378
C                                                                       POI05379
C          PAUL SWARZTRAUBER   AND  ROLAND SWEET                        POI05380
C                                                                       POI05381
C             TECHNICAL NOTE TN/IA-109   JULY 1975                      POI05382
C                                                                       POI05383
C       NATIONAL CENTER FOR ATMOSPHERIC RESEARCH  BOULDER,COLORADO 80307POI05384
C                                                                       POI05385
C        WHICH IS SPONSORED BY THE NATIONAL SCIENCE FOUNDATION          POI05386
C                                                                       POI05387
C***********************************************************************POI05388
C                                                                       POI05389
C                                                                       POI05390
C     PROGRAM TO ILLUSTRATE THE USE OF BLKTRI                           POI05391
C                                                                       POI05392
      DIMENSION       Y(75,105)  ,AM(75)     ,BM(75)     ,CM(75)     ,  POI05393
     1                AN(105)    ,BN(105)    ,CN(105)    ,W(942)     ,  POI05394
     2                S(75)      ,T(105)                                POI05395
C                                                                       POI05396
C     THE VALUE OF IDIMY IS THE FIRST DIMENSION OF Y. SINCE NP=1 W IS   POI05397
C     DIMENSIONED 2*(N+1)*(LOG2(N+1)-1)+2+MAX(2*N,6*M)=942              POI05398
C                                                                       POI05399
      IFLG = 0                                                          POI05400
      NP = 1                                                            POI05401
      N = 63                                                            POI05402
      MP = 1                                                            POI05403
      M = 50                                                            POI05404
      IDIMY = 75                                                        POI05405
C                                                                       POI05406
C     GENERATE AND STORE GRID POINTS FOR THE PURPOSE OF COMPUTING THE   POI05407
C     COEFFICIENTS AND THE ARRAY Y.                                     POI05408
C                                                                       POI05409
      DELTAS = 1./FLOAT(M+1)                                            POI05410
      DO 101 I=1,M                                                      POI05411
         S(I) = FLOAT(I)*DELTAS                                         POI05412
  101 CONTINUE                                                          POI05413
      DELTAT = 1./FLOAT(N+1)                                            POI05414
      DO 102 J=1,N                                                      POI05415
         T(J) = FLOAT(J)*DELTAT                                         POI05416
  102 CONTINUE                                                          POI05417
C                                                                       POI05418
C     COMPUTE THE COEFFICIENTS AM,BM,CM CORRESPONDING TO THE S DIRECTIONPOI05419
C                                                                       POI05420
      HDS = DELTAS/2.                                                   POI05421
      TDS = DELTAS+DELTAS                                               POI05422
      DO 103 I=1,M                                                      POI05423
         TEMP1 = 1./(S(I)*TDS)                                          POI05424
         TEMP2 = 1./((S(I)-HDS)*TDS)                                    POI05425
         TEMP3 = 1./((S(I)+HDS)*TDS)                                    POI05426
         AM(I) = TEMP1*TEMP2                                            POI05427
         CM(I) = TEMP1*TEMP3                                            POI05428
         BM(I) = -(AM(I)+CM(I))                                         POI05429
  103 CONTINUE                                                          POI05430
C                                                                       POI05431
C     COMPUTE THE COEFFICIENTS AN,BN,CN CORRESPONDING TO THE T DIRECTIONPOI05432
C                                                                       POI05433
      HDT = DELTAT/2.                                                   POI05434
      TDT = DELTAT+DELTAT                                               POI05435
      DO 104 J=1,N                                                      POI05436
         TEMP1 = 1./(T(J)*TDT)                                          POI05437
         TEMP2 = 1./((T(J)-HDT)*TDT)                                    POI05438
         TEMP3 = 1./((T(J)+HDT)*TDT)                                    POI05439
         AN(J) = TEMP1*TEMP2                                            POI05440
         CN(J) = TEMP1*TEMP3                                            POI05441
         BN(J) = -(AN(J)+CN(J))                                         POI05442
  104 CONTINUE                                                          POI05443
C                                                                       POI05444
C     COMPUTE RIGHT SIDE OF EQUATION                                    POI05445
C                                                                       POI05446
      DO 106 J=1,N                                                      POI05447
         DO 105 I=1,M                                                   POI05448
            Y(I,J) = 3.75*S(I)*T(J)*(S(I)**4+T(J)**4)                   POI05449
  105    CONTINUE                                                       POI05450
  106 CONTINUE                                                          POI05451
C                                                                       POI05452
C     INCLUDE NONHOMOGENEOUS BOUNDARY INTO RIGHT SIDE. NOTE THAT THE    POI05453
C     CORNER AT J=N,I=M INCLUDES CONTRIBUTIONS FROM BOTH BOUNDARIES.    POI05454
C                                                                       POI05455
      DO 107 J=1,N                                                      POI05456
         Y(M,J) = Y(M,J)-CM(M)*T(J)**5                                  POI05457
  107 CONTINUE                                                          POI05458
      DO 108 I=1,M                                                      POI05459
         Y(I,N) = Y(I,N)-CN(N)*S(I)**5                                  POI05460
  108 CONTINUE                                                          POI05461
C                                                                       POI05462
  109 CALL BLKTRI (IFLG,NP,N,AN,BN,CN,MP,M,AM,BM,CM,IDIMY,Y,IERROR,W)   POI05463
      IFLG = IFLG+1                                                     POI05464
      IF (IFLG-1) 109,109,110                                           POI05465
C                                                                       POI05466
C     COMPUTE DISCRETIZATION ERROR                                      POI05467
C                                                                       POI05468
  110 ERR = 0.                                                          POI05469
      DO 112 J=1,N                                                      POI05470
         DO 111 I=1,M                                                   POI05471
            Z = ABS(Y(I,J)-(S(I)*T(J))**5)                              POI05472
            IF (Z .GT. ERR) ERR = Z                                     POI05473
  111    CONTINUE                                                       POI05474
  112 CONTINUE                                                          POI05475
      PRINT 1001 , IERROR,ERR                                           POI05476
      STOP                                                              POI05477
C                                                                       POI05478
C                                                                       POI05479
C                                                                       POI05480
 1001 FORMAT (///9H IERROR =,I3,10X,22HDISCRETIZATION ERROR =,E12.4)    POI05481
C                                                                       POI05482
      END                                                               POI05483
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
