C      ALGORITHM 661, COLLECTED ALGORITHMS FROM ACM.
C      THIS WORK PUBLISHED IN TRANSACTIONS ON MATHEMATICAL SOFTWARE,
C      VOL. 14, NO. 2, P.151.
C
C			   QS3TEST
C
C   THIS PROGRAM TESTS THE SCATTERED DATA INTERPOLATION
C PACKAGE QSHEP3D BY PRINTING THE MAXIMUM ERRORS ASSOCIATED
C WITH INTERPOLATED VALUES AND GRADIENTS ON A 5 BY 5 BY 5
C UNIFORM GRID IN THE UNIT CUBE.  THE DATA SET CONSISTS
C OF 64 NODES WITH DATA VALUES TAKEN FROM A QUADRATIC FUNC-
C TION FOR WHICH THE METHOD IS EXACT.  THE RATIO OF MAXIMUM
C INTERPOLATION ERROR RELATIVE TO THE MACHINE PRECISION IS
C ALSO PRINTED.  THIS SHOULD BE O(1).  THE INTERPOLATED
C VALUES FROM QS3VAL AND QS3GRD ARE COMPARED FOR AGREEMENT.
C
      INTEGER LCELL(3,3,3), LNEXT(64)
      REAL X(64), Y(64), Z(64), F(64), RSQ(64), A(9,64),
     .	   XYZMIN(3), XYZDEL(3)
      REAL P(5)
C
C QSHEP3 PARAMETERS AND LOGICAL UNIT FOR OUTPUT
C
      DATA N/64/,  NQ/17/,  NW/32/,  NR/3/,  LOUT/6/
C
C QUADRATIC TEST FUNCTION AND PARTIAL DERIVATIVES
C
      FQ(XX,YY,ZZ) = ((XX + 2.*YY + 3.*ZZ)/6.)**2
      FX(XX,YY,ZZ) = (XX + 2.*YY + 3.*ZZ)/18.
      FY(XX,YY,ZZ) = (XX + 2.*YY + 3.*ZZ)/9.
      FZ(XX,YY,ZZ) = (XX + 2.*YY + 3.*ZZ)/6.
C
C GENERATE A 4 BY 4 BY 4 GRID OF NODES IN THE UNIT CUBE.
C
      L = 0
      DO 1 K = 1,4
	ZL = FLOAT(K-1)/3.
	DO 1 J = 1,4
	  YL = FLOAT(J-1)/3.
	  DO 1 I = 1,4
	    L = L + 1
	    X(L) = FLOAT(I-1)/3.
	    Y(L) = YL
    1	    Z(L) = ZL
C
C COMPUTE THE DATA VALUES.
C
      DO 2 L = 1,N
    2	F(L) = FQ(X(L),Y(L),Z(L))
C
C COMPUTE PARAMETERS DEFINING THE INTERPOLANT Q.
C
      CALL QSHEP3 (N,X,Y,Z,F,NQ,NW,NR, LCELL,LNEXT,XYZMIN,
     .		   XYZDEL,RMAX,RSQ,A,IER)
      IF (IER .NE. 0) GO TO 6
C
C GENERATE A 5 BY 5 BY 5 UNIFORM GRID OF INTERPOLATION
C   POINTS (P(I),P(J),P(K)) IN THE UNIT CUBE.  THE EIGHT
C   CORNERS COINCIDE WITH NODES.
C
      DO 3 I = 1,5
    3	P(I) = FLOAT(I-1)/4.
C
C COMPUTE THE MACHINE PRECISION EPS.
C
      EPS = 1.
    4 EPS = EPS/2.
      EP1 = EPS + 1.
      IF (STORE(EP1) .GT. 1.) GO TO 4
      EPS = EPS*2.
C
C COMPUTE INTERPOLATION ERRORS AND TEST FOR AGREEMENT IN THE
C   Q VALUES RETURNED BY QS3VAL AND QS3GRD.
C
      EQ = 0.
      EQX = 0.
      EQY = 0.
      EQZ = 0.
      DO 5 K = 1,5
	PZ = P(K)
	DO 5 J = 1,5
	  PY = P(J)
	  DO 5 I = 1,5
	    PX = P(I)
	    Q1 = QS3VAL (PX,PY,PZ,N,X,Y,Z,F,NR,LCELL,LNEXT,
     .			 XYZMIN,XYZDEL,RMAX,RSQ,A)
	    CALL QS3GRD (PX,PY,PZ,N,X,Y,Z,F,NR,LCELL,LNEXT,
     .			 XYZMIN,XYZDEL,RMAX,RSQ,A, Q,QX,QY,
     .			 QZ,IER)
	    IF (IER .NE. 0) GO TO 7
	    IF (ABS(Q1-Q) .GT. 3.*ABS(Q)*EPS) GO TO 8
	    EQ = AMAX1(EQ,ABS(FQ(PX,PY,PZ)-Q))
	    EQX = AMAX1(EQX,ABS(FX(PX,PY,PZ)-QX))
	    EQY = AMAX1(EQY,ABS(FY(PX,PY,PZ)-QY))
    5	    EQZ = AMAX1(EQZ,ABS(FZ(PX,PY,PZ)-QZ))
C
C PRINT ERRORS AND THE RATIO EQ/EPS.
C
      RQ = EQ/EPS
      WRITE (LOUT,100)
      WRITE (LOUT,110) EQ, RQ
      WRITE (LOUT,120) EQX
      WRITE (LOUT,130) EQY
      WRITE (LOUT,140) EQZ
      STOP
  100 FORMAT (///1H ,31HMAXIMUM ABSOLUTE ERRORS IN THE ,
     .	      25HINTERPOLANT Q AND PARTIAL/
     .	      1H ,32HDERIVATIVES (QX,QY,QZ) RELATIVE ,
     .	      24HTO MACHINE PRECISION EPS//
     .	      1H ,10X,8HFUNCTION,3X,9HMAX ERROR,3X,
     .	      13HMAX ERROR/EPS/)
  110 FORMAT (1H ,13X,1HQ,7X,E9.3,7X,F4.2)
  120 FORMAT (1H ,13X,2HQX,6X,E9.3)
  130 FORMAT (1H ,13X,2HQY,6X,E9.3)
  140 FORMAT (1H ,13X,2HQZ,6X,E9.3)
C
C ERROR IN QSHEP3
C
    6 WRITE (LOUT,200) IER
      STOP
  200 FORMAT (///1H ,28H*** ERROR IN QSHEP3 -- IER =,I2,
     .	      4H ***)
C
C ERROR IN QS3GRD
C
    7 WRITE (LOUT,210) IER
      STOP
  210 FORMAT (///1H ,28H*** ERROR IN QS3GRD -- IER =,I2,
     .	      4H ***)
C
C VALUES RETURNED BY QS3VAL AND QS3GRD DIFFER BY A RELATIVE
C   AMOUNT GREATER THAN 3*EPS.
C
    8 WRITE (LOUT,220) Q1, Q
      STOP
  220 FORMAT (///1H ,33H*** ERROR -- INTERPOLATED VALUES ,
     .	      37HQ1 (QS3VAL) AND Q2 (QS3GRD) DIFFER --//
     .	      1H ,5X,5HQ1 = ,E21.14,5X,5HQ2 = ,E21.14)
      END
      FUNCTION STORE (X)
      REAL X
C
C***********************************************************
C
C						ROBERT RENKA
C				     NORTH TEXAS STATE UNIV.
C					      (817) 565-2767
C
C   THIS FUNCTION FORCES ITS ARGMENT X TO BE STORED IN MAIN
C MEMORY.  THIS IS USEFUL FOR COMPUTING MACHINE DEPENDENT
C PARAMETERS (SUCH AS THE MACHINE PRECISION) WHERE IT IS
C NECESSARY TO AVOID COMPUTATION IN HIGH PRECISION REG-
C ISTERS.
C
C INPUT PARAMETER -
C
C	X - VALUE TO BE STORED.
C
C X IS NOT ALTERED BY THIS FUNCTION.
C
C OUTPUT PARAMETER -
C
C	STORE - VALUE OF X AFTER IT HAS BEEN STORED AND
C		(POSSIBLY) TRUNCATED OR ROUNDED TO THE
C		MACHINE WORD LENGTH.
C
C MODULES REQUIRED BY STORE - NONE
C
C***********************************************************
C
      COMMON/STCOM/Y
      Y = X
      STORE = Y
      RETURN
      END
      SUBROUTINE QSHEP3 (N,X,Y,Z,F,NQ,NW,NR, LCELL,LNEXT,
     .			 XYZMIN,XYZDEL,RMAX,RSQ,A,IER)
      INTEGER N, NQ, NW, NR, LCELL(NR,NR,NR), LNEXT(N), IER
      REAL    X(N), Y(N), Z(N), F(N), XYZMIN(3), XYZDEL(3),
     .	      RMAX, RSQ(N), A(9,N)
