source: Sophya/trunk/SophyaExt/CodeMinuit/code/mneig.F@ 3072

Last change on this file since 3072 was 2403, checked in by cmv, 22 years ago

Creation du module de code source de MINUIT (CERNLIB) extrait par CMV

cmv 11/06/2003

File size: 3.5 KB
Line 
1*
2* $Id: mneig.F,v 1.1.1.1 2003-06-11 14:18:27 cmv Exp $
3*
4* $Log: not supported by cvs2svn $
5* Revision 1.1.1.1 1996/03/07 14:31:29 mclareni
6* Minuit
7*
8*
9#include "minuit/pilot.h"
10 SUBROUTINE MNEIG(A,NDIMA,N,MITS,WORK,PRECIS,IFAULT)
11#include "minuit/d506dp.inc"
12C
13 PARAMETER (ZERO=0.0, ONE=1.0, TWO=2.0)
14 PARAMETER (TOL=1.0E-35)
15 DIMENSION A(NDIMA,*),WORK(*)
16C PRECIS is the machine precision EPSMAC
17 IFAULT = 1
18C
19 I = N
20 DO 70 I1 = 2,N
21 L = I-2
22 F = A(I,I-1)
23 GL = ZERO
24C
25 IF(L .LT. 1) GO TO 25
26C
27 DO 20 K = 1,L
28 20 GL = GL+A(I,K)**2
29 25 H = GL + F**2
30C
31 IF(GL .GT. TOL) GO TO 30
32C
33 WORK(I) = ZERO
34 WORK(N+I) = F
35 GO TO 65
36 30 L = L+1
37C
38 GL = SQRT(H)
39C
40 IF(F .GE. ZERO) GL = -GL
41C
42 WORK(N+I) = GL
43 H = H-F*GL
44 A(I,I-1) = F-GL
45 F = ZERO
46 DO 50 J = 1,L
47 A(J,I) = A(I,J)/H
48 GL = ZERO
49 DO 40 K = 1,J
50 40 GL = GL+A(J,K)*A(I,K)
51C
52 IF(J .GE. L) GO TO 47
53C
54 J1 = J+1
55 DO 45 K = J1,L
56 45 GL = GL+A(K,J)*A(I,K)
57 47 WORK(N+J) = GL/H
58 F = F+GL*A(J,I)
59 50 CONTINUE
60 HH = F/(H+H)
61 DO 60 J = 1,L
62 F = A(I,J)
63 GL = WORK(N+J)-HH*F
64 WORK(N+J) = GL
65 DO 60 K = 1,J
66 A(J,K) = A(J,K)-F*WORK(N+K)-GL*A(I,K)
67 60 CONTINUE
68 WORK(I) = H
69 65 I = I-1
70 70 CONTINUE
71 WORK(1) = ZERO
72 WORK(N+1) = ZERO
73 DO 110 I = 1,N
74 L = I-1
75C
76 IF(WORK(I) .EQ. ZERO .OR. L .EQ. 0) GO TO 100
77C
78 DO 90 J = 1,L
79 GL = ZERO
80 DO 80 K = 1,L
81 80 GL = GL+A(I,K)*A(K,J)
82 DO 90 K = 1,L
83 A(K,J) = A(K,J)-GL*A(K,I)
84 90 CONTINUE
85 100 WORK(I) = A(I,I)
86 A(I,I) = ONE
87C
88 IF(L .EQ. 0) GO TO 110
89C
90 DO 105 J = 1,L
91 A(I,J) = ZERO
92 A(J,I) = ZERO
93 105 CONTINUE
94 110 CONTINUE
95C
96C
97 N1 = N-1
98 DO 130 I = 2,N
99 I0 = N+I-1
100 130 WORK(I0) = WORK(I0+1)
101 WORK(N+N) = ZERO
102 B = ZERO
103 F = ZERO
104 DO 210 L = 1,N
105 J = 0
106 H = PRECIS*(ABS(WORK(L))+ABS(WORK(N+L)))
107C
108 IF(B .LT. H) B = H
109C
110 DO 140 M1 = L,N
111 M = M1
112C
113 IF(ABS(WORK(N+M)) .LE. B) GO TO 150
114C
115 140 CONTINUE
116C
117 150 IF(M .EQ. L) GO TO 205
118C
119 160 IF(J .EQ. MITS) RETURN
120C
121 J = J+1
122 PT = (WORK(L+1)-WORK(L))/(TWO*WORK(N+L))
123 R = SQRT(PT*PT+ONE)
124 PR = PT+R
125C
126 IF(PT .LT. ZERO) PR=PT-R
127C
128 H = WORK(L)-WORK(N+L)/PR
129 DO 170 I=L,N
130 170 WORK(I) = WORK(I)-H
131 F = F+H
132 PT = WORK(M)
133 C = ONE
134 S = ZERO
135 M1 = M-1
136 I = M
137 DO 200 I1 = L,M1
138 J = I
139 I = I-1
140 GL = C*WORK(N+I)
141 H = C*PT
142C
143 IF(ABS(PT) .GE. ABS(WORK(N+I))) GO TO 180
144C
145 C = PT/WORK(N+I)
146 R = SQRT(C*C+ONE)
147 WORK(N+J) = S*WORK(N+I)*R
148 S = ONE/R
149 C = C/R
150 GO TO 190
151 180 C = WORK(N+I)/PT
152 R = SQRT(C*C+ONE)
153 WORK(N+J) = S*PT*R
154 S = C/R
155 C = ONE/R
156 190 PT = C*WORK(I)-S*GL
157 WORK(J) = H+S*(C*GL+S*WORK(I))
158 DO 200 K = 1,N
159 H = A(K,J)
160 A(K,J) = S*A(K,I)+C*H
161 A(K,I) = C*A(K,I)-S*H
162 200 CONTINUE
163 WORK(N+L) = S*PT
164 WORK(L) = C*PT
165C
166 IF(ABS(WORK(N+L)) .GT. B) GO TO 160
167C
168 205 WORK(L) = WORK(L)+F
169 210 CONTINUE
170 DO 240 I=1,N1
171 K = I
172 PT = WORK(I)
173 I1 = I+1
174 DO 220 J = I1,N
175C
176 IF(WORK(J) .GE. PT) GO TO 220
177C
178 K = J
179 PT = WORK(J)
180 220 CONTINUE
181C
182 IF(K .EQ. I) GO TO 240
183C
184 WORK(K) = WORK(I)
185 WORK(I) = PT
186 DO 230 J=1,N
187 PT = A(J,I)
188 A(J,I) = A(J,K)
189 A(J,K) = PT
190 230 CONTINUE
191 240 CONTINUE
192 IFAULT = 0
193C
194 RETURN
195 END
Note: See TracBrowser for help on using the repository browser.