***************************************************************************
  * All the software  contained in this library  is protected by copyright. *
  * Permission  to use, copy, modify, and  distribute this software for any *
  * purpose without fee is hereby granted, provided that this entire notice *
  * is included  in all copies  of any software which is or includes a copy *
  * or modification  of this software  and in all copies  of the supporting *
  * documentation for such software.                                        *
  ***************************************************************************
  * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED *
  * WARRANTY. IN NO EVENT, NEITHER  THE AUTHORS, NOR THE PUBLISHER, NOR ANY *
  * MEMBER  OF THE EDITORIAL BOARD OF  THE JOURNAL  "NUMERICAL ALGORITHMS", *
  * NOR ITS EDITOR-IN-CHIEF, BE  LIABLE FOR ANY ERROR  IN THE SOFTWARE, ANY *
  * MISUSE  OF IT  OR ANY DAMAGE ARISING OUT OF ITS USE. THE ENTIRE RISK OF *
  * USING THE SOFTWARE LIES WITH THE PARTY DOING SO.                        *
  ***************************************************************************
  * ANY USE  OF THE SOFTWARE  CONSTITUTES  ACCEPTANCE  OF THE TERMS  OF THE *
  * ABOVE STATEMENT.                                                        *
  ***************************************************************************

   AUTHOR:

       M.-J. LAI
          UNIVERSITY OF UTAH - U.S.A.

   REFERENCE:

       FORTRAN SUBROUTINES FOR B-NETS OF BOX SPLINES ON THREE- AND
       FOUR-DIRECTIONAL MESHES, 
       NUMERICAL ALGORITHMS, 2 (1992) PP. 33-38

   SOFTWARE REVISION DATE:

       OCTOBER, 1991

C------------------------------------------------------------------------
C
C   PROGRAM TESTB3
C
C   DESCRIPTION:
C
C   THIS IS A TEST PROGRAM FOR GENERATING THE B-NET OF ANY BOX SPLINE
C   B(L,M,N) ON A THREE DIRECTIONAL MESH. OUTPUT IS A LATEX FILE. USE THE
C   FOLLOWING COMMANDS TO COMPILE AND PREVIEW THE B-NET OF THE BOX SPLINE
C   B(L,M,N): latex boxspl[RETURN]
C             xdvi  boxspl[RETURN]
C   AT AN X WINDOW SYSTEM.
C   YOU MAY HANDLE boxspl.tex AS A USUAL LATEX FILE WITHOUT AN X WINDOW
C   SYSTEM TO PREVIEW AND/OR  GET A HARDCOPY OF THE B-NET OF THE BOX
C   SPLINE B(L,M,N).
C   TO CONTROL THE MARGIN OF THE OUTPUT, YOU MAY ADJUST THE COORDINATE
C   (100,30) OF THE FIGURE AT THE LINE \begin{picture} OF THE OUTPUT FILE
C   boxspl.tex. IF THE FIRST COMPONENT OF THE COORDINATE IS INCREASING,
C   THE FIGURE WILL MOVE TO THE LEFT. IF IT IS DECREASING, THE FIGURE WILL
C   MOVE TO THE RIGHT.
C   YOU MAY ADJUST THE FONT BY CHANGING \scriptsize INTO \tiny OR
C   \footnotesize, ETC..
C   TO ENLARGE OR SHRINK THE OUTPUT, YOU MAY ADJUST THE NUMBER 0.01in AT
C   THE LINE  \unitlength OF THE OUTPUT FILE boxspl.tex. INCREASING THE
C   NUMBER WILL ENLARGE THE FIGURE AND DECREASING THE NUMBER WILL SHRINK
C   THE FIGURE. (0.01in MEANS THAT ONE UNIT IS EQUAL TO 0.01 INCH.)
C
C   WARNINGS:
C
C   THE B-NETS OF A BOX SPLINE OF HIGHER DEGREE THAN 6 MAY NOT BE
C   FITTED IN ONE PAGE. NOTE THAT L,M,N MUST BE GREATER THAN OR EQUAL TO 1.
C   THIS TEST PROGRAM CAN BE USED AS THEY ARE WITH UNIX. WITH OTHER SYSTEMS
C   \\ HAS TO BE REPLACED BY \.
C
C------------------------------------------------------------------------
       PROGRAM TESTB3
        INTEGER A,B,D,I,J,L,M,N,SIZE
        PARAMETER (SIZE=50)
        DIMENSION A(0:SIZE,0:SIZE),B(0:SIZE,0:SIZE)
        INTEGER BSIZE1,BSIZE2
        PRINT*,'ENTER L,M,N '
        READ*, L,M,N
        CALL BS3DM(L,M,N,A,B,SIZE,BSIZE1,BSIZE2)
        D=L+M+N-2
        OPEN(UNIT=2,FILE='boxspl.tex',STATUS='UNKNOWN')
        WRITE(2,*)'\\documentstyle[12pt]{article}'
        WRITE(2,*)'\\textheight8in'
        WRITE(2,*)'\\topmargin-0.5in'
        WRITE(2,*)'\\textwidth8.0in'
        WRITE(2,*)'\\begin{document}'
        WRITE(2,*)'\\pagestyle{empty}'
        WRITE(2,*)'\\unitlength0.01in'
        WRITE(2,*)'\\begin{picture}(',20*(L+N)*D+10,',',20*(M+N)
     +                     *D+10,')(100,30)'
        DO 15 I=0, BSIZE1-1
         DO 10 J=0, BSIZE2-1
         WRITE(2,*)'\\put(',20*I,',',20*J,')',
     +                '{{\\scriptsize \\bf ',B(I,J),'}}'