C
C***********************************************************
C
C						ROBERT RENKA
C					UNIV. OF NORTH TEXAS
C					      (817) 565-2767
C						    01/08/90
C
C   THIS SUBROUTINE COMPUTES A SET OF PARAMETERS A AND RSQ
C DEFINING A SMOOTH (ONCE CONTINUOUSLY DIFFERENTIABLE) TRI-
C VARIATE FUNCTION Q(X,Y,Z) WHICH INTERPOLATES DATA VALUES
C F AT SCATTERED NODES (X,Y,Z).  THE INTERPOLANT Q MAY BE
C EVALUATED AT AN ARBITRARY POINT BY FUNCTION QS3VAL, AND
C ITS FIRST DERIVATIVES ARE COMPUTED BY SUBROUTINE QS3GRD.
C   THE INTERPOLATION SCHEME IS A MODIFIED QUADRATIC SHEPARD
C METHOD --
C
C Q = (W(1)*Q(1)+W(2)*Q(2)+..+W(N)*Q(N))/(W(1)+W(2)+..+W(N))
C
C FOR TRIVARIATE FUNCTIONS W(K) AND Q(K).  THE NODAL FUNC-
C TIONS ARE GIVEN BY
C
C Q(K)(X,Y,Z) = A(1,K)*DX**2 + A(2,K)*DX*DY + A(3,K)*DY**2 +
C		A(4,K)*DX*DZ + A(5,K)*DY*DZ + A(6,K)*DZ**2 +
C		A(7,K)*DX + A(8,K)*DY + A(9,K)*DZ + F(K)
C
C WHERE DX = (X-X(K)), DY = (Y-Y(K)), AND DZ = (Z-Z(K)).
C THUS, Q(K) IS A QUADRATIC FUNCTION WHICH INTERPOLATES THE
C DATA VALUE AT NODE K.  ITS COEFFICIENTS A(,K) ARE OBTAINED
C BY A WEIGHTED LEAST SQUARES FIT TO THE CLOSEST NQ DATA
C POINTS WITH WEIGHTS SIMILAR TO W(K).	NOTE THAT THE RADIUS
C OF INFLUENCE FOR THE LEAST SQUARES FIT IS FIXED FOR EACH
C K, BUT VARIES WITH K.
C   THE WEIGHTS ARE TAKEN TO BE
C
C W(K)(X,Y,Z) = ( (R(K)-D(K))+ / R(K)*D(K) )**2
C
C WHERE (R(K)-D(K))+ = 0 IF R(K) .LE. D(K), AND D(K)(X,Y,Z)
C IS THE EUCLIDEAN DISTANCE BETWEEN (X,Y,Z) AND NODE K.  THE
C RADIUS OF INFLUENCE R(K) VARIES WITH K AND IS CHOSEN SO
C THAT NW NODES ARE WITHIN THE RADIUS.	NOTE THAT W(K) IS
C NOT DEFINED AT NODE (X(K),Y(K),Z(K)), BUT Q(X,Y,Z) HAS
C LIMIT F(K) AS (X,Y,Z) APPROACHES (X(K),Y(K),Z(K)).
C
C ON INPUT --
C
C	N = NUMBER OF NODES AND ASSOCIATED DATA VALUES.
C	    N .GE. 10.
C
C	X,Y,Z = ARRAYS OF LENGTH N CONTAINING THE CARTESIAN
C		COORDINATES OF THE NODES.
C
C	F = ARRAY OF LENGTH N CONTAINING THE DATA VALUES
C	    IN ONE-TO-ONE CORRESPONDENCE WITH THE NODES.
C
C	NQ = NUMBER OF DATA POINTS TO BE USED IN THE LEAST
C	     SQUARES FIT FOR COEFFICIENTS DEFINING THE NODAL
C	     FUNCTIONS Q(K).  A RECOMMENDED VALUE IS NQ =
C	     17.  9 .LE. NQ .LE. MIN(40,N-1).
C
C	NW = NUMBER OF NODES WITHIN (AND DEFINING) THE RADII
C	     OF INFLUENCE R(K) WHICH ENTER INTO THE WEIGHTS
C	     W(K).  FOR N SUFFICIENTLY LARGE, A RECOMMENDED
C	     VALUE IS NW = 32.	1 .LE. NW .LE. MIN(40,N-1).
C
C	NR = NUMBER OF ROWS, COLUMNS, AND PLANES IN THE CELL
C	     GRID DEFINED IN SUBROUTINE STORE3.  A BOX CON-
C	     TAINING THE NODES IS PARTITIONED INTO CELLS IN
C	     ORDER TO INCREASE SEARCH EFFICIENCY.  NR =
C	     (N/3)**(1/3) IS RECOMMENDED.  NR .GE. 1.
C
C THE ABOVE PARAMETERS ARE NOT ALTERED BY THIS ROUTINE.
C
C	LCELL = ARRAY OF LENGTH .GE. NR**3.
C
C	LNEXT = ARRAY OF LENGTH .GE. N.
C
C	XYZMIN,XYZDEL = ARRAYS OF LENGTH .GE. 3.
C
C	RSQ = ARRAY OF LENGTH .GE. N.
C
C	A = ARRAY OF LENGTH .GE. 9N.
C
C ON OUTPUT --
C
C	LCELL = NR BY NR BY NR ARRAY OF NODAL INDICES ASSO-
C		CIATED WITH CELLS.  REFER TO STORE3.
C
C	LNEXT = ARRAY OF LENGTH N CONTAINING NEXT-NODE INDI-
C		CES.  REFER TO STORE3.
C
C	XYZMIN,XYZDEL = ARRAYS OF LENGTH 3 CONTAINING MINI-
C			MUM NODAL COORDINATES AND CELL DIM-
C			ENSIONS, RESPECTIVELY.	REFER TO
C			STORE3.
C
C	RMAX = SQUARE ROOT OF THE LARGEST ELEMENT IN RSQ --
C	       MAXIMUM RADIUS R(K).
C
C	RSQ = ARRAY CONTAINING THE SQUARES OF THE RADII R(K)
C	      WHICH ENTER INTO THE WEIGHTS W(K).
C
C	A = 9 BY N ARRAY CONTAINING THE COEFFICIENTS FOR
C	    QUADRATIC NODAL FUNCTION Q(K) IN COLUMN K.
C
C   NOTE THAT THE ABOVE OUTPUT PARAMETERS ARE NOT DEFINED
C UNLESS IER = 0.
C
C	IER = ERROR INDICATOR --
C	      IER = 0 IF NO ERRORS WERE ENCOUNTERED.
C	      IER = 1 IF N, NQ, NW, OR NR IS OUT OF RANGE.
C	      IER = 2 IF DUPLICATE NODES WERE ENCOUNTERED.
C	      IER = 3 IF ALL NODES ARE COPLANAR.
C
C MODULES REQUIRED BY QSHEP3 -- GETNP3, GIVENS, ROTATE,
C				  SETUP3, STORE3
C
C INTRINSIC FUNCTIONS CALLED BY QSHEP3 -- ABS, AMIN1, FLOAT,
C					    MAX0, MIN0, SQRT
C
C***********************************************************
C
      INTEGER I, IB, IERR, IP1, IRM1, IROW, J, JP1, K, LMAX,
     .	      LNP, NEQ, NN, NNQ, NNR, NNW, NP, NPTS(40),
     .	      NQWMAX
      REAL    AV, AVSQ, B(10,10), C, DMIN, DTOL, FK, RQ, RS,
     .	      RSMX, RSOLD, RTOL, RWS, S, SF, SUM, T, XK, YK,
     .	      ZK, XYZDL(3), XYZMN(3)
C
      DATA    RTOL/1.E-5/, DTOL/.01/, SF/1./
C
C LOCAL PARAMETERS --
C
C AV =	       ROOT-MEAN-SQUARE DISTANCE BETWEEN K AND THE
C		 NODES IN THE LEAST SQUARES SYSTEM (UNLESS
C		 ADDITIONAL NODES ARE INTRODUCED FOR STABIL-
C		 ITY).	THE FIRST 6 COLUMNS OF THE MATRIX
C		 ARE SCALED BY 1/AVSQ, THE LAST 3 BY 1/AV
C AVSQ =       AV*AV
C B =	       TRANSPOSE OF THE AUGMENTED REGRESSION MATRIX
C C =	       FIRST COMPONENT OF THE PLANE ROTATION USED TO
C		 ZERO THE LOWER TRIANGLE OF B**T -- COMPUTED
C		 BY SUBROUTINE GIVENS
C DMIN =       MINIMUM OF THE MAGNITUDES OF THE DIAGONAL
C		 ELEMENTS OF THE REGRESSION MATRIX AFTER
C		 ZEROS ARE INTRODUCED BELOW THE DIAGONAL
C DTOL =       TOLERANCE FOR DETECTING AN ILL-CONDITIONED
C		 SYSTEM.  THE SYSTEM IS ACCEPTED WHEN DMIN
C		 .GE. DTOL
C FK =	       DATA VALUE AT NODE K -- F(K)
C I =	       INDEX FOR A, B, NPTS, XYZMIN, XYZMN, XYZDEL,
C		 AND XYZDL
C IB =	       DO-LOOP INDEX FOR BACK SOLVE
C IERR =       ERROR FLAG FOR THE CALL TO STORE3
C IP1 =        I+1
C IRM1 =       IROW-1
C IROW =       ROW INDEX FOR B
C J =	       INDEX FOR A AND B
C JP1 =        J+1
C K =	       NODAL FUNCTION INDEX AND COLUMN INDEX FOR A
C LMAX =       MAXIMUM NUMBER OF NPTS ELEMENTS (MUST BE CON-
C		 SISTENT WITH THE DIMENSION STATEMENT ABOVE)
C LNP =        CURRENT LENGTH OF NPTS
C NEQ =        NUMBER OF EQUATIONS IN THE LEAST SQUARES FIT
C NN,NNQ,NNR = LOCAL COPIES OF N, NQ, AND NR
C NNW =        LOCAL COPY OF NW
C NP =	       NPTS ELEMENT
C NPTS =       ARRAY CONTAINING THE INDICES OF A SEQUENCE OF
C		 NODES TO BE USED IN THE LEAST SQUARES FIT
C		 OR TO COMPUTE RSQ.  THE NODES ARE ORDERED
C		 BY DISTANCE FROM K AND THE LAST ELEMENT
C		 (USUALLY INDEXED BY LNP) IS USED ONLY TO
C		 DETERMINE RQ, OR RSQ(K) IF NW .GT. NQ
C NQWMAX =     MAX(NQ,NW)
C RQ =	       RADIUS OF INFLUENCE WHICH ENTERS INTO THE
C		 WEIGHTS FOR Q(K) (SEE SUBROUTINE SETUP3)
C RS =	       SQUARED DISTANCE BETWEEN K AND NPTS(LNP) --
C		 USED TO COMPUTE RQ AND RSQ(K)
C RSMX =       MAXIMUM RSQ ELEMENT ENCOUNTERED
C RSOLD =      SQUARED DISTANCE BETWEEN K AND NPTS(LNP-1) --
C		 USED TO COMPUTE A RELATIVE CHANGE IN RS
C		 BETWEEN SUCCEEDING NPTS ELEMENTS
C RTOL =       TOLERANCE FOR DETECTING A SUFFICIENTLY LARGE
C		 RELATIVE CHANGE IN RS.  IF THE CHANGE IS
C		 NOT GREATER THAN RTOL, THE NODES ARE
C		 TREATED AS BEING THE SAME DISTANCE FROM K
C RWS =        CURRENT VALUE OF RSQ(K)
C S =	       SECOND COMPONENT OF THE PLANE GIVENS ROTATION
C SF =	       MARQUARDT STABILIZATION FACTOR USED TO DAMP
C		 OUT THE FIRST 6 SOLUTION COMPONENTS (SECOND
C		 PARTIALS OF THE QUADRATIC) WHEN THE SYSTEM
C		 IS ILL-CONDITIONED.  AS SF INCREASES, THE
C		 FITTING FUNCTION APPROACHES A LINEAR
C SUM =        SUM OF SQUARED EUCLIDEAN DISTANCES BETWEEN
C		 NODE K AND THE NODES USED IN THE LEAST
C		 SQUARES FIT (UNLESS ADDITIONAL NODES ARE
C		 ADDED FOR STABILITY)
C T =	       TEMPORARY VARIABLE FOR ACCUMULATING A SCALAR
C		 PRODUCT IN THE BACK SOLVE
C XK,YK,ZK =   COORDINATES OF NODE K -- X(K), Y(K), Z(K)
C XYZDL =      LOCAL VARIABLES FOR XYZDEL
C XYZMN =      LOCAL VARIABLES FOR XYZMIN
C
      NN = N
      NNQ = NQ
      NNW = NW
      NNR = NR
      NQWMAX = MAX0(NNQ,NNW)
      LMAX = MIN0(40,NN-1)
      IF (9 .GT. NNQ  .OR.  1 .GT. NNW	.OR.  NQWMAX .GT.
     .	  LMAX	.OR.  NNR .LT. 1) GO TO 20
