2
SUBROUTINE DLPDP (A, MDA, M, N1, N2, PRGOPT, X, WNORM, MODE, WS,
4
C***BEGIN PROLOGUE DLPDP
6
C***PURPOSE Subsidiary to DLSEI
8
C***TYPE DOUBLE PRECISION (LPDP-S, DLPDP-D)
9
C***AUTHOR Hanson, R. J., (SNLA)
10
C Haskell, K. H., (SNLA)
13
C **** Double Precision version of LPDP ****
14
C DIMENSION A(MDA,N+1),PRGOPT(*),X(N),WS((M+2)*(N+7)),IS(M+N+1),
15
C where N=N1+N2. This is a slight overestimate for WS(*).
17
C Determine an N1-vector W, and
19
C which minimizes the Euclidean length of W
20
C subject to G*W+H*Z .GE. Y.
21
C This is the least projected distance problem, LPDP.
22
C The matrices G and H are of respective
23
C dimensions M by N1 and M by N2.
25
C Called by subprogram DLSI( ).
30
C occupies rows 1,...,M and cols 1,...,N1+N2+1 of A(*,*).
32
C The solution (W) is returned in X(*).
35
C The value of MODE indicates the status of
36
C the computation after returning to the user.
38
C MODE=1 The solution was successfully obtained.
40
C MODE=2 The inequalities are inconsistent.
43
C***ROUTINES CALLED DCOPY, DDOT, DNRM2, DSCAL, DWNNLS
44
C***REVISION HISTORY (YYMMDD)
46
C 890531 Changed all specific intrinsics to generic. (WRB)
47
C 891214 Prologue converted to Version 4.0 format. (BAB)
48
C 900328 Added TYPE section. (WRB)
49
C 910408 Updated the AUTHOR section. (WRB)
50
C***END PROLOGUE DLPDP
52
INTEGER I, IS(*), IW, IX, J, L, M, MDA, MODE, MODEW, N, N1, N2,
54
DOUBLE PRECISION A(MDA,*), DDOT, DNRM2, FAC, ONE,
55
* PRGOPT(*), RNORM, SC, WNORM, WS(*), X(*), YNORM, ZERO
57
DATA ZERO,ONE /0.0D0,1.0D0/, FAC /0.1D0/
58
C***FIRST EXECUTABLE STATEMENT DLPDP
61
IF (M .GT. 0) GO TO 20
62
IF (N .LE. 0) GO TO 10
69
C BEGIN BLOCK PERMITTING ...EXITS TO 190
72
C SCALE NONZERO ROWS OF INEQUALITY MATRIX TO HAVE LENGTH ONE.
74
SC = DNRM2(N,A(I,1),MDA)
75
IF (SC .EQ. ZERO) GO TO 30
77
CALL DSCAL(NP1,SC,A(I,1),MDA)
81
C SCALE RT.-SIDE VECTOR TO HAVE LENGTH ONE (OR ZERO).
82
YNORM = DNRM2(M,A(1,NP1),1)
83
IF (YNORM .EQ. ZERO) GO TO 50
85
CALL DSCAL(M,SC,A(1,NP1),1)
88
C SCALE COLS OF MATRIX H.
90
60 IF (J .GT. N) GO TO 70
91
SC = DNRM2(M,A(1,J),1)
92
IF (SC .NE. ZERO) SC = ONE/SC
93
CALL DSCAL(M,SC,A(1,J),1)
98
IF (N1 .LE. 0) GO TO 130
100
C COPY TRANSPOSE OF (H G Y) TO WORK ARRAY WS(*).
104
C MOVE COL OF TRANSPOSE OF H INTO WORK ARRAY.
105
CALL DCOPY(N2,A(I,N1+1),MDA,WS(IW+1),1)
108
C MOVE COL OF TRANSPOSE OF G INTO WORK ARRAY.
109
CALL DCOPY(N1,A(I,1),MDA,WS(IW+1),1)
112
C MOVE COMPONENT OF VECTOR Y INTO WORK ARRAY.
117
CALL DCOPY(N,WS(IW+1),0,WS(IW+1),1)
122
C SOLVE EU=F SUBJECT TO (TRANSPOSE OF H)U=0, U.GE.0. THE
123
C MATRIX E = TRANSPOSE OF (G Y), AND THE (N+1)-VECTOR
124
C F = TRANSPOSE OF (0,...,0,1).
128
C DO NOT CHECK LENGTHS OF WORK ARRAYS IN THIS USAGE OF
132
CALL DWNNLS(WS,NP1,N2,NP1-N2,M,0,PRGOPT,WS(IX),RNORM,
135
C COMPUTE THE COMPONENTS OF THE SOLN DENOTED ABOVE BY W.
136
SC = ONE - DDOT(M,A(1,NP1),1,WS(IX),1)
137
IF (ONE + FAC*ABS(SC) .EQ. ONE .OR. RNORM .LE. ZERO)
141
X(J) = SC*DDOT(M,A(1,J),1,WS(IX),1)
144
C COMPUTE THE VECTOR Q=Y-GW. OVERWRITE Y WITH THIS
147
A(I,NP1) = A(I,NP1) - DDOT(N1,A(I,1),MDA,X,1)
156
IF (N2 .LE. 0) GO TO 180
158
C COPY TRANSPOSE OF (H Q) TO WORK ARRAY WS(*).
161
CALL DCOPY(N2,A(I,N1+1),MDA,WS(IW+1),1)
167
CALL DCOPY(N2,WS(IW+1),0,WS(IW+1),1)
174
C SOLVE RV=S SUBJECT TO V.GE.0. THE MATRIX R =(TRANSPOSE
175
C OF (H Q)), WHERE Q=Y-GW. THE (N2+1)-VECTOR S =(TRANSPOSE
178
C DO NOT CHECK LENGTHS OF WORK ARRAYS IN THIS USAGE OF
182
CALL DWNNLS(WS,N2+1,0,N2+1,M,0,PRGOPT,WS(IX),RNORM,MODEW,
185
C COMPUTE THE COMPONENTS OF THE SOLN DENOTED ABOVE BY Z.
186
SC = ONE - DDOT(M,A(1,NP1),1,WS(IX),1)
187
IF (ONE + FAC*ABS(SC) .EQ. ONE .OR. RNORM .LE. ZERO)
192
X(L) = SC*DDOT(M,A(1,L),1,WS(IX),1)*X(L)
202
C ACCOUNT FOR SCALING OF RT.-SIDE VECTOR IN SOLUTION.
203
CALL DSCAL(N,YNORM,X,1)
204
WNORM = DNRM2(N1,X,1)