10       CONTINUE
15      CONTINUE
        WRITE(2,*)'\\multiput(-2,-2)(0,',20*D,'){',M+N+1,'}',
     +     '{\\line(1,0){',20*D*(L+N),'}}'
        WRITE(2,*)'\\multiput(-2,-2)(',20*D,',0){',L+N+1,'}',
     +    '{\\line(0,1){',20*D*(M+N),'}}'
        DO 20 I=0,L+N-1
         IF(M+N+I.LE.L+N)THEN
          WRITE(2,*)'\\put(',20*D*I-2,',-2){\\line(1,1){',20*D*
     +                                                       (M+N),'}}'
         ELSE
          WRITE(2,*)'\\put(',20*D*I-2,',-2){\\line(1,1){',20*D*
     +                                                     (L+N-I),'}}'
         ENDIF
20      CONTINUE
        DO 30 J=1, M+N-1
         IF(L+N+I.LE.M+N)THEN
          WRITE(2,*)'\\put(-2,',20*D*J-2,'){\\line(1,1){',20*D*
     +                                                        (L+N),'}}'
         ELSE
          WRITE(2,*)'\\put(-2,',20*D*J-2,'){\\line(1,1){',20*D*
     +                                                      (M+N-J),'}}'
         ENDIF
30      CONTINUE
        WRITE(2,*)'\\put(100,-30){ The B-net of box spline  ',
     +   '$', D,'!B(',L,M,N,')$}'
        WRITE(2,*)'\\end{picture}'
        WRITE(2,*)
        WRITE(2,*)'\\end{document}'
        CLOSE(2)
        PRINT*,'Your LaTeX file is boxspl.tex'
        END
C------------------------------------------------------------------------
C
C   SUBROUTINE BS3DM
C
C   USAGE:
C
C      SUBROUTINE BS3DM(L,M,N,A,B,SIZE,BSIZE1,BSIZE2)
C
C   DESCRIPTION:
C
C      THIS SUBROUTINE PRODUCES THE B-NETS OF ANY BOX SPLINES ON A THREE
C      DIRECTIONAL MESH.
C      THE INPUT IS THE REPETITIONS (L,M,N) OF DIRECTIONS (1,0), (0,1),
C      AND (1,1). HERE L, M, AND N MUST BE GREATER THAN OR EQUAL TO 1.
C      THE OUTPUT IS AN ARRAY OF THE COLLECTION OF B-NETS OF ALL
C      POLYNOMIAL PIECES OF THE BOX SPLINE INSIDE ITS SUPPORT.
C
C  INPUT PARAMETERS:
C
C      L, M, N ARE INTEGERS.
C        L IS THE NUMBER OF THE REPETITION OF (1,0)
C        M IS THE NUMBER OF THE REPETITION OF (0,1)
C        N IS THE NUMBER OF THE REPETITION OF (1,1)
C
C      SIZE IS AN INTEGER PARAMETER FOR STORAGE REQUIREMENT WHICH MUST BE
C        GREATER THAN THE LARGER ONE OF (L+M+N-2)*(L+N)+1 AND
C        (L+M+N-2)*(M+N)+1. ITS VALUE IS USED IN THE DIMENSION STATEMENT
C        FOR THE ARRAYS A AND B.
C
C      A IS A WORKING INTEGER ARRAY WHOSE SIZE IS SIZE*SIZE.
C
C  OUTPUT PARAMETERS:
C
C      B IS AN OUTPUT INTEGER ARRAY. B CONTAINS THE
C        B-NETS OF THE BOX SPLINE (L+M+N-2)!*B(L,M,N).
C
C      BSIZE1*BSIZE2  IS  THE SIZE OF THE INTEGER ARRAY B.
C
C------------------------------------------------------------------------
       SUBROUTINE BS3DM(L,M,N,A,B,SIZE,BSIZE1,BSIZE2)
        INTEGER L,M,N,A,B,BSIZE1,BSIZE2,SIZE
        DIMENSION A(0:SIZE,0:SIZE),B(0:SIZE,0:SIZE)
C
C LOCAL PARAMETERS ARE D, I, J, L1, M1, N1, NX, NY. NOTE THAT D IS THE
C DEGREE OF THE BOX SPLINE.
C
        INTEGER D,I,J,L1,M1,N1,NX,NY
        B(1,1)=1
        D=1