C
C CREATE THE CELL DATA STRUCTURE, AND INITIALIZE RSMX.
C
      CALL STORE3 (NN,X,Y,Z,NNR, LCELL,LNEXT,XYZMN,XYZDL,
     .		   IERR)
      IF (IERR .NE. 0) GO TO 22
      RSMX = 0.
C
C OUTER LOOP ON NODE K
C
      DO 18 K = 1,NN
	XK = X(K)
	YK = Y(K)
	ZK = Z(K)
	FK = F(K)
C
C MARK NODE K TO EXCLUDE IT FROM THE SEARCH FOR NEAREST
C   NEIGHBORS.
C
	LNEXT(K) = -LNEXT(K)
C
C INITIALIZE FOR LOOP ON NPTS.
C
	RS = 0.
	SUM = 0.
	RWS = 0.
	RQ = 0.
	LNP = 0
C
C COMPUTE NPTS, LNP, RWS, NEQ, RQ, AND AVSQ.
C
    1	SUM = SUM + RS
	  IF (LNP .EQ. LMAX) GO TO 3
	  LNP = LNP + 1
	  RSOLD = RS
	  CALL GETNP3 (XK,YK,ZK,X,Y,Z,NNR,LCELL,LNEXT,XYZMN,
     .		       XYZDL, NP,RS)
	  IF (RS .EQ. 0.) GO TO 21
	  NPTS(LNP) = NP
	  IF ( (RS-RSOLD)/RS .LT.  RTOL ) GO TO 1
	  IF (RWS .EQ. 0.  .AND.  LNP .GT. NNW) RWS = RS
	  IF (RQ .NE. 0.  .OR.	LNP .LE. NNQ) GO TO 2
C
C   RQ = 0 (NOT YET COMPUTED) AND LNP .GT. NQ.	RQ =
C     SQRT(RS) IS SUFFICIENTLY LARGE TO (STRICTLY) INCLUDE
C     NQ NODES.  THE LEAST SQUARES FIT WILL INCLUDE NEQ =
C     LNP-1 EQUATIONS FOR 9 .LE. NQ .LE. NEQ .LT. LMAX
C     .LE. N-1.
C
	  NEQ = LNP - 1
	  RQ = SQRT(RS)
	  AVSQ = SUM/FLOAT(NEQ)
C
C   BOTTOM OF LOOP -- TEST FOR TERMINATION.
C
    2	  IF (LNP .GT. NQWMAX) GO TO 4
	  GO TO 1
C
C ALL LMAX NODES ARE INCLUDED IN NPTS.	RWS AND/OR RQ**2 IS
C   (ARBITRARILY) TAKEN TO BE 10 PERCENT LARGER THAN THE
C   DISTANCE RS TO THE LAST NODE INCLUDED.
C
    3	IF (RWS .EQ. 0.) RWS = 1.1*RS
	IF (RQ .NE. 0.) GO TO 4
	  NEQ = LMAX
	  RQ = SQRT(1.1*RS)
	  AVSQ = SUM/FLOAT(NEQ)
C
C STORE RSQ(K), UPDATE RSMX IF NECESSARY, AND COMPUTE AV.
C
    4	RSQ(K) = RWS
	IF (RWS .GT. RSMX) RSMX = RWS
	AV = SQRT(AVSQ)
C
C SET UP THE AUGMENTED REGRESSION MATRIX (TRANSPOSED) AS THE
C   COLUMNS OF B, AND ZERO OUT THE LOWER TRIANGLE (UPPER
C   TRIANGLE OF B) WITH GIVENS ROTATIONS -- QR DECOMPOSITION
C   WITH ORTHOGONAL MATRIX Q NOT STORED.
C
	I = 0
    5	  I = I + 1
	  NP = NPTS(I)
	  IROW = MIN0(I,10)
	  CALL SETUP3 (XK,YK,ZK,FK,X(NP),Y(NP),Z(NP),F(NP),
     .		       AV,AVSQ,RQ, B(1,IROW))
	  IF (I .EQ. 1) GO TO 5
	  IRM1 = IROW-1
	  DO 6 J = 1,IRM1
	    JP1 = J + 1
	    CALL GIVENS (B(J,J),B(J,IROW),C,S)
    6	    CALL ROTATE (10-J,C,S,B(JP1,J),B(JP1,IROW))
	  IF (I .LT. NEQ) GO TO 5
C
C TEST THE SYSTEM FOR ILL-CONDITIONING.
C
	DMIN = AMIN1( ABS(B(1,1)),ABS(B(2,2)),ABS(B(3,3)),
     .		      ABS(B(4,4)),ABS(B(5,5)),ABS(B(6,6)),
     .		      ABS(B(7,7)),ABS(B(8,8)),ABS(B(9,9)) )
	IF (DMIN*RQ .GE. DTOL) GO TO 13
	IF (NEQ .EQ. LMAX) GO TO 10
C
C INCREASE RQ AND ADD ANOTHER EQUATION TO THE SYSTEM TO
C   IMPROVE THE CONDITIONING.  THE NUMBER OF NPTS ELEMENTS
C   IS ALSO INCREASED IF NECESSARY.
C
    7	RSOLD = RS
	NEQ = NEQ + 1
	IF (NEQ .EQ. LMAX) GO TO 9
	IF (NEQ .EQ. LNP) GO TO 8
C
C   NEQ .LT. LNP
C
	NP = NPTS(NEQ+1)
	RS = (X(NP)-XK)**2 + (Y(NP)-YK)**2 + (Z(NP)-ZK)**2
	IF ( (RS-RSOLD)/RS .LT. RTOL ) GO TO 7
	RQ = SQRT(RS)
	GO TO 5
C
C   ADD AN ELEMENT TO NPTS.
C
    8	LNP = LNP + 1
	CALL GETNP3 (XK,YK,ZK,X,Y,Z,NNR,LCELL,LNEXT,XYZMN,
     .		     XYZDL, NP,RS)
	IF (NP .EQ. 0) GO TO 21
	NPTS(LNP) = NP
	IF ( (RS-RSOLD)/RS .LT. RTOL ) GO TO 7
	RQ = SQRT(RS)
	GO TO 5
C
    9	RQ = SQRT(1.1*RS)
	GO TO 5
C
C STABILIZE THE SYSTEM BY DAMPING SECOND PARTIALS -- ADD
C   MULTIPLES OF THE FIRST SIX UNIT VECTORS TO THE FIRST
C   SIX EQUATIONS.
C
   10	DO 12 I = 1,6
	  B(I,10) = SF
	  IP1 = I + 1
	  DO 11 J = IP1,10
   11	    B(J,10) = 0.
	  DO 12 J = I,9
	    JP1 = J + 1
	    CALL GIVENS (B(J,J),B(J,10),C,S)
   12	    CALL ROTATE (10-J,C,S,B(JP1,J),B(JP1,10))
C
C TEST THE STABILIZED SYSTEM FOR ILL-CONDITIONING.
C
	DMIN = AMIN1( ABS(B(1,1)),ABS(B(2,2)),ABS(B(3,3)),
     .		      ABS(B(4,4)),ABS(B(5,5)),ABS(B(6,6)),
     .		      ABS(B(7,7)),ABS(B(8,8)),ABS(B(9,9)) )
	IF (DMIN*RQ .LT. DTOL) GO TO 22
C
C SOLVE THE 9 BY 9 TRIANGULAR SYSTEM FOR THE COEFFICIENTS
C
   13	DO 15 IB = 1,9
	  I = 10-IB
	  T = 0.
	  IF (I .EQ. 9) GO TO 15
	  IP1 = I + 1
	  DO 14 J = IP1,9
   14	    T = T + B(J,I)*A(J,K)
   15	  A(I,K) = (B(10,I)-T)/B(I,I)
