5 * Revision 1.1.1.1 1996/04/01 15:02:19 mclareni
10 SUBROUTINE D501N2(K,N,M,A,AL,AU,X,NX,WORK,B,DPHI,DSCAL,LAMU,
11 1 AM,COV,IAFR,MFR,SUB,EPS0,EPS,MODE,NERROR)
13 #include "gen/imp64.inc"
14 #include "gen/def64.inc"
16 DIMENSION A(*),AL(*),AU(*),X(*),WORK(*),B(*),DPHI(*),DSCAL(*)
17 DIMENSION LAMU(*),AM(M,*),COV(M,*),IAFR(*)
20 *************************************************************************
21 * LEAMAX, VERSION: 15.03.1993
22 *************************************************************************
24 * THIS ROUTINE COMPUTES THE GRADIENT, THE JACOBIAN, AND IT SETS UP
25 * THE MATRIX FOR THE NORMAL EQUATIONS. IT ALSO DETERMINES THE ACTIVE
26 * SET OF CONSTRAINTS AND THE LAGRANGE-MULTIPLIER.
28 ************************************************************************
30 ************************************************************************
32 ************************************************************************
37 ************************************************************************
38 * COMPUTE THE GRADIENT B OF THE OBJECTIVE FUNCTION
39 * COMPUTE AN APPROXIMATION AM OF THE SECOND DERIVATIVE (THE HESSIAN)
40 * OF THE OBJECTIVE FUNCTION
41 ************************************************************************
44 CALL DVSET(M,Z0,B(1),B(2))
45 CALL DMSET(M,M,Z0,AM(1,1),AM(1,2),AM(2,1))
50 CALL SUB(K,X(IX),M,A,F0,WORK,MODE,NERROR)
51 IF(NERROR .NE. 0 .OR. F0 .LE. 0) THEN
58 ************************************************************************
59 * APPROXIMATE DERIVATIVES
60 ************************************************************************
63 H =ABS(A(J))*HREL+HABS
64 IF (A(J)+H .GT. AU(J)) H =-H
66 CALL SUB(K,X(IX),M,A,FH,WORK,MODE,NERROR)
67 IF(NERROR .NE. 0) THEN
75 CALL DVSCL(M,1/F0,WORK(1),WORK(2),WORK(1),WORK(2))
76 CALL DVSUB(M,B(1),B(2),WORK(1),WORK(2),B(1),B(2))
80 20 AM(L,J)=AM(L,J)+WORK(L)*WORK(J)
84 CALL DMUTL(M,AM(1,1),AM(1,2),AM(2,1))
86 ************************************************************************
87 * COPY THE GRADIENT OF THE OBJECTIVE FUNCTION TO DPHI
88 ************************************************************************
90 CALL DVCPY(M,B(1),B(2),DPHI(1),DPHI(2))
92 ************************************************************************
93 * DETERMINE THE DIAGONAL MATRIX DSCAL FOR SCALING THE PROBLEM
94 ************************************************************************
97 40 DSCAL(I)=MAX(DSCAL(I),SQRT(AM(I,I)))
99 ************************************************************************
100 * DETERMINE FREE VARIABLES AND STORE THEIR INDICES IN IAFR
101 * DETERMINE LAGRANGE MULTIPLIER LAMU
102 ************************************************************************
106 50 GR=GR+(DSCAL(I)*A(IAFR(I)))**2
108 CALL DVSET(M,Z0,LAMU(1),LAMU(2))
113 IF(AU(I)-AL(I) .LT. EPS*(ABS(AU(I))+ABS(AL(I)))+2*HABS) THEN
117 IF(A(I) .GE. AU(I)-(EPS * ABS(AU(I)) + HABS)) THEN
119 IF(DPHI(I) .GT. -GR) THEN
125 ELSE IF(A(I) .LE. AL(I)+(EPS * ABS(AL(I)) + HABS)) THEN
127 IF(DPHI(I) .LT. GR) THEN
141 ***********************************************************************
142 * DELETE ROWS AND COLUMNS OF AM AND B WHICH BELONG TO NON-FREE
144 ************************************************************************
146 IF(MFR .EQ. 0 .OR. MFR .EQ. M) THEN
152 DSCAL(I)=DSCAL(IAFR(I))
154 70 AM(L,I)=AM(L,IAFR(I))
157 80 AM(I,L)=AM(IAFR(I),L)
160 CALL DMCPY(MFC,MFC,AM(1,1),AM(1,2),AM(2,1),
161 + COV(1,1),COV(1,2),COV(2,1))