C
C WE START WITH THE B-NET OF BOX SPLINE B(1,1,1) AND FIRST FIND THE
C B-NET OF BOX SPLINE B(L,1,1) IF L IS GREATER THAN 1.
C
        IF(L.GT.1)THEN
         L1=1
50       IF(L1.GE.L)GOTO 100
C
C FIND THE DIFFERENCE OF THE B-NETS OF B(L1,1,1) AT (0,0) AND B(L1,1,1)
C AT (L1,0) AND WRITE IT INTO THE ARRAY A.
C
          DO 60 I=0, D*(L1+2)
           DO 55 J=0, 2*D
            IF(I.LT.D)THEN
             A(I,J)=B(I,J)
            ELSE
             A(I,J)=B(I,J)-B(I-D,J)
            END IF
55         CONTINUE
60        CONTINUE
         D=D+1
C
C SET THE INITIAL B-NET OF B(L1+1,1,1) TO BE ZERO.
C
         DO 65 I=0, D*(L1+2)
          B(I,0)=0
65       CONTINUE
         DO 70 J=0,D*2
          B(0,I)=0
70       CONTINUE
C
C THEN SOLVE THE DIFFERENCE EQUATIONS TO FIND THE B-NET OF B(L1+1,1,1)
C
         DO 95 I=0, L1+1
          DO 90 J=0,1
           DO 85 NX=1, D
            DO 80 NY=1, D
             IF(NY.GE.NX)THEN
        B(NX+I*D,NY+D*J)=B(NX-1+D*I,NY+D*J)+A(NX-1+(D-1)*I,NY-1+(D-1)*J)
             ELSE
        B(NX+I*D,NY+D*J)=B(NX-1+D*I,NY+D*J)+A(NX-1+(D-1)*I,NY+(D-1)*J)
             END IF
80          CONTINUE
85         CONTINUE
90        CONTINUE
95       CONTINUE
         L1=L1+1
         GOTO 50
        ENDIF
C
C THE ABOVE LOOP HAS FOUND THE B-NET OF B(L,1,1).
C NOW START TO FIND THE B-NET OF BOX SPLINE B(L,M,1).
C
100     IF(M.GT.1)THEN
        M1=1
150     IF(M1.GE.M)GOTO 200
C
C FIND THE DIFFERENCE OF THE B-NETS OF B(L,M1,1) AT (0,0) AND B(L,M1,1)
C AT (0,M1) AND WRITE IT INTO THE ARRAY A.
C
        DO 160 J=0, D*(M1+2)
          DO 155 I=0,D*(L+1)
           IF(J.LT.D)THEN
            A(I,J)=B(I,J)
           ELSE
            A(I,J)=B(I,J)-B(I,J-D)
           END IF
155       CONTINUE
160      CONTINUE
        D=D+1
C
C SET THE INITIAL B-NET OF B(L,M1+1,1) TO BE ZERO.
C
        DO 165 I=0, D*(L+1)
         B(I,0)=0
165     CONTINUE
        DO 170 J=0, D*(M1+2)
         B(0,J)=0
170     CONTINUE
C
C THEN SOLVE THE DIFFERENCE EQUATIONS TO FIND THE B-NET OF B(L,M1+1,1)
C
        DO 195 I=0, L
         DO 190 J=0, M1+1
          DO 185 NY=1, D
           DO 180 NX=1,D
            IF(NX.GE.NY)THEN
        B(NX+I*D,NY+J*D)=B(NX+I*D,NY-1+J*D)+A(NX+I*(D-1)-1,NY-1+J*(D-1))
             ELSE
        B(NX+I*D,NY+J*D)=B(NX+I*D,NY-1+J*D)+A(NX+I*(D-1),NY-1+J*(D-1))
            ENDIF
180        CONTINUE
185       CONTINUE
190      CONTINUE
195     CONTINUE
        M1=M1+1
        GOTO 150
       ENDIF
C
C FINALLY  FIND THE B-NET OF BOX SPLINE B(L,M,N)
C
200     IF(N.GT.1)THEN
        N1=1
250     IF(N1.GE.N)GOTO 300
C
C FIND THE DIFFERENCE OF THE B-NETS OF B(L,M,N1) AT (0,0) AND B(L,M,N1)
C AT (N1,N1) AND WRITE IT INTO THE ARRAY A.
C
        DO 260 I=0,D*(L+N1+1)
         DO 255 J=0,D*(M+N1+1)
          IF((I.LT.D).OR.(J.LT.D))THEN
           A(I,J)=B(I,J)
          ELSE
           A(I,J)=B(I,J)-B(I-D,J-D)
          ENDIF
255      CONTINUE
260     CONTINUE
        D=D+1
C
C SET THE INITIAL B-NET OF B(L,M,N1+1) TO BE ZERO.
C
        DO 265 I=0, D*(L+N1+1)
         B(I,0)=0