C
C SCALE THE COEFFICIENTS TO ADJUST FOR THE COLUMN SCALING.
C
	DO 16 I = 1,6
   16	  A(I,K) = A(I,K)/AVSQ
	A(7,K) = A(7,K)/AV
	A(8,K) = A(8,K)/AV
	A(9,K) = A(9,K)/AV
C
C UNMARK K AND THE ELEMENTS OF NPTS.
C
	LNEXT(K) = -LNEXT(K)
	DO 17 I = 1,LNP
	  NP = NPTS(I)
   17	  LNEXT(NP) = -LNEXT(NP)
   18	CONTINUE
C
C NO ERRORS ENCOUNTERED.
C
      DO 19 I = 1,3
	XYZMIN(I) = XYZMN(I)
   19	XYZDEL(I) = XYZDL(I)
      RMAX = SQRT(RSMX)
      IER = 0
      RETURN
C
C N, NQ, NW, OR NR IS OUT OF RANGE.
C
   20 IER = 1
      RETURN
C
C DUPLICATE NODES WERE ENCOUNTERED BY GETNP3.
C
   21 IER = 2
      RETURN
C
C NO UNIQUE SOLUTION DUE TO COLLINEAR NODES.
C
   22 DO 23 I = 1,3
	XYZMIN(I) = XYZMN(I)
   23	XYZDEL(I) = XYZDL(I)
      IER = 3
      RETURN
      END
      FUNCTION QS3VAL (PX,PY,PZ,N,X,Y,Z,F,NR,LCELL,LNEXT,
     .		       XYZMIN,XYZDEL,RMAX,RSQ,A)
      INTEGER N, NR, LCELL(NR,NR,NR), LNEXT(N)
      REAL    PX, PY, PZ, X(N), Y(N), Z(N), F(N), XYZMIN(3),
     .	      XYZDEL(3), RMAX, RSQ(N), A(9,N)
C
C***********************************************************
C
C						ROBERT RENKA
C					UNIV. OF NORTH TEXAS
C					      (817) 565-2767
C						    10/28/87
C
C   THIS FUNCTION RETURNS THE VALUE Q(PX,PY,PZ) WHERE Q IS
C THE WEIGHTED SUM OF QUADRATIC NODAL FUNCTIONS DEFINED IN
C SUBROUTINE QSHEP3.  QS3GRD MAY BE CALLED TO COMPUTE A
C GRADIENT OF Q ALONG WITH THE VALUE, AND/OR TO TEST FOR
C ERRORS.
C
C ON INPUT --
C
C	PX,PY,PZ = CARTESIAN COORDINATES OF THE POINT P AT
C		   WHICH Q IS TO BE EVALUATED.
C
C	N = NUMBER OF NODES AND DATA VALUES DEFINING Q.
C	    N .GE. 10.
C
C	X,Y,Z,F = ARRAYS OF LENGTH N CONTAINING THE NODES
C		  AND DATA VALUES INTERPOLATED BY Q.
C
C	NR = NUMBER OF ROWS, COLUMNS, AND PLANES IN THE CELL
C	     GRID.  REFER TO STORE3.  NR .GE. 1.
C
C	LCELL = NR BY NR BY NR ARRAY OF NODAL INDICES ASSO-
C		CIATED WITH CELLS.  REFER TO STORE3.
C
C	LNEXT = ARRAY OF LENGTH N CONTAINING NEXT-NODE INDI-
C		CES.  REFER TO STORE3.
C
C	XYZMIN,XYZDEL = ARRAYS OF LENGTH 3 CONTAINING MINI-
C			MUM NODAL COORDINATES AND CELL DIM-
C			ENSIONS, RESPECTIVELY.	XYZDEL
C			ELEMENTS MUST BE POSITIVE.  REFER TO
C			STORE3.
C
C	RMAX = SQUARE ROOT OF THE LARGEST ELEMENT IN RSQ --
C	       MAXIMUM RADIUS.
C
C	RSQ = ARRAY OF LENGTH N CONTAINING THE SQUARED RADII
C	      WHICH ENTER INTO THE WEIGHTS DEFINING Q.
C
C	A = 9 BY N ARRAY CONTAINING THE COEFFICIENTS FOR THE
C	    NODAL FUNCTIONS DEFINING Q.
C
C   INPUT PARAMETERS ARE NOT ALTERED BY THIS FUNCTION.	THE
C PARAMETERS OTHER THAN PX, PY AND PZ SHOULD BE INPUT UNAL-
C TERED FROM THEIR VALUES ON OUTPUT FROM QSHEP3.  THIS FUNC-
C TION SHOULD NOT BE CALLED IF A NONZERO ERROR FLAG WAS
C RETURNED BY QSHEP3.
C
C ON OUTPUT --
C
C	QS3VAL = FUNCTION VALUE Q(PX,PY,PZ) UNLESS N, NR,
C		 XYZDEL, OR RMAX IS INVALID, IN WHICH CASE
C		 NO VALUE IS RETURNED.
C
C MODULES REQUIRED BY QS3VAL -- NONE
C
C INTRINSIC FUNCTIONS CALLED BY QS3VAL -- IFIX, SQRT
C
C***********************************************************
C
      XP = PX
      YP = PY
      ZP = PZ
      XMIN = XYZMIN(1)
      YMIN = XYZMIN(2)
      ZMIN = XYZMIN(3)
      DX = XYZDEL(1)
      DY = XYZDEL(2)
      DZ = XYZDEL(3)
      IF (N .LT. 10  .OR.  NR .LT. 1  .OR.  DX .LE. 0.
     .	  .OR.	DY .LE. 0.  .OR.  DZ .LE. 0.  .OR.
     .	  RMAX .LT. 0.) RETURN
C
C SET IMIN, IMAX, JMIN, JMAX, KMIN, AND KMAX TO CELL INDICES
C   DEFINING THE RANGE OF THE SEARCH FOR NODES WHOSE RADII
C   INCLUDE P.	THE CELLS WHICH MUST BE SEARCHED ARE THOSE
C   INTERSECTED BY (OR CONTAINED IN) A SPHERE OF RADIUS RMAX
C   CENTERED AT P.
C
      IMIN = IFIX((XP-XMIN-RMAX)/DX) + 1
      IMAX = IFIX((XP-XMIN+RMAX)/DX) + 1
      IF (IMIN .LT. 1) IMIN = 1
      IF (IMAX .GT. NR) IMAX = NR
      JMIN = IFIX((YP-YMIN-RMAX)/DY) + 1
      JMAX = IFIX((YP-YMIN+RMAX)/DY) + 1
      IF (JMIN .LT. 1) JMIN = 1
      IF (JMAX .GT. NR) JMAX = NR
      KMIN = IFIX((ZP-ZMIN-RMAX)/DZ) + 1
      KMAX = IFIX((ZP-ZMIN+RMAX)/DZ) + 1
      IF (KMIN .LT. 1) KMIN = 1
      IF (KMAX .GT. NR) KMAX = NR
C
C THE FOLLOWING IS A TEST FOR NO CELLS WITHIN THE SPHERE
C   OF RADIUS RMAX.
C
      IF (IMIN .GT. IMAX  .OR.	JMIN .GT. JMAX	.OR.
     .	  KMIN .GT. KMAX) GO TO 5
C
C ACCUMULATE WEIGHT VALUES IN SW AND WEIGHTED NODAL FUNCTION
C   VALUES IN SWQ.  THE WEIGHTS ARE W(L) = ((R-D)+/(R*D))**2
C   FOR R**2 = RSQ(L) AND D = DISTANCE BETWEEN P AND NODE L.
C
      SW = 0.
      SWQ = 0.
C
C OUTER LOOP ON CELLS (I,J,K).
C
      DO 3 K = KMIN,KMAX
	DO 3 J = JMIN,JMAX
	  DO 3 I = IMIN,IMAX
	    L = LCELL(I,J,K)
	    IF (L .EQ. 0) GO TO 3
C
C INNER LOOP ON NODES L.
C
    1	    DELX = XP - X(L)
	    DELY = YP - Y(L)
	    DELZ = ZP - Z(L)
	    DXSQ = DELX*DELX
	    DYSQ = DELY*DELY
	    DZSQ = DELZ*DELZ
	    DS = DXSQ + DYSQ + DZSQ
	    RS = RSQ(L)
	    IF (DS .GE. RS) GO TO 2
	    IF (DS .EQ. 0.) GO TO 4
	    RDS = RS*DS
	    RD = SQRT(RDS)
	    W = (RS+DS-RD-RD)/RDS
	    SW = SW + W
	    SWQ = SWQ + W*( A(1,L)*DXSQ + A(2,L)*DELX*DELY +
     .			    A(3,L)*DYSQ + A(4,L)*DELX*DELZ +
     .			    A(5,L)*DELY*DELZ + A(6,L)*DZSQ +
     .			    A(7,L)*DELX + A(8,L)*DELY +
     .			    A(9,L)*DELZ + F(L) )
C
C BOTTOM OF LOOP ON NODES IN CELL (I,J,K).
C
    2	    LP = L
	    L = LNEXT(LP)
	    IF (L .NE. LP) GO TO 1
    3	    CONTINUE
C
C SW = 0 IFF P IS NOT WITHIN THE RADIUS R(L) FOR ANY NODE L.
C
      IF (SW .EQ. 0.) GO TO 5
      QS3VAL = SWQ/SW
      RETURN
C
C (PX,PY,PZ) = (X(L),Y(L),Z(L))
C
    4 QS3VAL = F(L)
      RETURN
