5 * Revision 1.1.1.1 1996/04/01 15:03:25 mclareni
10 SUBROUTINE DELSLV(N,FMAJOR,FMINOR,LMAX,FRACT,X,XLOW,XUP,VOL,NCUT,N
11 1CDIM,ICUT,DELPLS,DELNEG,REGTOL,FTOL,FORIG,DFORIG,FNEW,FNLIN,FNLROW
12 2,DIAGJ,SPDIAG,SOL,Z,NFCNT)
13 INTEGER N, NCUT, NCDIM, NFCNT
15 DOUBLE PRECISION FMAJOR, FMINOR, FRACT, REGTOL, FTOL
16 DOUBLE PRECISION X(N), XUP(N), XLOW(N), DELPLS(N), DELNEG(N)
17 DOUBLE PRECISION FORIG(NCDIM), FNLIN(NCDIM)
18 DOUBLE PRECISION DFORIG(NCDIM), FNEW(NCDIM), FNLROW(NCDIM)
19 DOUBLE PRECISION DIAGJ(NCDIM), SPDIAG(NCDIM), SOL(NCDIM), Z(N)
21 INTEGER I, IAB, IBACK, II, ISAVE, ITRY,
23 DOUBLE PRECISION BIG, DEL, DELMAX, DELMIN, DFNEW, DFUN,
24 1 FDIF, FGAM, FNORM, FNRMNW, FOMX, FRAT, FZ, GAMMA,
25 2 GAMNEW, PROD, RATGAM, REGINV, SINGTL, TSTVAL,
26 3 VAL, VOL, XMULT, YDI, YDMIN
34 PROD=PROD*(DELPLS(I)+DELNEG(I))
37 FGAM=GAMMA*FMAJOR+(1.0D+0-GAMMA)*FMINOR
45 Z(IAB)=X(IAB)+DELPLS(IAB)
47 30 Z(IAB)=X(IAB)-DELNEG(IAB)
52 #if defined(CERNLIB_IBM)||defined(CERNLIB_SINGLE)
55 #if (!defined(CERNLIB_IBM))&&(defined(CERNLIB_DOUBLE))
60 YDI=ABS(FMAJOR-FNEW(I))
61 IF(YDI.GT.YDMIN) GOTO 70
66 IF((LMAX.AND.FNEW(NNEAR).LT.FGAM).OR.
67 1(.NOT.LMAX.AND.FNEW(NNEAR).GT.FGAM)) GOTO 130
69 IF(NNEAR.EQ.NCUT.OR.NCUT.EQ.1) GOTO 90
76 IF(ISAVE.LT.0) GOTO 100
77 DELPLS(ISAVE)=XUP(ISAVE)-X(ISAVE)
80 DELNEG(IAB)=X(IAB)-XLOW(IAB)
83 PROD=PROD*(DELPLS(I)+DELNEG(I))
86 FGAM=GAMMA*FMAJOR+(1.0D+0-GAMMA)*FMINOR
97 DFORIG(I)=(FNEW(I)-FMAJOR)/DEL
99 CALL FEQN(NCUT,FORIG,FGAM,FNLIN)
100 CALL RLEN(NCUT,FNLIN,FNORM)
104 IF(NCUT.EQ.1) GOTO 200
110 SPDIAG(I)=-DFORIG(I+1)
115 FNLROW(I)=-GAMMA*FDIF/(DELPLS(II)+DELNEG(II))
117 FNLROW(1)=DFORIG(1)+FNLROW(1)
118 IF(NCUT.EQ.1) GOTO 230
121 IF(ABS(FNLROW(I)).LT.BIG*ABS(DIAGJ(I))) XMULT=FNLROW(I)/DIAGJ(I
123 FNLROW(I+1)=FNLROW(I+1)-XMULT*SPDIAG(I)
124 FNLIN(NCUT)=FNLIN(NCUT)-XMULT*FNLIN(I)
126 230 SOL(NCUT)=FNLIN(NCUT)
127 IF(ABS(FNLROW(NCUT)).LT.BIG*ABS(FNLIN(NCUT))) SOL(NCUT)=FNLIN(N
129 IF(NCUT.EQ.1) GOTO 250
132 VAL=FNLIN(IBACK)-SOL(IBACK+1)*SPDIAG(IBACK)
134 IF(ABS(DIAGJ(IBACK)).LT.BIG*ABS(VAL)) SOL(IBACK)=VAL/DIAGJ(IBAC
142 DELMAX=FRACT*(XUP(IAB)-X(IAB)-DELPLS(IAB))
145 260 DELMAX=FRACT*(X(IAB)-XLOW(IAB)-DELNEG(IAB))
147 270 IF(SOL(I).GT.DELMAX) SOL(I)=0.75D+0*DELMAX
148 IF(SOL(I).LT.DELMIN) SOL(I)=0.75D+0*DELMIN
154 DELPLS(IAB)=DELPLS(IAB)+SOL(I)
156 300 DELNEG(IAB)=DELNEG(IAB)+SOL(I)
162 Z(IAB)=X(IAB)+DELPLS(IAB)
164 320 Z(IAB)=X(IAB)-DELNEG(IAB)
172 PROD=PROD*(DELPLS(I)+DELNEG(I))
175 FGAM=GAMNEW*FMAJOR+(1.0D+0-GAMNEW)*FMINOR
176 CALL FEQN(NCUT,FNEW,FGAM,FNLIN)
177 CALL RLEN(NCUT,FNLIN,FNRMNW)
178 IF(FNRMNW.GT.FNORM) GOTO 380
181 IF(ABS(FNEW(I)).GT.FOMX) FOMX=ABS(FNEW(I))
182 DFNEW=FNEW(I)-FORIG(I)
184 IF(ABS(SOL(I)).LT.BIG*ABS(DFNEW)) TSTVAL=DFNEW/SOL(I)
185 IF(ABS(TSTVAL).LT.SINGTL*ABS(DFORIG(I))) TSTVAL=SINGTL*DFORIG(I
191 FOMX=MAX(FOMX,ABS(FGAM))
192 FRAT=FNORM/(1.0D+0+FOMX)
196 C--- Activate to do debugging
197 C WRITE(6,420) FNORM,FOMX,FRAT
198 C WRITE(6,430) FGAM,RATGAM
199 FGAM=GAMMA*FMAJOR+(1.0D+0-GAMMA)*FMINOR
200 IF(RATGAM.GT.REGTOL.AND.RATGAM.LT.REGINV) GOTO 370
201 IF(FRAT.LT.FTOL) GOTO 370
210 DELPLS(IAB)=DELPLS(IAB)-SOL(I)
212 DELNEG(IAB)=DELNEG(IAB)-SOL(I)
214 SOL(I)=SOL(I)*0.25D+0
217 420 FORMAT(' FNORM, FOMX, FRAT', 3(1PD15.5))
218 430 FORMAT(' FGAM, RATGAM', 2(1PD15.5))