265     CONTINUE
        DO 270 J=0, D*(M+N1+1)
         B(0,J)=0
270     CONTINUE
C
C THEN SOLVE THE DIFFERENCE EQUATIONS TO FIND THE B-NET OF B(L,M,N1+1)
C
        DO 295 I=0, L+N1
         DO 290 J=0, M+N1
          DO 285 NX=1, D
           DO 280 NY=1, D
           B(NX+I*D,NY+J*D)=B(NX+I*D-1,NY+J*D-1)
     +                        +A(NX+I*(D-1)-1,NY+J*(D-1)-1)
280        CONTINUE
285       CONTINUE
290      CONTINUE
295     CONTINUE
        N1=N1+1
        GOTO 250
        ENDIF
300     PRINT*,'WE HAVE GENERATED THE B-NETS OF BOX SPLINE '
        PRINT*, D,'!*B(',L,M,N,')'
        BSIZE1= D*(L+N)+1
        BSIZE2= D*(M+N)+1
        RETURN
        END
C------------------------------------------------------------------------
C
C   PROGRAM TESTB4
C
C   DESCRIPTION:
C
C   THIS IS A TEST PROGRAM FOR GENERATING THE B-NETS OF ANY BOX SPLINE
C   B(K,L,M,N) ON A FOUR DIRECTIONAL MESH. THE INPUT IS THE REPETITIONS OF
C   DIRECTIONS (1,0),(0,1),(1,1) AND (1,-1). THE OUTPUT IS A LATEX FILE.
C   USE THE FOLLOWING COMMANDS TO COMPILE AND PREVIEW THE B-NETS OF BOX
C   SPLINE B(K,L,M,N): latex boxspl[RETURN]
C                      xdvi boxspl[RETURN]
C   AT AN X WINDOW SYSTEM.
C   YOU MAY HANDLE boxspl.tex AS A USUAL LATEX FILE WITHOUT AN X WINDOW
C   SYSTEM TO PREVIEW AND/OR  GET A HARDCOPY OF THE B-NET OF THE BOX
C   SPLINE B(L,M,N).
C   TO CONTROL THE MARGIN OF THE OUTPUT, YOU MAY ADJUST THE COORDINATE
C   (100,30) OF THE FIGURE AT THE LINE \begin{picture} OF THE OUTPUT FILE
C   boxspl.tex. IF THE FIRST COMPONENT OF THE COORDINATE IS INCREASING,
C   THE FIGURE WILL MOVE TO THE LEFT. IF IT IS DECREASING, THE FIGURE WILL
C   MOVE TO THE RIGHT.
C   YOU MAY ADJUST THE FONT BY CHANGING \scriptsize INTO \tiny OR
C   \footnotesize, ETC..
C   TO ENLARGE OR SHRINK THE OUTPUT, YOU MAY ADJUST THE NUMBER 0.01in AT
C   THE LINE  \unitlength OF THE OUTPUT FILE boxspl.tex. INCREASING THE
C   NUMBER WILL ENLARGE THE FIGURE AND DECREASING THE NUMBER WILL SHRINK
C   THE FIGURE. (0.01in MEANS THAT ONE UNIT IS EQUAL TO 0.01 INCH.)
C
C   WARNINGS:
C
C   THE B-NETS OF A BOX SPLINE OF HIGHER  DEGREE THAN 5 MAY NOT BE FITTED
C   IN ONE PAGE.
C   NOTE THAT K,L,M, AND N MUST BE GREATER THAN OR EQUAL TO 1.
C   THIS TEST PROGRAM CAN BE USED AS THEY ARE WITH UNIX. WITH OTHER SYSTEMS
C   \\ HAS TO BE REPLACED BY \.
C
C------------------------------------------------------------------------
       PROGRAM TESTB4
        INTEGER K,L,M,N,SIZE,A,B,BSIZE1,BSIZE2,D
        PARAMETER (SIZE=50)
        DIMENSION A(0:SIZE,0:SIZE),B(0:SIZE,0:SIZE)
        PRINT*,'ENTER K,L,M,N '
        READ*, K,L,M,N
        D=K+L+M+N-2
        CALL BS4DM(K,L,M,N,A,B,BSIZE1,BSIZE2,SIZE)
        OPEN(UNIT=2,FILE='boxspl.tex',STATUS='UNKNOWN')
        WRITE(2,*)'\\documentstyle[12pt]{article}'
        WRITE(2,*)'\\textheight9in'
        WRITE(2,*)'\\topmargin-0.5in'
        WRITE(2,*)'\\textwidth8.0in'
        WRITE(2,*)'\\begin{document}'
        WRITE(2,*)'\\pagestyle{empty}'
        WRITE(2,*)'\\unitlength0.01in'
        WRITE(2,*)'\\begin{picture}(',40*(K+M+N)*D+10,',',
     +                          40*(L+M+N)*D+10,')(100,30)'
        DO 15 I=0, BSIZE1-1, 2
         DO 10 J=0, BSIZE2-1, 2
         WRITE(2,*)'\\put(',20*I,',',20*J,')',
     +                    '{{\\scriptsize \\bf ',B(I,J),'}}'