C
C ALL WEIGHTS ARE 0 AT P.
C
    5 QS3VAL = 0.
      RETURN
      END
      SUBROUTINE QS3GRD (PX,PY,PZ,N,X,Y,Z,F,NR,LCELL,LNEXT,
     .			 XYZMIN,XYZDEL,RMAX,RSQ,A, Q,QX,QY,
     .			 QZ,IER)
      INTEGER N, NR, LCELL(NR,NR,NR), LNEXT(N), IER
      REAL    PX, PY, PZ, X(N), Y(N), Z(N), F(N), XYZMIN(3),
     .	      XYZDEL(3), RMAX, RSQ(N), A(9,N), Q, QX, QY, QZ
C
C***********************************************************
C
C						ROBERT RENKA
C					UNIV. OF NORTH TEXAS
C					      (817) 565-2767
C						    10/28/87
C
C   THIS SUBROUTINE COMPUTES THE VALUE AND GRADIENT AT
C (PX,PY,PZ) OF THE INTERPOLATORY FUNCTION Q DEFINED IN SUB-
C ROUTINE QSHEP3.  Q(X,Y,Z) IS A WEIGHTED SUM OF QUADRATIC
C NODAL FUNCTIONS.
C
C ON INPUT --
C
C	PX,PY,PZ = CARTESIAN COORDINATES OF THE POINT P AT
C		   WHICH Q AND ITS PARTIALS ARE TO BE EVAL-
C		   UATED.
C
C	N = NUMBER OF NODES AND DATA VALUES DEFINING Q.
C	    N .GE. 10.
C
C	X,Y,Z,F = ARRAYS OF LENGTH N CONTAINING THE NODES
C		  AND DATA VALUES INTERPOLATED BY Q.
C
C	NR = NUMBER OF ROWS, COLUMNS AND PLANES IN THE CELL
C	     GRID.  REFER TO STORE3.  NR .GE. 1.
C
C	LCELL = NR BY NR BY NR ARRAY OF NODAL INDICES ASSO-
C		CIATED WITH CELLS.  REFER TO STORE3.
C
C	LNEXT = ARRAY OF LENGTH N CONTAINING NEXT-NODE INDI-
C		CES.  REFER TO STORE3.
C
C	XYZMIN,XYZDEL = ARRAYS OF LENGTH 3 CONTAINING MINI-
C			MUM NODAL COORDINATES AND CELL DIM-
C			ENSIONS, RESPECTIVELY.	XYZDEL
C			ELEMENTS MUST BE POSITIVE.  REFER TO
C			STORE3.
C
C	RMAX = SQUARE ROOT OF THE LARGEST ELEMENT IN RSQ --
C	       MAXIMUM RADIUS.
C
C	RSQ = ARRAY OF LENGTH N CONTAINING THE SQUARED RADII
C	      WHICH ENTER INTO THE WEIGHTS DEFINING Q.
C
C	A = 9 BY N ARRAY CONTAINING THE COEFFICIENTS FOR THE
C	    NODAL FUNCTIONS DEFINING Q.
C
C   INPUT PARAMETERS ARE NOT ALTERED BY THIS SUBROUTINE.
C THE PARAMETERS OTHER THAN PX, PY, AND PZ SHOULD BE INPUT
C UNALTERED FROM THEIR VALUES ON OUTPUT FROM QSHEP3.  THIS
C SUBROUTINE SHOULD NOT BE CALLED IF A NONZERO ERROR FLAG
C WAS RETURNED BY QSHEP3.
C
C ON OUTPUT --
C
C	Q = VALUE OF Q AT (PX,PY,PZ) UNLESS IER .EQ. 1, IN
C	    WHICH CASE NO VALUES ARE RETURNED.
C
C	QX,QY,QZ = FIRST PARTIAL DERIVATIVES OF Q AT
C		   (PX,PY,PZ) UNLESS IER .EQ. 1.
C
C	IER = ERROR INDICATOR
C	      IER = 0 IF NO ERRORS WERE ENCOUNTERED.
C	      IER = 1 IF N, NR, XYZDEL, OR RMAX IS INVALID.
C	      IER = 2 IF NO ERRORS WERE ENCOUNTERED BUT
C		      (PX,PY,PZ) IS NOT WITHIN THE RADIUS
C		      R(K) FOR ANY NODE K (AND THUS Q = QX =
C		      QY = QZ = 0).
C
C MODULES REQUIRED BY QS3GRD -- NONE
C
C INTRINSIC FUNCTIONS CALLED BY QS3GRD -- IFIX, SQRT
C
C***********************************************************
C
      XP = PX
      YP = PY
      ZP = PZ
      XMIN = XYZMIN(1)
      YMIN = XYZMIN(2)
      ZMIN = XYZMIN(3)
      DX = XYZDEL(1)
      DY = XYZDEL(2)
      DZ = XYZDEL(3)
      IF (N .LT. 10  .OR.  NR .LT. 1  .OR.  DX .LE. 0.
     .	  .OR.	DY .LE. 0.  .OR.  DZ .LE. 0.  .OR.
     .	  RMAX .LT. 0.) GO TO 5
C
C SET IMIN, IMAX, JMIN, JMAX, KMIN, AND KMAX TO CELL INDICES
C   DEFINING THE RANGE OF THE SEARCH FOR NODES WHOSE RADII
C   INCLUDE P.	THE CELLS WHICH MUST BE SEARCHED ARE THOSE
C   INTERSECTED BY (OR CONTAINED IN) A SPHERE OF RADIUS RMAX
C   CENTERED AT P.
C
      IMIN = IFIX((XP-XMIN-RMAX)/DX) + 1
      IMAX = IFIX((XP-XMIN+RMAX)/DX) + 1
      IF (IMIN .LT. 1) IMIN = 1
      IF (IMAX .GT. NR) IMAX = NR
      JMIN = IFIX((YP-YMIN-RMAX)/DY) + 1
      JMAX = IFIX((YP-YMIN+RMAX)/DY) + 1
      IF (JMIN .LT. 1) JMIN = 1
      IF (JMAX .GT. NR) JMAX = NR
      KMIN = IFIX((ZP-ZMIN-RMAX)/DZ) + 1
      KMAX = IFIX((ZP-ZMIN+RMAX)/DZ) + 1
      IF (KMIN .LT. 1) KMIN = 1
      IF (KMAX .GT. NR) KMAX = NR
C
C THE FOLLOWING IS A TEST FOR NO CELLS WITHIN THE SPHERE
C   OF RADIUS RMAX.
C
      IF (IMIN .GT. IMAX  .OR.	JMIN .GT. JMAX	.OR.
     .	  KMIN .GT. KMAX) GO TO 6
C
C Q = SWQ/SW = SUM(W(L)*Q(L))/SUM(W(L)) WHERE THE SUM IS
C   FROM L = 1 TO N, Q(L) IS THE QUADRATIC NODAL FUNCTION,
C   AND W(L) = ((R-D)+/(R*D))**2 FOR RADIUS R(L) AND DIST-
C   ANCE D(L).	THUS
C
C	 QX = (SWQX*SW - SWQ*SWX)/SW**2
C	 QY = (SWQY*SW - SWQ*SWY)/SW**2
C	 QZ = (SWQZ*SW - SWQ*SWZ)/SW**2
C
C   WHERE SWQX AND SWX ARE PARTIAL DERIVATIVES WITH RESPECT
C   TO X OF SWQ AND SW, RESPECTIVELY.  SWQY, SWY, SWQZ, AND
C   SWZ ARE DEFINED SIMILARLY.
C
      SW = 0.
      SWX = 0.
      SWY = 0.
      SWZ = 0.
      SWQ = 0.
      SWQX = 0.
      SWQY = 0.
      SWQZ = 0.
C
C OUTER LOOP ON CELLS (I,J,K).
C
      DO 3 K = KMIN,KMAX
	DO 3 J = JMIN,JMAX
	  DO 3 I = IMIN,IMAX
	    L = LCELL(I,J,K)
	    IF (L .EQ. 0) GO TO 3
C
C INNER LOOP ON NODES L.
C
    1	    DELX = XP - X(L)
	    DELY = YP - Y(L)
	    DELZ = ZP - Z(L)
	    DXSQ = DELX*DELX
	    DYSQ = DELY*DELY
	    DZSQ = DELZ*DELZ
	    DS = DXSQ + DYSQ + DZSQ
	    RS = RSQ(L)
	    IF (DS .GE. RS) GO TO 2
	    IF (DS .EQ. 0.) GO TO 4
	    RDS = RS*DS
	    RD = SQRT(RDS)
	    W = (RS+DS-RD-RD)/RDS
	    T = 2.*(RD-RS)/(DS*RDS)
	    WX = DELX*T
	    WY = DELY*T
	    WZ = DELZ*T
	    QLX = 2.*A(1,L)*DELX + A(2,L)*DELY + A(4,L)*DELZ
	    QLY = A(2,L)*DELX + 2.*A(3,L)*DELY + A(5,L)*DELZ
	    QLZ = A(4,L)*DELX + A(5,L)*DELY + 2.*A(6,L)*DELZ
	    QL = (QLX*DELX + QLY*DELY + QLZ*DELZ)/2. +
     .		 A(7,L)*DELX + A(8,L)*DELY + A(9,L)*DELZ +
     .		 F(L)
	    QLX = QLX + A(7,L)
	    QLY = QLY + A(8,L)
	    QLZ = QLZ + A(9,L)
	    SW = SW + W
	    SWX = SWX + WX
	    SWY = SWY + WY
	    SWZ = SWZ + WZ
	    SWQ = SWQ + W*QL
	    SWQX = SWQX + WX*QL + W*QLX
	    SWQY = SWQY + WY*QL + W*QLY
	    SWQZ = SWQZ + WZ*QL + W*QLZ
C
C BOTTOM OF LOOP ON NODES IN CELL (I,J,K).
C
    2	    LP = L
	    L = LNEXT(LP)
	    IF (L .NE. LP) GO TO 1
    3	    CONTINUE
