24 SUBROUTINE mnmigr(FCN,FUTIL)
38 IMPLICIT DOUBLE PRECISION (
a-
h,
o-
z)
60 2/mn7ext/ u(mne) ,alim(mne) ,blim(mne)
61 3/mn7err/ erp(mni) ,ern(mni) ,werr(mni) ,globcc(mni)
62 4/mn7inx/ nvarl(mne) ,niofex(mne),nexofi(mni)
63 5/mn7int/
x(mni) ,xt(mni) ,dirin(mni)
64 6/mn7fx2/
xs(mni) ,xts(mni) ,dirins(mni)
65 7/mn7der/ grd(mni) ,g2(mni) ,gstep(mni) ,gin(mne) ,dgrd(mni)
66 8/mn7fx3/ grds(mni) ,g2s(mni) ,gsteps(mni)
67 9/mn7fx1/ ipfix(mni) ,npfix
68 a/mn7var/ vhmat(mnihl)
69 b/mn7vat/ vthmat(mnihl)
70 c/mn7sim/
p(mni,mni+1),pstar(mni),pstst(mni) ,pbar(mni),prho(mni)
72 parameter(maxdbg=10, maxstk=10, maxcwd=20,
maxp=30, maxcpt=101)
75 d/mn7npr/ maxint ,npar ,maxext ,nu
76 e/mn7iou/ isysrd ,isyswr ,isyssa ,npagwd ,npagln ,newpag
77 e/mn7io2/ istkrd(maxstk) ,nstkrd ,istkwr(maxstk) ,nstkwr
78 f/mn7tit/ cfrom ,cstatu ,ctitl ,cword ,cundef ,cvrsn ,covmes
79 g/mn7flg/ isw(7) ,idbg(0:maxdbg) ,nblock ,icomnd
80 h/mn7min/ amin ,
up ,edm ,fval3 ,epsi ,apsi ,dcovar
81 i/mn7cnv/ nfcn ,nfcnmx ,nfcnlc ,nfcnfr ,itaur,istrat,nwrmes(2)
83 k/mn7log/ lwarn ,lrepor ,limset ,lnolim ,lnewmn ,lphead
84 l/mn7cns/ epsmac ,epsma2 ,vlimlo ,vlimhi ,undefi ,bigedm,updflt
85 m/mn7rpt/ xpt(maxcpt) ,ypt(maxcpt)
86 n/mn7cpt/ chpt(maxcpt)
87 o/mn7xcr/ xmidcr ,ymidcr ,xdircr ,ydircr ,ke1cr ,ke2cr
88 CHARACTER CTITL*50, CWORD*(maxcwd), CUNDEF*10, CFROM*8,
89 + cvrsn*6, covmes(0:3)*22, cstatu*10, chpt*1
90 LOGICAL LWARN, LREPOR, LIMSET, LNOLIM, LNEWMN, LPHEAD
92 dimension gs(mni), step(mni), xxs(mni), flnu(mni),
vg(mni)
95 IF (npar .LE. 0)
RETURN 96 IF (amin .EQ. undefi)
CALL mnamin(fcn,futil)
97 ldebug = (idbg(4) .GE. 1)
102 iswtr = isw(5) - 2*itaur
105 lenv = npar*(npar+1)/2
111 IF (iswtr .GE. 1)
WRITE (isyswr,470) istrat,rhotol
112 470
FORMAT (
' START MIGRAD MINIMIZATION. STRATEGY',i2,
113 +.LT.
'. CONVERGENCE WHEN EDM ',e9.2)
115 IF (istrat.LT.2 .OR. isw(2).GE.3)
GO TO 2
118 IF (nrstrt .GT. istrat)
THEN 127 IF (isw(2) .GE. 1)
GO TO 10
131 IF (isw(3) .EQ. 1)
THEN 132 CALL fcn(nparx,gin,fzero,u,2,futil)
136 IF (isw(2) .GE. 1)
GO TO 10
144 IF (lined2 .LT. (istrat+1)*npar)
THEN 146 IF (g2(
i) .GT. zero)
GO TO 5
147 step(
i) = -sign(gstep(
i),grd(
i))
148 gdel = step(
i)*grd(
i)
150 CALL mnline(fcn,xxs,fs,step,gdel,toler,futil)
151 CALL mnwarn(
'D',
'MNMIGR',
'Negative G2 line search')
153 IF (ldebug)
WRITE (isyswr,
'(A,I3,2G13.3)')
154 +
' Negative G2 line search, param ',iext,fs,amin
165 IF (g2(
i) .LE. zero) g2(
i) = 1.
166 vhmat(ndex) = 2./g2(
i)
169 IF (ldebug)
WRITE (isyswr,
'(A,A/(1X,10G10.2))')
' DEBUG MNMIGR,',
170 +
' STARTING MATRIX DIAGONAL, VHMAT=', (vhmat(kk),kk=1,lenv)
174 IF (nrstrt .GT. istrat+1)
THEN 187 17 edm = edm + gs(
i)*vhmat(ndex)*gs(
j)
189 18 edm = edm + 0.5 * gs(
i)**2 *vhmat(ndex)
190 edm = edm * 0.5 * (1.0+3.0*dcovar)
191 IF (edm .LT. zero)
THEN 192 CALL mnwarn(
'W',
'MIGRAD',
'STARTING MATRIX NOT POS-DEFINITE.')
197 IF (isw(2) .EQ. 0) edm=bigedm
201 IF (iswtr .GE. 1)
CALL mnprin(3,amin)
202 IF (iswtr .GE. 2)
CALL mnmatu(0)
205 IF (nfcn-npfn .GE. nfcnmx)
GO TO 190
210 gssq = gssq + gs(
i)**2
215 25 ri = ri + vhmat(ndex) *gs(
j)
217 30 gdel = gdel + step(
i)*gs(
i)
218 IF (gssq .EQ. zero)
THEN 220 +
' FIRST DERIVATIVES OF FCN ARE ALL ZERO')
224 IF (gdel .GE. zero)
THEN 225 CALL mnwarn(
'D',
'MIGRAD',
' NEWTON STEP NOT DESCENT.')
226 IF (npsdf .EQ. 1)
GO TO 1
232 CALL mnline(fcn,xxs,fs,step,gdel,toler,futil)
233 IF (amin .EQ. fs)
GO TO 200
239 IF (isw(3) .EQ. 1)
THEN 240 CALL fcn(nparx,gin,fzero,u,2,futil)
257 vgi = vgi + vhmat(ndex)*(grd(
j)-gs(
j))
258 90 ri = ri + vhmat(ndex)* grd(
j)
260 gami = grd(
i) - gs(
i)
261 gdgssq = gdgssq + gami**2
262 gvg = gvg + gami*
vg(
i)
263 delgam = delgam + dirin(
i)*gami
264 100 edm = edm + grd(
i)*ri*0.5
265 edm = edm * 0.5 * (1.0 + 3.0*dcovar)
267 IF (edm .LT. zero .OR. gvg .LE. zero)
THEN 268 CALL mnwarn(
'D',
'MIGRAD',
'NOT POS-DEF. EDM OR GVG NEGATIVE.')
269 cstatu =
'NOT POSDEF' 270 IF (npsdf .EQ. 1)
GO TO 230
277 IF (iswtr.GE.3 .OR. (iswtr.EQ.2.AND.mod(iter,10).EQ.1))
THEN 281 IF (gdgssq .EQ. zero)
CALL mnwarn(
'D',
'MIGRAD',
282 +
'NO CHANGE IN FIRST DERIVATIVES OVER LAST STEP')
283 IF (delgam .LT. zero)
CALL mnwarn(
'D',
'MIGRAD',
284 +
'FIRST DERIVATIVES INCREASING ALONG SEARCH LINE')
286 cstatu =
'IMPROVEMNT' 287 IF (ldebug)
WRITE (isyswr,
'(A,(1X,10G10.3))')
' VHMAT 1 =',
288 + (vhmat(kk),kk=1,10)
293 d = dirin(
i)*dirin(
j)/delgam -
vg(
i)*
vg(
j)/gvg
296 vhmat(ndex) = vhmat(ndex) + 2.0*
d 297 vsum = vsum + abs(vhmat(ndex))
300 dcovar = 0.5*(dcovar + dsum/vsum)
301 IF (iswtr.GE.3 .OR. ldebug)
WRITE (isyswr,
'(A,F5.1,A)')
302 +
' RELATIVE CHANGE IN COV. MATRIX=',dcovar*100.,
'%' 303 IF (ldebug)
WRITE (isyswr,
'(A,(1X,10G10.3))')
' VHMAT 2 =',
304 + (vhmat(kk),kk=1,10)
305 IF (delgam .LE. gvg)
GO TO 135
307 125 flnu(
i) = dirin(
i)/delgam -
vg(
i)/gvg
311 130 vhmat(ndex) = vhmat(ndex) + 2.0*gvg*flnu(
i)*flnu(
j)
314 IF (edm .LT. 0.1*rhotol)
GO TO 300
321 IF (isw(2) .EQ. 0 .AND. dcovar.LT. 0.5 ) isw(2) = 1
322 IF (isw(2) .EQ. 3 .AND. dcovar.GT. 0.1 ) isw(2) = 1
323 IF (isw(2) .EQ. 1 .AND. dcovar.LT. 0.05) isw(2) = 3
329 +
WRITE (isyswr,
'(A)')
' CALL LIMIT EXCEEDED IN MIGRAD.' 330 cstatu =
'CALL LIMIT' 333 200
IF (iswtr .GE. 1)
WRITE (isyswr,
'(A)')
334 +
' MIGRAD FAILS TO FIND IMPROVEMENT' 337 IF (edm .LT. rhotol)
GO TO 300
338 IF (edm .LT. abs(epsma2*amin))
THEN 339 IF (iswtr .GE. 0)
WRITE (isyswr,
'(A)')
340 +
' MACHINE ACCURACY LIMITS FURTHER IMPROVEMENT.' 343 IF (istrat .LT. 1)
THEN 344 IF (isw(5) .GE. 0)
WRITE (isyswr,
'(A)')
345 +
' MIGRAD FAILS WITH STRATEGY=0. WILL TRY WITH STRATEGY=1.' 350 230
IF (iswtr .GE. 0)
WRITE (isyswr,
'(A)')
351 +
' MIGRAD TERMINATED WITHOUT CONVERGENCE.' 352 IF (isw(2) .EQ. 3) isw(2) = 1
356 300
IF (iswtr .GE. 0)
WRITE(isyswr,
'(/A)')
357 +
' MIGRAD MINIMIZATION HAS CONVERGED.' 358 IF (itaur .EQ. 0)
THEN 359 IF (istrat .GE. 2 .OR. (istrat.EQ.1.AND.isw(2).LT.3))
THEN 360 IF (isw(5) .GE. 0)
WRITE (isyswr,
'(/A)')
361 +
' MIGRAD WILL VERIFY CONVERGENCE AND ERROR MATRIX.' 365 IF (edm .GT. rhotol)
GO TO 10
376 IF (iswtr .GE. 0)
CALL mnprin (3,amin)
377 IF (iswtr .GE. 1)
CALL mnmatu(1)
integer npitbl real *nx parameter(n=101, npitbl=46, nx=n-1) real *8 uconst
block data include Zlatfit h c fitting region data data data data data d0 data data d0 data data h g *is for param c g data up(2, 1)/7.0d0/
dE dx *! Nuc Int sampling table e
subroutine mnmigr(FCN, FUTIL)
subroutine mnline(FCN, START, FSTART, STEP, SLOPE, TOLER, FUTIL)
subroutine mnprin(INKODE, FVAL)
! constants thru Cosmos real ! if multiplied to deg radian Torad ! light velocity m sec ! infinty ! kg m2 *Togpcm2 g cm2 ! g cm2 *Tokgpm2 kg m2 ! cm *Tom m ! m *Tocm cm ! g cm3 *Tokgpm3 kg m3 ! kg m3 *Togpcm3 g cm3 ! sec *Tonsec nsec ! Tesla m ! Avogadro *A2deninv ! mfp *n * xs
subroutine mnamin(FCN, FUTIL)
********************block data cblkHeavy ********************integer j data *HeavyG2symbol p
********************block data cblkHeavy ********************integer j data *HeavyG2symbol *data *HeavyG2code kiron data j
subroutine mnhess(FCN, FUTIL)
dE dx *! Nuc Int sampling table d
dE dx *! Nuc Int sampling table b
block data include Zlatfit h c fitting region data data data data data d0 data data d0 data data m
! Zkcele h ! unit here is aunit parameter pi real vg
dE dx *! Nuc Int sampling table h
dE dx *! Nuc Int sampling table g
subroutine mnderi(FCN, FUTIL)
subroutine mnwarn(COPT, CORG, CMES)
! structure defining a particle at production ! Basic idea of what is to be contained in ! the particle structue is that dynamical ones should be included those derivable from the particle code ! is not included ******************************************************type fmom momentum sequence union map real e endmap map real * x
dE dx *! Nuc Int sampling table f
dE dx *! Nuc Int sampling table c