10       CONTINUE
15      CONTINUE
        DO 25 I=1, 2*D*(K+M+N)-1,2
         DO 20 J=1, 2*D*(L+M+N)-1,2
         WRITE(2,*)'\\put(',20*I,',',20*J,')',
     +                    '{{\\scriptsize \\bf ',B(I,J),'}}'
20       CONTINUE
25      CONTINUE
        WRITE(2,*)'\\multiput(-2,-2)(0,',40*D,'){',L+M+N+1,'}',
     +     '{\\line(1,0){',40*D*(K+M+N),'}}'
        WRITE(2,*)'\\multiput(-2,-2)(',40*D,',0){',K+M+N+1,'}',
     +    '{\\line(0,1){',40*D*(L+M+N),'}}'
        DO 30 I=0,K+M+N-1
         IF(L+M+N+I.LE.K+M+N)THEN
          WRITE(2,*)'\\put(',40*D*I-2,',-2){\\line(1,1){',40*D*
     +                                                    (L+M+N),'}}'
          WRITE(2,*)'\\put(',40*D*(K+M+N-I)-2,',-2)',
     +    '{\\line(-1,1){',40*D*(L+M+N),'}}'
         ELSE
          WRITE(2,*)'\\put(',40*D*I-2,',-2){\\line(1,1){',40*D*
     +                                                    (K+M+N-I),'}}'
          WRITE(2,*)'\\put(',40*D*(K+M+N-I)-2,',-2){\\line(-1,1)',
     +                        '{',40*D*(K+M+N-I),'}}'
         ENDIF
30      CONTINUE
        DO 35 J=1, L+M+N-1
         IF(K+M+N+I.LE.L+M+N)THEN
          WRITE(2,*)'\\put(-2,',40*D*J-2,'){\\line(1,1){',40*D*
     +                                                    (K+M+N),'}}'
          WRITE(2,*)'\\put(',40*D*(K+M+N)-2,',',40*D*J-2,')',
     +    '{\\line(-1,1){',40*D*(K+M+N),'}}'
         ELSE
          WRITE(2,*)'\\put(-2,',40*D*J-2,'){\\line(1,1){',40*D*
     +                                                    (L+M+N-J),'}}'
          WRITE(2,*)'\\put(',40*D*(K+M+N)-2,',',40*D*J-2,')',
     +                     '{\\line(-1,1){',40*D*(L+M+N-J),'}}'
         ENDIF
35      CONTINUE
        WRITE(2,*)'\\put(100,-30){The B-net of box spline  ',
     +  '$',D,'!2^{',M+N+1,'}B(',K,L,M,N,')$}'
        WRITE(2,*)'\\end{picture}'
        WRITE(2,*)
        WRITE(2,*)'\\end{document}'
        CLOSE(2)
        PRINT*,'Your LaTeX file is boxspl.tex'
        END
C------------------------------------------------------------------------
C
C  SUBROUTINE BS4DM
C
C  USAGE:
C
C      SUBROUTINE BS4DM(K,L,M,N,A,B,BSIZE1,BSIZE2,SIZE)
C
C  DESCRIPTION:
C
C      THIS PROGRAM FINDS THE B-NETS OF ANY BOX SPLINE ON A FOUR
C      DIRECTIONAL MESH.
C      THE INPUT IS THE REPETITIONS (K,L,M,N) OF DIRECTIONS (1,0),(0,1),
C      (1,1), AND (1,-1). ALL K, L, M, AND N MUST BE GREATER OR EQUAL TO 1.
C      THE OUTPUT IS AN ARRAY OF COLLECTIONS OF B-NETS OF THE BOX SPLINE
C      RESTRICTED TO EVERY TRIANGLES INSIDE ITS SUPPORT.
C
C  INPUT PARAMETERS:
C
C      K, L, M, N ARE INTEGERS.
C        K IS THE NUMBER OF THE REPETITION OF (1,0)
C        L IS THE NUMBER OF THE REPETITION OF (0,1)
C        M IS THE NUMBER OF REPETITION OF (1,1)
C        N IS THE NUMBER OF THE REPETITION OF (1,-1)
C
C      SIZE IS THE INTEGER PARAMETER TO DECLARE THE STORAGE REQUIREMENT
C        OF THE INTEGER ARRAYS A AND B. SIZE MUST BE GREATER THAN THE
C        INTEGERS 2*(K+L+M+N-2)*(K+M+N) AND 2*(K+L+M+N-2)*(L+M+N).
C
C      A IS A WORKING INTEGER ARRAY WHOSE SIZE IS SIZE*SIZE.
C
C  OUTPUT PARAMETERS:
C
C      B IS AN OUTPUT INTEGER ARRAY. B CONTAINS THE
C        B-NETS OF BOX SPLINE (K+L+M+N-2)!*2^{M+N+1}*B(K,L,M,N). ACTUALLY,
C        THE B-NETS CAN BE PRINTED OUT AS FOLLOWS:
C
C        DO J=0,2*(K+L+M+N-2)*(L+M+N),2
C        WRITE(*,1) (B(I,J),I=0,2*(K+L+M+N-2)*(K+M+N),2)
C        WRITE(*,2) (B(I+1,J+1),I=0,2*(K+L+M+N-2)*(K+M+N)-1,2)
C 1      FORMAT(2X,20I4)
C 2      FORMAT(4X,20I4)
C
C      BSIZE1*BSIZE2 IS THE SIZE OF THE INTEGER ARRAY B.
C
C------------------------------------------------------------------------
       SUBROUTINE BS4DM(K,L,M,N,A,B,BSIZE1,BSIZE2,SIZE)
        INTEGER K,L,M,N,A,B,BSIZE1,BSIZE2,SIZE
        DIMENSION A(0:SIZE,0:SIZE),B(0:SIZE,0:SIZE)