C
C SW = 0 IFF P IS NOT WITHIN THE RADIUS R(L) FOR ANY NODE L.
C
      IF (SW .EQ. 0.) GO TO 6
      Q = SWQ/SW
      SWS = SW*SW
      QX = (SWQX*SW - SWQ*SWX)/SWS
      QY = (SWQY*SW - SWQ*SWY)/SWS
      QZ = (SWQZ*SW - SWQ*SWZ)/SWS
      IER = 0
      RETURN
C
C (PX,PY,PZ) = (X(L),Y(L),Z(L))
C
    4 Q = F(L)
      QX = A(7,L)
      QY = A(8,L)
      QZ = A(9,L)
      IER = 0
      RETURN
C
C INVALID INPUT PARAMETER.
C
    5 IER = 1
      RETURN
C
C NO CELLS CONTAIN A POINT WITHIN RMAX OF P, OR
C   SW = 0 AND THUS DS .GE. RSQ(L) FOR ALL L.
C
    6 Q = 0.
      QX = 0.
      QY = 0.
      QZ = 0.
      IER = 2
      RETURN
      END
      SUBROUTINE GETNP3 (PX,PY,PZ,X,Y,Z,NR,LCELL,LNEXT,
     .			 XYZMIN,XYZDEL, NP,DSQ)
      INTEGER NR, LCELL(NR,NR,NR), LNEXT(1), NP
      REAL    PX, PY, PZ, X(1), Y(1), Z(1), XYZMIN(3),
     .	      XYZDEL(3), DSQ
C
C***********************************************************
C
C						ROBERT RENKA
C					UNIV. OF NORTH TEXAS
C					      (817) 565-2767
C
C   GIVEN A SET OF N NODES AND THE DATA STRUCTURE DEFINED IN
C SUBROUTINE STORE3, THIS SUBROUTINE USES THE CELL METHOD TO
C FIND THE CLOSEST UNMARKED NODE NP TO A SPECIFIED POINT P.
C NP IS THEN MARKED BY SETTING LNEXT(NP) TO -LNEXT(NP).  (A
C NODE IS MARKED IF AND ONLY IF THE CORRESPONDING LNEXT ELE-
C MENT IS NEGATIVE.  THE ABSOLUTE VALUES OF LNEXT ELEMENTS,
C HOWEVER, MUST BE PRESERVED.)	THUS, THE CLOSEST M NODES TO
C P MAY BE DETERMINED BY A SEQUENCE OF M CALLS TO THIS ROU-
C TINE.  NOTE THAT IF THE NEAREST NEIGHBOR TO NODE K IS TO
C BE DETERMINED (PX = X(K), PY = Y(K), AND PZ = Z(K)), THEN
C K SHOULD BE MARKED BEFORE THE CALL TO THIS ROUTINE.
C   THE SEARCH IS BEGUN IN THE CELL CONTAINING (OR CLOSEST
C TO) P AND PROCEEDS OUTWARD IN BOX-SHAPED LAYERS UNTIL ALL
C CELLS WHICH CONTAIN POINTS WITHIN DISTANCE R OF P HAVE
C BEEN SEARCHED, WHERE R IS THE DISTANCE FROM P TO THE FIRST
C UNMARKED NODE ENCOUNTERED (INFINITE IF NO UNMARKED NODES
C ARE PRESENT).
C
C ON INPUT --
C
C	PX,PY,PZ = CARTESIAN COORDINATES OF THE POINT P
C		   WHOSE NEAREST UNMARKED NEIGHBOR IS TO BE
C		   FOUND.
C
C	X,Y,Z = ARRAYS OF LENGTH N, FOR N .GE. 2, CONTAINING
C		THE CARTESIAN COORDINATES OF THE NODES.
C
C	NR = NUMBER OF ROWS, COLUMNS, AND PLANES IN THE CELL
C	     GRID.  NR .GE. 1.
C
C	LCELL = NR BY NR BY NR ARRAY OF NODAL INDICES ASSO-
C		CIATED WITH CELLS.
C
C	LNEXT = ARRAY OF LENGTH N CONTAINING NEXT-NODE INDI-
C		CES (OR THEIR NEGATIVES).
C
C	XYZMIN,XYZDEL = ARRAYS OF LENGTH 3 CONTAINING MINI-
C			MUM NODAL COORDINATES AND CELL DIM-
C			ENSIONS, RESPECTIVELY.	XYZDEL
C			ELEMENTS MUST BE POSITIVE.
C
C   INPUT PARAMETERS OTHER THAN LNEXT ARE NOT ALTERED BY
C THIS ROUTINE.  WITH THE EXCEPTION OF (PX,PY,PZ) AND THE
C SIGNS OF LNEXT ELEMENTS, THESE PARAMETERS SHOULD BE UNAL-
C TERED FROM THEIR VALUES ON OUTPUT FROM SUBROUTINE STORE3.
C
C ON OUTPUT --
C
C	NP = INDEX (FOR X, Y, AND Z) OF THE NEAREST UNMARKED
C	     NODE TO P, OR 0 IF ALL NODES ARE MARKED OR NR
C	     .LT. 1 OR AN ELEMENT OF XYZDEL IS NOT POSITIVE.
C	     LNEXT(NP) .LT. 0 IF NP .NE. 0.
C
C	DSQ = SQUARED EUCLIDEAN DISTANCE BETWEEN P AND NODE
C	      NP, OR 0 IF NP = 0.
C
C MODULES REQUIRED BY GETNP3 -- NONE
C
C INTRINSIC FUNCTIONS CALLED BY GETNP3 -- IABS, IFIX, SQRT
C
C***********************************************************
C
      LOGICAL FIRST
      XP = PX
      YP = PY
      ZP = PZ
      DX = XYZDEL(1)
      DY = XYZDEL(2)
      DZ = XYZDEL(3)
C
C TEST FOR INVALID INPUT PARAMETERS.
C
      IF (NR .LT. 1  .OR.  DX .LE. 0.  .OR.  DY .LE. 0.
     .	  .OR.	DZ .LE. 0.) GO TO 10
C
C INITIALIZE PARAMETERS --
C
C   FIRST = TRUE IFF THE FIRST UNMARKED NODE HAS YET TO BE
C	    ENCOUNTERED,
C   IMIN,...,KMAX = CELL INDICES DEFINING THE RANGE OF THE
C		    SEARCH,
C   DELX,DELY,DELZ = PX-XYZMIN(1), PY-XYZMIN(2), AND
C		     PZ-XYZMIN(3),
C   I0,J0,K0 = CELL CONTAINING OR CLOSEST TO P,
C   I1,...,K2 = CELL INDICES OF THE LAYER WHOSE INTERSECTION
C		WITH THE RANGE DEFINED BY IMIN,...,KMAX IS
C		CURRENTLY BEING SEARCHED.
C
      FIRST = .TRUE.
      IMIN = 1
      IMAX = NR
      JMIN = 1
      JMAX = NR
      KMIN = 1
      KMAX = NR
      DELX = XP - XYZMIN(1)
      DELY = YP - XYZMIN(2)
      DELZ = ZP - XYZMIN(3)
      I0 = IFIX(DELX/DX) + 1
      IF (I0 .LT. 1) I0 = 1
      IF (I0 .GT. NR) I0 = NR
      J0 = IFIX(DELY/DY) + 1
      IF (J0 .LT. 1) J0 = 1
      IF (J0 .GT. NR) J0 = NR
      K0 = IFIX(DELZ/DZ) + 1
      IF (K0 .LT. 1) K0 = 1
      IF (K0 .GT. NR) K0 = NR
      I1 = I0
      I2 = I0
      J1 = J0
      J2 = J0
      K1 = K0
      K2 = K0
C
C OUTER LOOP ON LAYERS, INNER LOOP ON LAYER CELLS, EXCLUDING
C   THOSE OUTSIDE THE RANGE (IMIN,IMAX) X (JMIN,JMAX) X
C   (KMIN,KMAX).
C
    1 DO 7 K = K1,K2
	IF (K .GT. KMAX) GO TO 8
	IF (K .LT. KMIN) GO TO 7
	DO 6 J = J1,J2
	  IF (J .GT. JMAX) GO TO 7
	  IF (J .LT. JMIN) GO TO 6
	  DO 5 I = I1,I2
	    IF (I .GT. IMAX) GO TO 6
	    IF (I .LT. IMIN) GO TO 5
	    IF (K .NE. K1  .AND.  K .NE. K2  .AND.
     .		J .NE. J1  .AND.  J .NE. J2  .AND.
     .		I .NE. I1  .AND.  I .NE. I2) GO TO 5
C
C SEARCH CELL (I,J,K) FOR UNMARKED NODES L.
C
	    L = LCELL(I,J,K)
	    IF (L .EQ. 0) GO TO 5
C
C   LOOP ON NODES IN CELL (I,J,K).
C
    2	    LN = LNEXT(L)
	    IF (LN .LT. 0) GO TO 4
C
C   NODE L IS NOT MARKED.
C
	    RSQ = (X(L)-XP)**2 + (Y(L)-YP)**2 + (Z(L)-ZP)**2
	    IF (.NOT. FIRST) GO TO 3
