123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172 |
- SUBROUTINE UPDATE (N,NPT,BMAT,ZMAT,NDIM,VLAG,BETA,DENOM,
- 1 KNEW,W)
- IMPLICIT REAL*8 (A-H,O-Z)
- DIMENSION BMAT(NDIM,*),ZMAT(NPT,*),VLAG(*),W(*)
- C
- C The arrays BMAT and ZMAT are updated, as required by the new position
- C of the interpolation point that has the index KNEW. The vector VLAG has
- C N+NPT components, set on entry to the first NPT and last N components
- C of the product Hw in equation (4.11) of the Powell (2006) paper on
- C NEWUOA. Further, BETA is set on entry to the value of the parameter
- C with that name, and DENOM is set to the denominator of the updating
- C formula. Elements of ZMAT may be treated as zero if their moduli are
- C at most ZTEST. The first NDIM elements of W are used for working space.
- C
- C Set some constants.
- C
- ONE=1.0D0
- ZERO=0.0D0
- NPTM=NPT-N-1
- ZTEST=ZERO
- DO 10 K=1,NPT
- DO 10 J=1,NPTM
- 10 ZTEST=DMAX1(ZTEST,DABS(ZMAT(K,J)))
- ZTEST=1.0D-20*ZTEST
- C
- C Apply the rotations that put zeros in the KNEW-th row of ZMAT.
- C
- JL=1
- DO 30 J=2,NPTM
- IF (DABS(ZMAT(KNEW,J)) .GT. ZTEST) THEN
- TEMP=DSQRT(ZMAT(KNEW,1)**2+ZMAT(KNEW,J)**2)
- TEMPA=ZMAT(KNEW,1)/TEMP
- TEMPB=ZMAT(KNEW,J)/TEMP
- DO 20 I=1,NPT
- TEMP=TEMPA*ZMAT(I,1)+TEMPB*ZMAT(I,J)
- ZMAT(I,J)=TEMPA*ZMAT(I,J)-TEMPB*ZMAT(I,1)
- 20 ZMAT(I,1)=TEMP
- END IF
- ZMAT(KNEW,J)=ZERO
- 30 CONTINUE
- C
- C Put the first NPT components of the KNEW-th column of HLAG into W,
- C and calculate the parameters of the updating formula.
- C
- DO 40 I=1,NPT
- W(I)=ZMAT(KNEW,1)*ZMAT(I,1)
- 40 CONTINUE
- ALPHA=W(KNEW)
- TAU=VLAG(KNEW)
- VLAG(KNEW)=VLAG(KNEW)-ONE
- C
- C Complete the updating of ZMAT.
- C
- TEMP=DSQRT(DENOM)
- TEMPB=ZMAT(KNEW,1)/TEMP
- TEMPA=TAU/TEMP
- DO 50 I=1,NPT
- 50 ZMAT(I,1)=TEMPA*ZMAT(I,1)-TEMPB*VLAG(I)
- C
- C Finally, update the matrix BMAT.
- C
- DO 60 J=1,N
- JP=NPT+J
- W(JP)=BMAT(KNEW,J)
- TEMPA=(ALPHA*VLAG(JP)-TAU*W(JP))/DENOM
- TEMPB=(-BETA*W(JP)-TAU*VLAG(JP))/DENOM
- DO 60 I=1,JP
- BMAT(I,J)=BMAT(I,J)+TEMPA*VLAG(I)+TEMPB*W(I)
- IF (I .GT. NPT) BMAT(JP,I-NPT)=BMAT(I,J)
- 60 CONTINUE
- RETURN
- END
|