C
C LOCAL PARAMETERS D,I,J,K1,L1,M1,N1,NX,NY. NOTE THAT D IS THE DEGREE OF THE
C BOX SPLINE.
C
        INTEGER D,I,J,K1,L1,M1,N1,NX,NY
C
C SET THE INITIAL B-NETS OF 16*B(1,1,1,1).
C
        DO 10 I=0,SIZE
          DO 10 J=0,SIZE
          B(I,J)=0
10      CONTINUE
        B(4,4)=4
        B(4,6)=8
        B(4,8)=4
        B(3,5)=4
        B(3,7)=4
        B(2,6)=2
        B(5,3)=4
        B(5,5)=8
        B(5,7)=8
        B(5,9)=4
        B(6,2)=2
        B(6,4)=8
        B(6,6)=8
        B(6,8)=8
        B(6,10)=2
        B(7,3)=4
        B(7,5)=8
        B(7,7)=8
        B(7,9)=4
        B(8,4)=4
        B(8,6)=8
        B(8,8)=4
        B(9,5)=4
        B(9,7)=4
        B(10,6)=2
        D=2
C
C SET DEGREE D=2 AND START TO FIND THE B-NETS OF BOX SPLINE B(K,1,1,1).
C
        IF(K.GT.1)THEN
         K1=1
50       IF(K1.GE.K)GOTO 100
C
C FIND THE DIFFERENCE OF THE B-NETS OF B(K1,1,1,1) AT (0,0) AND
C B(K1,1,1,1)  AT (K1,0) AND WRITE IT INTO THE ARRAY A.
C
        DO 60 I=0, 2*D*(K1+3)
          DO 55 J=0, 6*D
           IF(I.LT.2*D)THEN
            A(I,J)=B(I,J)
           ELSE
            A(I,J)=B(I,J)-B(I-2*D,J)
           END IF
55        CONTINUE
60      CONTINUE
        D=D+1
        DO 65 I=0, 2*D*(K1+3),2
         B(I,0)=0
65      CONTINUE
        DO 70 J=0, 6*D,2
         B(0,J)=0
70      CONTINUE
C
C THEN SOLVE THE DIFFERENCE EQUATIONS TO FIND THE B-NET OF B(K1+1,1,1,1).
C
        DO 95 I=0,K1+2
         DO 94 J=0,2
          DO 75 NX=1, D
           DO 74 NY=NX, 2*D-NX,2
            B(I*2*D+NX,J*2*D+NY)=B(2*I*D+NX-1,J*2*D+NY-1)
     +      +B(2*I*D+NX-1,2*J*D+NY+1)+A(I*2*(D-1)+NX-1,J*2*(D-1)+NY-1)
            B(I*2*D+NX,J*2*D+NY)=B(I*2*D+NX,J*2*D+NY)/2
74         CONTINUE
75        CONTINUE
          DO 80 NY=1,D-1
           DO 79 NX=NY+2, 2*D-NY, 2
            B(I*2*D+NX,J*2*D+NY)=B(I*2*D+NX-2,J*2*D+NY)
     +                           +A(I*2*(D-1)+NX-2,J*2*(D-1)+NY)
79         CONTINUE
80        CONTINUE
          DO 85 NY=D+1,2*D
           DO 84 NX=2*D-NY+2,NY,2
            B(I*2*D+NX,J*2*D+NY)=B(I*2*D+NX-2,J*2*D+NY)
     +                           +A(I*2*(D-1)+NX-2,J*2*(D-1)+NY-2)
84         CONTINUE
85        CONTINUE
          DO 90 NX=D+2, 2*D
           DO 89 NY=2*D-NX+2,NX-2, 2
           B(I*2*D+NX,J*2*D+NY)=B(I*2*D+NX-1,J*2*D+NY-1)*2
     +         -B(I*2*D+NX,J*2*D+NY-2)+A(I*2*(D-1)+NX-2,J*2*(D-1)+NY-2)