C
C   NODE L IS THE FIRST UNMARKED NEIGHBOR OF P ENCOUNTERED.
C     INITIALIZE LMIN TO THE CURRENT CANDIDATE FOR NP, AND
C     RSMIN TO THE SQUARED DISTANCE FROM P TO LMIN.  IMIN,
C     IMAX, JMIN, JMAX, KMIN, AND KMAX ARE UPDATED TO DEFINE
C     THE SMALLEST RECTANGLE CONTAINING A SPHERE OF RADIUS
C     R = SQRT(RSMIN) CENTERED AT P, AND CONTAINED IN (1,NR)
C     X (1,NR) X (1,NR) (EXCEPT THAT, IF P IS OUTSIDE THE
C     BOX DEFINED BY THE NODES, IT IS POSSIBLE THAT IMIN
C     .GT. NR OR IMAX .LT. 1, ETC.).  FIRST IS RESET TO
C     FALSE.
C
	    LMIN = L
	    RSMIN = RSQ
	    R = SQRT(RSMIN)
	    IMIN = IFIX((DELX-R)/DX) + 1
	    IF (IMIN .LT. 1) IMIN = 1
	    IMAX = IFIX((DELX+R)/DX) + 1
	    IF (IMAX .GT. NR) IMAX = NR
	    JMIN = IFIX((DELY-R)/DY) + 1
	    IF (JMIN .LT. 1) JMIN = 1
	    JMAX = IFIX((DELY+R)/DY) + 1
	    IF (JMAX .GT. NR) JMAX = NR
	    KMIN = IFIX((DELZ-R)/DZ) + 1
	    IF (KMIN .LT. 1) KMIN = 1
	    KMAX = IFIX((DELZ+R)/DZ) + 1
	    IF (KMAX .GT. NR) KMAX = NR
	    FIRST = .FALSE.
	    GO TO 4
C
C   TEST FOR NODE L CLOSER THAN LMIN TO P.
C
    3	    IF (RSQ .GE. RSMIN) GO TO 4
C
C   UPDATE LMIN AND RSMIN.
C
	    LMIN = L
	    RSMIN = RSQ
C
C   TEST FOR TERMINATION OF LOOP ON NODES IN CELL (I,J,K).
C
    4	    IF (IABS(LN) .EQ. L) GO TO 5
	    L = IABS(LN)
	    GO TO 2
    5	    CONTINUE
    6	  CONTINUE
    7	CONTINUE
C
C TEST FOR TERMINATION OF LOOP ON CELL LAYERS.
C
    8 IF (I1 .LE. IMIN	.AND.  I2 .GE. IMAX  .AND.
     .	  J1 .LE. JMIN	.AND.  J2 .GE. JMAX  .AND.
     .	  K1 .LE. KMIN	.AND.  K2 .GE. KMAX) GO TO 9
      I1 = I1 - 1
      I2 = I2 + 1
      J1 = J1 - 1
      J2 = J2 + 1
      K1 = K1 - 1
      K2 = K2 + 1
      GO TO 1
C
C UNLESS NO UNMARKED NODES WERE ENCOUNTERED, LMIN IS THE
C   CLOSEST UNMARKED NODE TO P.
C
    9 IF (FIRST) GO TO 10
      NP = LMIN
      DSQ = RSMIN
      LNEXT(LMIN) = -LNEXT(LMIN)
      RETURN
C
C ERROR -- NR OR XYZDEL IS INVALID OR ALL NODES ARE MARKED.
C
   10 NP = 0
      DSQ = 0.
      RETURN
      END
      SUBROUTINE GIVENS ( A,B, C,S)
      REAL A, B, C, S
C
C***********************************************************
C
C						ROBERT RENKA
C					UNIV. OF NORTH TEXAS
C					      (817) 565-2767
C
C   THIS ROUTINE CONSTRUCTS THE GIVENS PLANE ROTATION --
C     ( C  S)
C G = (     ) WHERE C*C + S*S = 1 -- WHICH ZEROS THE SECOND
C     (-S  C)
C ENTRY OF THE 2-VECTOR (A B)-TRANSPOSE.  A CALL TO GIVENS
C IS NORMALLY FOLLOWED BY A CALL TO ROTATE WHICH APPLIES
C THE TRANSFORMATION TO A 2 BY N MATRIX.  THIS ROUTINE WAS
C TAKEN FROM LINPACK.
C
C ON INPUT --
C
C	A,B = COMPONENTS OF THE 2-VECTOR TO BE ROTATED.
C
C ON OUTPUT --
C
C	A = VALUE OVERWRITTEN BY R = +/-SQRT(A*A + B*B)
C
C	B = VALUE OVERWRITTEN BY A VALUE Z WHICH ALLOWS C
C	    AND S TO BE RECOVERED AS FOLLOWS --
C	      C = SQRT(1-Z*Z), S=Z     IF ABS(Z) .LE. 1.
C	      C = 1/Z, S = SQRT(1-C*C) IF ABS(Z) .GT. 1.
C
C	C = +/-(A/R)
C
C	S = +/-(B/R)
C
C MODULES REQUIRED BY GIVENS -- NONE
C
C INTRINSIC FUNCTIONS CALLED BY GIVENS - ABS, SQRT
C
C***********************************************************
C
      REAL AA, BB, R, U, V
C
C LOCAL PARAMETERS --
C
C AA,BB = LOCAL COPIES OF A AND B
C R =	  C*A + S*B = +/-SQRT(A*A+B*B)
C U,V =   VARIABLES USED TO SCALE A AND B FOR COMPUTING R
C
      AA = A
      BB = B
      IF (ABS(AA) .LE. ABS(BB)) GO TO 1
C
C ABS(A) .GT. ABS(B)
C
      U = AA + AA
      V = BB/U
      R = SQRT(.25 + V*V) * U
      C = AA/R
      S = V * (C + C)
C
C NOTE THAT R HAS THE SIGN OF A, C .GT. 0, AND S HAS
C   SIGN(A)*SIGN(B).
C
      B = S
      A = R
      RETURN
C
C ABS(A) .LE. ABS(B)
C
    1 IF (BB .EQ. 0.) GO TO 2
      U = BB + BB
      V = AA/U
C
C STORE R IN A.
C
      A = SQRT(.25 + V*V) * U
      S = BB/A
      C = V * (S + S)
C
C NOTE THAT R HAS THE SIGN OF B, S .GT. 0, AND C HAS
C   SIGN(A)*SIGN(B).
C
      B = 1.
      IF (C .NE. 0.) B = 1./C
      RETURN
C
C A = B = 0.
C
    2 C = 1.
      S = 0.
      RETURN
      END
      SUBROUTINE ROTATE (N,C,S, X,Y )
      INTEGER N
      REAL    C, S, X(N), Y(N)
C
C***********************************************************
C
C						ROBERT RENKA
C					UNIV. OF NORTH TEXAS
C					      (817) 565-2767
C
C					     ( C  S)
C   THIS ROUTINE APPLIES THE GIVENS ROTATION (	   ) TO THE
C					     (-S  C)
C		(X(1) ... X(N))
C 2 BY N MATRIX (	      ).
C		(Y(1) ... Y(N))
C
C ON INPUT --
C
C	N = NUMBER OF COLUMNS TO BE ROTATED.
C
C	C,S = ELEMENTS OF THE GIVENS ROTATION.	THESE MAY BE
C	      DETERMINED BY SUBROUTINE GIVENS.
C
C	X,Y = ARRAYS OF LENGTH .GE. N CONTAINING THE VECTORS
C	      TO BE ROTATED.
C
C PARAMETERS N, C, AND S ARE NOT ALTERED BY THIS ROUTINE.
C
C ON OUTPUT --
C
C	X,Y = ROTATED VECTORS.
C
C MODULES REQUIRED BY ROTATE -- NONE
C
C***********************************************************
C
      INTEGER I
      REAL    XI, YI
C
C LOCAL PARAMETERS --
C
C I =	  DO-LOOP INDEX
C XI,YI = X(I), Y(I)
C
      IF (N .LE. 0 .OR. (C .EQ. 1. .AND. S .EQ. 0.)) RETURN
      DO 1 I = 1,N
	XI = X(I)
	YI = Y(I)
	X(I) = C*XI + S*YI
	Y(I) = -S*XI + C*YI
    1	CONTINUE
      RETURN
      END
      SUBROUTINE SETUP3 (XK,YK,ZK,FK,XI,YI,ZI,FI,S1,S2,
     .			 R, ROW)
      REAL XK, YK, ZK, FK, XI, YI, ZI, FI, S1, S2,
     .	   R, ROW(10)
C
C***********************************************************
C
C						ROBERT RENKA
C					UNIV. OF NORTH TEXAS
C					      (817) 565-2767
C
C   THIS ROUTINE SETS UP THE I-TH ROW OF AN AUGMENTED RE-
C GRESSION MATRIX FOR A WEIGHTED LEAST-SQUARES FIT OF A
C QUADRATIC FUNCTION Q(X,Y,Z) TO A SET OF DATA VALUES F,
C WHERE Q(XK,YK,ZK) = FK.  THE FIRST 6 COLUMNS (QUADRATIC
C TERMS) ARE SCALED BY 1/S2, AND COLUMNS 7, 8, AND 9 (LINEAR
C TERMS) ARE SCALED BY 1/S1.  THE WEIGHT IS (R-D)/(R*D) IF
C R .GT. D, AND 0 IF R .LE. D, WHERE D IS THE DISTANCE BE-
C TWEEN NODES I AND K.
C
C ON INPUT --
C
C	XK,YK,ZK,FK = COORDINATES AND DATA VALUE AT NODE K
C		      (INTERPOLATED BY Q).
C
C	XI,YI,ZI,FI = COORDINATES AND DATA VALUE AT NODE I.
C
C	S1,S2 = RECIPROCALS OF THE SCALE FACTORS.
C
C	R = RADIUS OF INFLUENCE ABOUT NODE K DEFINING THE
C	    WEIGHT.
C
C	ROW = ARRAY OF LENGTH 10.
C
C INPUT PARAMETERS ARE NOT ALTERED BY THIS ROUTINE.
C
C ON OUTPUT --
C
C	ROW = ARRAY CONTAINING A ROW OF THE AUGMENTED
C	      REGRESSION MATRIX.
C
C MODULES REQUIRED BY SETUP3 -- NONE
C
C INTRINSIC FUNCTION CALLED BY SETUP3 -- SQRT
C
C***********************************************************
C
      INTEGER I
      REAL    DX, DY, DZ, DXSQ, DYSQ, DZSQ, D, W, W1, W2
