      SUBROUTINE LDP(G,MDG,M,N,H,X,XNORM,W,INDEX,MODE)
C
C     C.L.LAWSON AND R.J.HANSON, JET PROPULSION LABORATORY, 1974 MAR 1
C     TO APPEAR IN ^SOLVING LEAST SQUARES PROBLEMS^, PRENTICE HALL, 1974
C
C     LEAST DISTANCE PROGRAMMING
C
      IMPLICIT REAL*8(A-H,O-Z)
      IMPLICIT INTEGER(I-N)
C
      INTEGER INDEX(M)
      DIMENSION G(MDG,N),H(M),X(N),W(1)
      ZERO = 0.0
      ONE = 1.0
      IF(N.LE.0) GO TO 120
      DO 10 J=1,N
   10 X(J) = ZERO
      XNORM = ZERO
      IF(M.LE.0) GO TO 110
C
C     THE DECLARED DIMENSION OF W() MUST BE A LEAST (N+1)*(M+2)+2*M
C
C     FIRST (N+1)*M LOCS  OF W()  =  MATRIX E FOR PROBLEM NNLS.
C     NEXT      N+1 LOCS  OF W()  =  VECTOR F FOR PROBLEM NNLS.
C     NEXT      N+1 LOCS  OF W()  =  VECTOR Z FOR PROBLEM NNLS.
C     NEXT        M LOCS  OF W()  =  VECTOR Y FOR PROBLEM NNLS.
C     NEXT        M LOCS  OF W()  =  VECTOR WDUAL FOR PROBLEM NNLS.
C
C     COPY G(T) INTO FORST N ROWS AND M COLUMNS OF E
C     COPY H(T) INTO ROW N+1 OF E.
C
      IW = 0
      DO 30 J=1,M
      DO 20 I=1,N
      IW = IW + 1
   20 W(IW) = G(J,I)
      IW = IW + 1
   30 W(IW) = H(J)
      IF = IW + 1
C
C     STORE N ZEROS FOLLOWED BY A ONE INTO F.
C
      DO 40 I=1,N
      IW = IW + 1
   40 W(IW) = ZERO
      W(IW+1) = ONE
C
      NP1 = N + 1
      IZ = IW + 2
      IY = IZ + NP1
      IDUAL = IY + M
C
      CALL NNLS(W,NP1,NP1,M,W(IF),W(IY),RNORM,W(IDUAL),W(IZ),INDEX,
     1     MODE)
C
C     USE THE FOLLOWING RETURN IF UNSUCCESFUL IN NNLS
C
      IF(MODE.NE.1) RETURN
      IF(RNORM) 130,130,50
   50 FAC = ONE
      IW = IY - 1
      DO 60 I=1,M
      IW = IW + 1
C
C     HERE WE ARE USING THE SOLUTION VECTOR Y
C
   60 FAC = FAC - H(I)*W(IW)
C
      IF(DIFF(ONE+FAC,ONE)) 130,130,70
   70 FAC = ONE/FAC
      DO 90 J=1,N
      IW = IY - 1
      DO 80 I=1,M
      IW = IW + 1
C
C     HERE WE ARE USING THE SOLUTION VECTOR Y
C
   80 X(J) = X(J) + G(I,J)*W(IW)
   90 X(J) = X(J)*FAC
      DO 100 J=1,N
  100 XNORM = XNORM + X(J)**2
      XNORM = SQRT(XNORM)
C
C     SUCCESSFUL RETURN
C
  110 MODE = 1
      RETURN
C
C     ERROR RETURN
C
  120 MODE = 2
      RETURN
  130 MODE = 4
      RETURN
      END