89         CONTINUE
90        CONTINUE
94       CONTINUE
95      CONTINUE
        K1=K1+1
        GOTO 50
       ENDIF
C
C THE ABOVE LOOP HAS FOUND THE B-NET OF B(K,1,1,1).
C START TO FIND THE B-NETS OF BOX SPLINE B(K,L,1,1).
C
100     IF(L.GT.1)THEN
        L1=1
150     IF(L1.GE.L)GOTO 200
C
C FIND THE DIFFERENCE OF THE B-NETS OF B(K,L1,1,1) AT (0,0) AND
C B(K,L1,1,1)  AT (0,L1) AND WRITE IT INTO THE ARRAY A.
C
        DO 160 I=0, 2*D*(K+2)
          DO 155 J=0, 2*D*(L1+3)
           IF(J.LT.2*D)THEN
            A(I,J)=B(I,J)
           ELSE
            A(I,J)=B(I,J)-B(I,J-2*D)
           ENDIF
155       CONTINUE
160     CONTINUE
        D=D+1
C
C SET THE INITIAL B-NET OF B(K,L1+1,1,1) TO BE ZERO.
C
        DO 165 I=0,2*D*(K+2),2
         B(I,0)=0
165     CONTINUE
        DO 170 J=0,2*D*(L1+3),2
         B(0,J)=0
170     CONTINUE
C
C THEN SOLVE THE DIFFERENCE EQUATIONS TO FIND THE B-NET OF B(K,L1+1,1,1)
C
        DO 195 I=0, K+1
          DO 194 J=0, L1+2
           DO 175 NY=1,D
            DO 174 NX=NY,2*D-NY,2
             B(I*2*D+NX,J*2*D+NY)=(B(I*2*D+NX-1,J*2*D+NY-1)
     +     +B(I*2*D+NX+1,J*2*D+NY-1)+A(I*2*(D-1)+NX-1,J*2*(D-1)+NY-1))/2
174         CONTINUE
175        CONTINUE
           DO 180 NX=1,D-1
            DO 179 NY=NX+2,2*D-NX,2
             B(I*2*D+NX,J*2*D+NY)=B(I*2*D+NX,J*2*D+NY-2)
     +                            +A(I*2*(D-1)+NX,J*2*(D-1)+NY-2)
179         CONTINUE
180        CONTINUE
           DO 185 NX=D+1,2*D
            DO 184 NY=2*D-NX+2,NX,2
             B(I*2*D+NX,J*2*D+NY)=B(I*D*2+NX,J*2*D+NY-2)
     +                            +A(I*2*(D-1)+NX-2,J*2*(D-1)+NY-2)
184         CONTINUE
185        CONTINUE
           DO 190 NY=D+2,2*D
            DO 189 NX=2*D-NY+2, NY-2, 2
             B(I*2*D+NX,J*2*D+NY)=B(I*2*D+NX-1,J*2*D+NY-1)*2
     +      -B(I*2*D+NX-2,J*2*D+NY)+A(I*2*(D-1)+NX-2,J*2*(D-1)+NY-2)
189         CONTINUE
190        CONTINUE
194       CONTINUE
195      CONTINUE
        L1=L1+1
        GOTO 150
       ENDIF
C
C NOW COMPUTE THE B-NETS OF BOX SPLINE B(K,L,M,1).
C
200     IF(M.GT.1)THEN
         M1=1
250      IF(M1.GE.M)GOTO 300
C
C FIND THE DIFFERENCE OF THE B-NETS OF B(K,L,M1,1) AT (0,0) AND
C B(K,L,M1,1) AT (M1,M1) AND WRITE IT INTO THE ARRAY A.
C
         DO 260 I=0, 2*D*(K+M1+2)
          DO 255 J=0, 2*D*(L+M1+2)
           IF((I.LT.2*D).OR.(J.LT.2*D))THEN
            A(I,J)=B(I,J)
           ELSE
            A(I,J)=B(I,J)-B(I-2*D,J-2*D)
           ENDIF
255       CONTINUE
260      CONTINUE
         D=D+1
C
C SET THE INITIAL B-NET OF B(K,L,M1+1,1) TO BE ZERO.
C
         DO 265 I=0,2*D*(K+M1+2),2
          B(I,0)=0
265      CONTINUE
         DO 270 J=0, 2*D*(L+M1+2),2
          B(0,J)=0
270      CONTINUE
C
C THEN SOLVE THE DIFFERENCE EQUATIONS TO FIND THE B-NET OF B(K,L,M1+1,1).
C
         DO 295 I=0, K+M1+1
          DO 294 J=0, L+M1+1
           DO 275 NX=1, D
            DO 274 NY=NX, 2*D-NX,2
             B(I*2*D+NX,J*2*D+NY)=B(I*2*D+NX-1,J*2*D+NY-1)
     +                            +A(I*2*(D-1)+NX-1,J*2*(D-1)+NY-1)