C
C LOCAL PARAMETERS -
C
C I =	 DO-LOOP INDEX
C DX =	 XI - XK
C DY =	 YI - YK
C DZ =	 ZI - ZK
C DXSQ = DX*DX
C DYSQ = DY*DY
C DZSQ = DZ*DZ
C D =	 DISTANCE BETWEEN NODES K AND I
C W =	 WEIGHT ASSOCIATED WITH THE ROW
C W1 =	 W/S1
C W2 =	 W/S2
C
      DX = XI - XK
      DY = YI - YK
      DZ = ZI - ZK
      DXSQ = DX*DX
      DYSQ = DY*DY
      DZSQ = DZ*DZ
      D = SQRT(DXSQ + DYSQ + DZSQ)
      IF (D .LE. 0.  .OR.  D .GE. R) GO TO 1
      W = (R-D)/R/D
      W1 = W/S1
      W2 = W/S2
      ROW(1) = DXSQ*W2
      ROW(2) = DX*DY*W2
      ROW(3) = DYSQ*W2
      ROW(4) = DX*DZ*W2
      ROW(5) = DY*DZ*W2
      ROW(6) = DZSQ*W2
      ROW(7) = DX*W1
      ROW(8) = DY*W1
      ROW(9) = DZ*W1
      ROW(10) = (FI - FK)*W
      RETURN
C
C NODES K AND I COINCIDE OR NODE I IS OUTSIDE OF THE RADIUS
C   OF INFLUENCE.  SET ROW TO THE ZERO VECTOR.
C
    1 DO 2 I = 1,10
    2	ROW(I) = 0.
      RETURN
      END
      SUBROUTINE STORE3 (N,X,Y,Z,NR, LCELL,LNEXT,XYZMIN,
     .			 XYZDEL,IER)
      INTEGER N, NR, LCELL(NR,NR,NR), LNEXT(N), IER
      REAL    X(N), Y(N), Z(N), XYZMIN(3), XYZDEL(3)
C
C***********************************************************
C
C						ROBERT RENKA
C					UNIV. OF NORTH TEXAS
C					      (817) 565-2767
C
C   GIVEN A SET OF N ARBITRARILY DISTRIBUTED NODES IN THREE-
C SPACE, THIS SUBROUTINE CREATES A DATA STRUCTURE FOR A
C CELL-BASED METHOD OF SOLVING CLOSEST-POINT PROBLEMS.	THE
C SMALLEST BOX CONTAINING THE NODES IS PARTITIONED INTO AN
C NR BY NR BY NR UNIFORM GRID OF CELLS, AND NODES ARE AS-
C SOCIATED WITH CELLS.	IN PARTICULAR, THE DATA STRUCTURE
C STORES THE INDICES OF THE NODES CONTAINED IN EACH CELL.
C FOR A UNIFORM RANDOM DISTRIBUTION OF NODES, THE NEAREST
C NODE TO AN ARBITRARY POINT CAN BE DETERMINED IN CONSTANT
C EXPECTED TIME.
C
C ON INPUT --
C
C	N = NUMBER OF NODES.  N .GE. 2.
C
C	X,Y,Z = ARRAYS OF LENGTH N CONTAINING THE CARTESIAN
C		COORDINATES OF THE NODES.
C
C	NR = NUMBER OF ROWS, COLUMNS, AND PLANES IN THE
C	     GRID.  THE CELL DENSITY (AVERAGE NUMBER OF
C	     NODES PER CELL) IS D = N/(NR**3).	A RECOMMEND-
C	     ED VALUE, BASED ON EMPIRICAL EVIDENCE, IS D = 3
C	     -- NR = (N/3)**(1/3).  NR .GE. 1.
C
C THE ABOVE PARAMETERS ARE NOT ALTERED BY THIS ROUTINE.
C
C	LCELL = ARRAY OF LENGTH .GE. NR**3.
C
C	LNEXT = ARRAY OF LENGTH .GE. N.
C
C	XYZMIN,XYZDEL = ARRAYS OF LENGTH .GE. 3.
C
C ON OUTPUT --
C
C	LCELL = NR BY NR BY NR CELL ARRAY SUCH THAT
C		LCELL(I,J,K) CONTAINS THE INDEX (FOR X, Y,
C		AND Z) OF THE FIRST NODE (NODE WITH SMALLEST
C		INDEX) IN CELL (I,J,K), OR LCELL(I,J,K) = 0
C		IF NO NODES ARE CONTAINED IN THE CELL.	THE
C		CORNER OF CELL (I,J,K) WHICH IS FARTHEST
C		FROM THE BOX CORNER DEFINED BY XYZMIN HAS
C		COORDINATES (XMIN+I*DX,YMIN+J*DY,ZMIN+K*DZ),
C		WHERE (XMIN,YMIN,ZMIN) ARE THE ELEMENTS OF
C		XYZMIN.  LCELL IS NOT DEFINED IF IER .NE. 0.
C
C	LNEXT = ARRAY OF NEXT-NODE INDICES SUCH THAT
C		LNEXT(L) CONTAINS THE INDEX OF THE NEXT NODE
C		IN THE CELL WHICH CONTAINS NODE L, OR
C		LNEXT(L) = L IF L IS THE LAST NODE IN THE
C		CELL FOR L = 1,...,N.  (THE NODES CONTAINED
C		IN A CELL ARE ORDERED BY THEIR INDICES.)
C		IF, FOR EXAMPLE, CELL (I,J,K) CONTAINS NODES
C		2, 3, AND 5 (AND NO OTHERS), THEN
C		LCELL(I,J,K) = 2, LNEXT(2) = 3, LNEXT(3) =
C		5, AND LNEXT(5) = 5.  LNEXT IS NOT DEFINED
C		IF IER .NE. 0.
C
C	XYZMIN = ARRAY OF LENGTH 3 CONTAINING THE MINIMUM
C		 NODAL COORDINATES XMIN, YMIN, AND ZMIN (IN
C		 THAT ORDER) UNLESS IER = 1.  THE OPPOSITE
C		 CORNER OF THE BOX DEFINED BY THE NODES IS
C		 (XMIN+NR*DX,YMIN+NR*DY,ZMIN+NR*DZ).
C
C	XYZDEL = ARRAY OF LENGTH 3 CONTAINING THE DIMENSIONS
C		 OF THE CELLS UNLESS IER = 1.  XYZDEL(1) =
C		 (XMAX-XMIN)/NR, XYZDEL(2) = (YMAX-YMIN)/NR,
C		 AND XYZDEL(3) = (ZMAX-ZMIN)/NR, WHERE XMIN,
C		 XMAX, YMIN, YMAX, ZMIN, AND ZMAX ARE THE
C		 EXTREMA OF X, Y, AND Z.
C
C	IER = ERROR INDICATOR --
C	      IER = 0 IF NO ERRORS WERE ENCOUNTERED.
C	      IER = 1 IF N .LT. 2 OR NR .LT. 1.
C	      IER = 2 IF A COMPONENT OF XYZDEL IS NOT
C		      POSITIVE.
C
C MODULES REQUIRED BY STORE3 -- NONE
C
C INTRINSIC FUNCTIONS CALLED BY STORE3 -- FLOAT, IFIX
C
C***********************************************************
C
      NN = N
      NNR = NR
      IF (NN .LT. 2  .OR.  NNR .LT. 1) GO TO 4
C
C COMPUTE THE DIMENSIONS OF THE RECTANGLE CONTAINING THE
C   NODES.
C
      XMN = X(1)
      XMX = XMN
      YMN = Y(1)
      YMX = YMN
      ZMN = Z(1)
      ZMX = ZMN
      DO 1 L = 2,NN
	IF (X(L) .LT. XMN) XMN = X(L)
	IF (X(L) .GT. XMX) XMX = X(L)
	IF (Y(L) .LT. YMN) YMN = Y(L)
	IF (Y(L) .GT. YMX) YMX = Y(L)
	IF (Z(L) .LT. ZMN) ZMN = Z(L)
    1	IF (Z(L) .GT. ZMX) ZMX = Z(L)
      XYZMIN(1) = XMN
      XYZMIN(2) = YMN
      XYZMIN(3) = ZMN
C
C COMPUTE CELL DIMENSIONS AND TEST FOR ZERO AREA.
C
      DELX = (XMX-XMN)/FLOAT(NNR)
      DELY = (YMX-YMN)/FLOAT(NNR)
      DELZ = (ZMX-ZMN)/FLOAT(NNR)
      XYZDEL(1) = DELX
      XYZDEL(2) = DELY
      XYZDEL(3) = DELZ
      IF (DELX .EQ. 0.	.OR.  DELY .EQ. 0.  .OR.
     .	  DELZ .EQ. 0.) GO TO 5
C
C INITIALIZE LCELL.
C
      DO 2 K = 1,NNR
	DO 2 J = 1,NNR
	  DO 2 I = 1,NNR
    2	    LCELL(I,J,K) = 0
C
C LOOP ON NODES, STORING INDICES IN LCELL AND LNEXT.
C
      NP1 = NN + 1
      DO 3 LL = 1,NN
	LB = NP1 - LL
	I = IFIX((X(LB)-XMN)/DELX) + 1
	IF (I .GT. NNR) I = NNR
	J = IFIX((Y(LB)-YMN)/DELY) + 1
	IF (J .GT. NNR) J = NNR
	K = IFIX((Z(LB)-ZMN)/DELZ) + 1
	IF (K .GT. NNR) K = NNR
	L = LCELL(I,J,K)
	LNEXT(LB) = L
	IF (L .EQ. 0) LNEXT(LB) = LB
    3	LCELL(I,J,K) = LB
C
C NO ERRORS ENCOUNTERED
C
      IER = 0
      RETURN
C
C INVALID INPUT PARAMETER
C
    4 IER = 1
      RETURN
C
C NONPOSITIVE XYZDEL COMPONENT
C
    5 IER = 2
      RETURN
      END