274         CONTINUE
275        CONTINUE
          DO 280 NY=1, D-1
           DO 279 NX=NY+2,2*D-NY,2
            B(I*2*D+NX,J*2*D+NY)=B(I*2*D+NX-1,2*J*D+NY-1)
     +                           +A(I*2*(D-1)+NX-1,J*2*(D-1)+NY-1)
279        CONTINUE
280       CONTINUE
          DO 285 NY=D+1,2*D
           DO 284 NX=2*D-NY+2,NY,2
            B(I*2*D+NX,J*2*D+NY)=B(I*2*D+NX-1,2*J*D+NY-1)
     +                           +A(I*2*(D-1)+NX-2,J*2*(D-1)+NY-2)
284        CONTINUE
285       CONTINUE
          DO 290  NX=D+2,2*D
           DO 289 NY=2*D-NX+2,NX-2,2
            B(I*2*D+NX,J*2*D+NY)=B(I*2*D+NX-1,2*J*D+NY-1)
     +                           +A(I*2*(D-1)+NX-2,J*2*(D-1)+NY-2)
289        CONTINUE
290       CONTINUE
294      CONTINUE
295     CONTINUE
        M1=M1+1
        GOTO 250
       ENDIF
C
C FINALLY, COMPUTE THE B-NETS OF BOX SPLINE B(K,L,M,N).
C
300     IF(N.GT.1)THEN
        N1=1
350     IF(N1.GE.N)GOTO 400
C
C FIND THE DIFFERENCE OF THE B-NETS OF B(K,L,M,N1) AT (0,0) AND
C B(K,L,M,N1) AT (N1,-N1) AND WRITE IT INTO THE ARRAY A.
C
        DO 360 I=0, 2*D*(K+M+N1+1)
           DO 355 J=0, 2*D*(L+M+N1+1)
            IF((I.LT.2*D).AND.(J.LT.2*D))THEN
              A(I,J)=0
            ENDIF
            IF((I.LT.2*D).AND.(J.GE.2*D))THEN
              A(I,J)=-B(I,J-2*D)
            ENDIF
            IF((I.GE.2*D).AND.(J.LT.2*D))THEN
              A(I,J)=B(I-2*D,J)
            ENDIF
            IF((I.GE.2*D).AND.(J.GE.2*D))THEN
              A(I,J)=B(I-2*D,J)-B(I,J-2*D)
            ENDIF
355        CONTINUE
360      CONTINUE
         D=D+1
C
C SET THE INITIAL B-NET OF B(K,L,M, N1+1) TO BE ZERO.
C
         DO 365 I=0, 2*D*(K+M+N1+1),2
            B(I,0)=0
365      CONTINUE
         DO 370 J=0, 2*D*(L+M+N1+1),2
          B(2*D*(K+M+N1+1),J)=0
370      CONTINUE
C
C THEN SOLVE THE DIFFERENCE EQUATIONS TO FIND THE B-NET OF B(K,L,M,N1+1)
C
         DO 395 I=K+M+N1,0,-1
          DO 394 J=0,L+M+N1
           DO 375 NY=1,D
            DO 374 NX=NY,2*D-NY,2
             B(I*2*D+NX,J*2*D+NY)=B(I*2*D+NX+1,J*2*D+NY-1)
     +                            +A(I*2*(D-1)+NX-1,J*2*(D-1)+NY-1)
374         CONTINUE
375        CONTINUE
           DO 380 NX=2*D-1,D+1,-1
            DO 379 NY=2*D-NX+2,NX,2
             B(I*2*D+NX,J*2*D+NY)=B(I*2*D+NX+1,J*2*D+NY-1)
     +                              +A(I*2*(D-1)+NX-1,J*2*(D-1)+NY-1)
379         CONTINUE
380        CONTINUE
           DO 385 NX=D-1,0,-1
            DO 384 NY=NX+2,2*D-NX,2
             B(I*2*D+NX,J*2*D+NY)=B(I*2*D+NX+1,J*2*D+NY-1)
     +                            +A(I*2*(D-1)+NX,J*2*(D-1)+NY-2)
384         CONTINUE
385        CONTINUE
           DO 390 NY=D+2,2*D
            DO 389 NX=2*D-NY+2,NY-2,2
             B(I*2*D+NX,J*2*D+NY)=B(I*2*D+NX+1,J*2*D+NY-1)
     +                            +A(I*2*(D-1)+NX,J*2*(D-1)+NY-2)
389         CONTINUE
390        CONTINUE
394       CONTINUE
395      CONTINUE
         N1=N1+1
         GOTO 350
         ENDIF
400      PRINT*, 'WE HAVE GENERATED THE B-NETS OF BOX SPLINE '
         PRINT*, D,'!*','2^(',M+N+1,')B(',K,L,M,N,').'
         BSIZE1=2*D*(K+M+N)+1
         BSIZE2=2*D*(L+M+N)+1
         RETURN
         END