MoDeNa  1.0
Software framework facilitating sequential multi-scale modelling
Numeric_subroutines.f90
1 
5 
6 
7 
8 
9 
10  SUBROUTINE bicub_derivative ( ya, x1a, x2a, y1a, y2a, y12a, i_max, k_max )
11 !
12  USE dft_module, ONLY: ndft, r_grid
13  IMPLICIT NONE
14 !
15 ! ----------------------------------------------------------------------
16  REAL, INTENT(IN) :: ya(r_grid,ndft)
17  REAL, INTENT(IN) :: x1a(r_grid)
18  REAL, INTENT(IN) :: x2a(ndft)
19  REAL, INTENT(OUT) :: y1a(r_grid,ndft)
20  REAL, INTENT(OUT) :: y2a(r_grid,ndft)
21  REAL, INTENT(OUT) :: y12a(r_grid,ndft)
22  INTEGER, INTENT(IN) :: i_max
23  INTEGER, INTENT(IN) :: k_max
24 !
25 ! ----------------------------------------------------------------------
26  INTEGER :: i, k
27 ! ----------------------------------------------------------------------
28 
29 
30 DO i = 2, i_max-1
31  DO k = 2, k_max-1
32  y1a(i,k) = (ya(i+1,k)-ya(i-1,k)) / (x1a(i+1)-x1a(i-1))
33  y2a(i,k) = (ya(i,k+1)-ya(i,k-1)) / (x2a(k+1)-x2a(k-1))
34  y12a(i,k)= (ya(i+1,k+1)-ya(i+1,k-1)-ya(i-1,k+1)+ya(i-1,k-1)) &
35  /((x1a(i+1)-x1a(i-1))*(x2a(k+1)-x2a(k-1)))
36  END DO
37 END DO
38 
39 i = 1
40 DO k = 1, k_max
41  y1a(i,k) = 0.0
42  y2a(i,k) = 0.0
43  y12a(i,k)= 0.0
44 END DO
45 
46 k = 1
47 DO i = 1, i_max
48  y1a(i,k) = 0.0
49  y2a(i,k) = 0.0
50  y12a(i,k)= 0.0
51 END DO
52 
53 
54 i = i_max
55 DO k = 2, k_max-1
56  y1a(i,k) = (ya(i,k)-ya(i-1,k)) / (x1a(i)-x1a(i-1))
57  y2a(i,k) = (ya(i,k+1)-ya(i,k-1)) / (x2a(k+1)-x2a(k-1))
58  y12a(i,k)= (ya(i,k+1)-ya(i,k-1)-ya(i-1,k+1)+ya(i-1,k-1)) &
59  /((x1a(i)-x1a(i-1))*(x2a(k+1)-x2a(k-1)))
60 END DO
61 
62 
63 k = k_max
64 DO i = 2, i_max-1
65  y1a(i,k) = (ya(i+1,k)-ya(i-1,k)) / (x1a(i+1)-x1a(i-1))
66  y2a(i,k) = (ya(i,k)-ya(i,k-1)) / (x2a(k)-x2a(k-1))
67  y12a(i,k)= (ya(i+1,k)-ya(i+1,k-1)-ya(i-1,k)+ya(i-1,k-1)) &
68  /((x1a(i+1)-x1a(i-1))*(x2a(k)-x2a(k-1)))
69 END DO
70 
71 k = k_max
72 i = i_max
73 y1a(i,k) = (ya(i,k)-ya(i-1,k)) / (x1a(i)-x1a(i-1))
74 y2a(i,k) = (ya(i,k)-ya(i,k-1)) / (x2a(k)-x2a(k-1))
75 y12a(i,k)= (ya(i,k)-ya(i,k-1)-ya(i-1,k)+ya(i-1,k-1)) &
76  /((x1a(i)-x1a(i-1))*(x2a(k)-x2a(k-1)))
77 
78 END SUBROUTINE bicub_derivative
79 
80 
81 !WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
82 !
83 !WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
84 !
85  SUBROUTINE bicub_c ( ya, x1a, x2a, y1a, y2a, y12a, c_bicub, i_max, k_max )
86 !
87  USE dft_module, ONLY: ndft, r_grid
88  IMPLICIT NONE
89 !
90 ! ----------------------------------------------------------------------
91  REAL, INTENT(IN) :: ya(r_grid,ndft)
92  REAL, INTENT(IN) :: x1a(r_grid)
93  REAL, INTENT(IN) :: x2a(ndft)
94  REAL, INTENT(IN) :: y1a(r_grid,ndft)
95  REAL, INTENT(IN) :: y2a(r_grid,ndft)
96  REAL, INTENT(IN) :: y12a(r_grid,ndft)
97  REAL, INTENT(OUT) :: c_bicub(r_grid,ndft,4,4)
98  INTEGER, INTENT(IN) :: i_max
99  INTEGER, INTENT(IN) :: k_max
100 !
101 ! ----------------------------------------------------------------------
102  INTEGER :: i, k, m, n
103  REAL :: y(4),y1(4),y2(4),y12(4),x1l,x1u,x2l,x2u
104  REAL :: c(4,4)
105 ! ----------------------------------------------------------------------
106 
107 DO i = 1, i_max-1
108  DO k = 1, k_max-1
109  y(1)=ya(i,k)
110  y(2)=ya(i+1,k)
111  y(3)=ya(i+1,k+1)
112  y(4)=ya(i,k+1)
113 
114  y1(1)=y1a(i,k)
115  y1(2)=y1a(i+1,k)
116  y1(3)=y1a(i+1,k+1)
117  y1(4)=y1a(i,k+1)
118 
119  y2(1)=y2a(i,k)
120  y2(2)=y2a(i+1,k)
121  y2(3)=y2a(i+1,k+1)
122  y2(4)=y2a(i,k+1)
123 
124  y12(1)=y12a(i,k)
125  y12(2)=y12a(i+1,k)
126  y12(3)=y12a(i+1,k+1)
127  y12(4)=y12a(i,k+1)
128 
129  x1l=x1a(i)
130  x1u=x1a(i+1)
131  x2l=x2a(k)
132  x2u=x2a(k+1)
133 
134  CALL bcucof(y,y1,y2,y12,x1u-x1l,x2u-x2l,c)
135  DO m=1,4
136  DO n=1,4
137  c_bicub(i,k,m,n)=c(m,n)
138  END DO
139  END DO
140 
141  END DO
142 END DO
143 
144 END SUBROUTINE bicub_c
145 
146 !WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
147 !
148 !WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
149 !
150  SUBROUTINE bcucof(y,y1,y2,y12,d1,d2,c)
151 !
152  IMPLICIT NONE
153 !
154 ! ----------------------------------------------------------------------
155  REAL, INTENT(IN) :: y(4)
156  REAL, INTENT(IN) :: y1(4)
157  REAL, INTENT(IN) :: y2(4)
158  REAL, INTENT(IN) :: y12(4)
159  REAL, INTENT(IN) :: d1
160  REAL, INTENT(IN) :: d2
161  REAL, INTENT(OUT) :: c(4,4)
162 !
163 ! ----------------------------------------------------------------------
164  INTEGER :: i,j,k,l
165  REAL :: d1d2,xx,cl(16),wt(16,16),x(16)
166  SAVE wt
167  DATA wt/1,0,-3,2,4*0,-3,0,9,-6,2,0,-6,4,8*0,3,0,-9,6,-2,0,6,-4,10* &
168  0,9,-6,2*0,-6,4,2*0,3,-2,6*0,-9,6,2*0,6,-4,4*0,1,0,-3,2,-2,0,6,-4, &
169  1,0,-3,2,8*0,-1,0,3,-2,1,0,-3,2,10*0,-3,2,2*0,3,-2,6*0,3,-2,2*0, &
170  -6,4,2*0,3,-2,0,1,-2,1,5*0,-3,6,-3,0,2,-4,2,9*0,3,-6,3,0,-2,4,-2, &
171  10*0,-3,3,2*0,2,-2,2*0,-1,1,6*0,3,-3,2*0,-2,2,5*0,1,-2,1,0,-2,4, &
172  -2,0,1,-2,1,9*0,-1,2,-1,0,1,-2,1,10*0,1,-1,2*0,-1,1,6*0,-1,1,2*0, &
173  2,-2,2*0,-1,1/
174 ! ----------------------------------------------------------------------
175 
176 d1d2 = d1 * d2
177 DO i = 1, 4
178  x(i) = y(i)
179  x(i+4) = y1(i)*d1
180  x(i+8) = y2(i)*d2
181  x(i+12) = y12(i)*d1d2
182 END DO
183 DO i = 1, 16
184  xx = 0.0
185  DO k = 1, 16
186  xx = xx + wt(i,k) * x(k)
187  END DO
188  cl(i) = xx
189 END DO
190 l = 0
191 DO i = 1, 4
192  DO j = 1, 4
193  l = l + 1
194  c(i,j) = cl(l)
195  END DO
196 END DO
197 
198 END SUBROUTINE bcucof
199 
200 
201 !WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
202 !
203 !WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
204 !
205  SUBROUTINE bi_cub_spline ( rho_rdf, xg, ya, x1a, x2a, y1a, y2a, y12a, &
206  c_bicub, rdf, dg_drho, dg_dr, i_max, ih, k )
207 !
208  USE dft_module, ONLY: ndft, r_grid
209  IMPLICIT NONE
210 !
211 ! ----------------------------------------------------------------------
212  REAL, INTENT(IN OUT) :: rho_rdf
213  REAL, INTENT(IN OUT) :: xg
214  REAL, INTENT(IN) :: ya(r_grid,ndft)
215  REAL, INTENT(IN) :: x1a(r_grid)
216  REAL, INTENT(IN) :: x2a(ndft)
217  REAL, INTENT(IN) :: y1a(r_grid,ndft)
218  REAL, INTENT(IN) :: y2a(r_grid,ndft)
219  REAL, INTENT(IN) :: y12a(r_grid,ndft)
220  REAL, INTENT(IN) :: c_bicub(r_grid,ndft,4,4)
221  REAL, INTENT(OUT) :: rdf
222  REAL, INTENT(OUT) :: dg_drho
223  REAL, INTENT(OUT) :: dg_dr
224  INTEGER, INTENT(IN OUT) :: i_max
225  !INTEGER, INTENT(IN OUT) :: k_max
226  INTEGER, INTENT(OUT) :: ih
227  INTEGER, INTENT(IN) :: k
228 !
229 ! ----------------------------------------------------------------------
230  INTEGER :: m, n
231 
232  REAL :: y(4),y1(4),y2(4),y12(4),x1l,x1u,x2l,x2u
233  REAL :: c(4,4)
234 ! ----------------------------------------------------------------------
235 
236 IF ( rho_rdf < x1a(1) ) THEN
237  dg_drho = 0.0
238  dg_dr = 0.0
239  rdf = 1.0
240  RETURN
241 END IF
242 IF ( x1a(ih) <= rho_rdf .AND. rho_rdf < x1a(ih+1) ) GO TO 10
243 IF ( ih > 2 ) THEN
244  IF ( x1a(ih-1) <= rho_rdf .AND. rho_rdf < x1a(ih) ) THEN
245  ih = ih - 1
246  GO TO 10
247  END IF
248 END IF
249 ! write (*,*) 'in ',ih
250 CALL hunt ( x1a, i_max, rho_rdf, ih )
251 ! write (*,*) 'out',ih
252 10 CONTINUE
253 IF ( x2a(k) /= xg ) THEN
254 ! write (*,*) 'error bi-cubic-spline',k,x2a(k),xg
255 ! DO k=1,NDFT
256 ! write (*,*) k,x2a(k)
257 ! ENDDO
258 ! stop
259 END IF
260 
261 
262 
263 y(1) = ya(ih,k)
264 y(2) = ya(ih+1,k)
265 y(3) = ya(ih+1,k+1)
266 y(4) = ya(ih,k+1)
267 
268 y1(1) = y1a(ih,k)
269 y1(2) = y1a(ih+1,k)
270 y1(3) = y1a(ih+1,k+1)
271 y1(4) = y1a(ih,k+1)
272 
273 y2(1) = y2a(ih,k)
274 y2(2) = y2a(ih+1,k)
275 y2(3) = y2a(ih+1,k+1)
276 y2(4) = y2a(ih,k+1)
277 
278 y12(1) = y12a(ih,k)
279 y12(2) = y12a(ih+1,k)
280 y12(3) = y12a(ih+1,k+1)
281 y12(4) = y12a(ih,k+1)
282 
283 x1l = x1a(ih)
284 x1u = x1a(ih+1)
285 x2l = x2a(k)
286 x2u = x2a(k+1)
287 
288 DO m = 1, 4
289  DO n = 1, 4
290  c(m,n) = c_bicub( ih, k, m, n )
291  END DO
292 END DO
293 CALL bcuint ( x1l, x1u, x2l, x2u, rho_rdf, xg, c, rdf, dg_drho, dg_dr )
294 
295 END SUBROUTINE bi_cub_spline
296 
297 !WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
298 ! SUBROUTINE hunt
299 !
300 ! Given an array xx(1:n), and given a value x, returns a value jlo
301 ! such that x is between xx(jlo) and xx(jlo+1). xx(1:n) must be
302 ! monotonic, either increasing or decreasing. jlo=0 or jlo=n is
303 ! returned to indicate that x is out of range. jlo on input is taken
304 ! as the initial guess for jlo on output.
305 !WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
306 !
307  SUBROUTINE hunt ( xx, n, x, jlo )
308 !
309  IMPLICIT NONE
310 !
311 ! ----------------------------------------------------------------------
312  INTEGER, INTENT(IN) :: n
313  INTEGER, INTENT(OUT) :: jlo
314  REAL, INTENT(IN) :: xx(n)
315  REAL :: x
316 !
317 ! ----------------------------------------------------------------------
318  INTEGER :: inc,jhi,jm
319  LOGICAL :: ascnd
320 ! ----------------------------------------------------------------------
321 
322 ascnd = xx(n) >= xx(1)
323 IF( jlo <= 0 .OR. jlo > n ) THEN
324  jlo = 0
325  jhi = n + 1
326  GO TO 3
327 END IF
328 inc = 1
329 IF( x >= xx(jlo) .EQV. ascnd ) THEN
330 1 jhi = jlo + inc
331  IF ( jhi > n ) THEN
332  jhi = n + 1
333  ELSE IF ( x >= xx(jhi) .EQV. ascnd ) THEN
334  jlo = jhi
335  inc = inc + inc
336  GO TO 1
337  END IF
338 ELSE
339  jhi = jlo
340 2 jlo = jhi - inc
341  IF ( jlo < 1 ) THEN
342  jlo = 0
343  ELSE IF ( x < xx(jlo) .EQV. ascnd ) THEN
344  jhi = jlo
345  inc = inc + inc
346  GO TO 2
347  END IF
348 END IF
349 3 IF (jhi-jlo == 1 ) THEN
350  IF ( x == xx(n)) jlo = n - 1
351  IF ( x == xx(1) ) jlo = 1
352  RETURN
353 END IF
354 jm = ( jhi + jlo ) / 2
355 IF ( x >= xx(jm) .EQV. ascnd ) THEN
356  jlo = jm
357 ELSE
358  jhi = jm
359 END IF
360 GO TO 3
361 END SUBROUTINE hunt
362 
363 
364 
365 !**********************************************************************
366 !
367 !**********************************************************************
368 !
369  !SUBROUTINE bcuint ( y, y1, y2, y12, x1l, x1u, x2l, x2u, x1, x2, c, ansy, ansy1, ansy2 )
370  SUBROUTINE bcuint ( x1l, x1u, x2l, x2u, x1, x2, c, ansy, ansy1, ansy2 )
371 !
372  IMPLICIT NONE
373 !
374 ! ----------------------------------------------------------------------
375  !REAL, INTENT(IN OUT) :: y(4)
376  !REAL, INTENT(IN OUT) :: y1(4)
377  !REAL, INTENT(IN OUT) :: y2(4)
378  !REAL, INTENT(IN OUT) :: y12(4)
379  REAL, INTENT(IN OUT) :: x1l
380  REAL, INTENT(IN OUT) :: x1u
381  REAL, INTENT(IN OUT) :: x2l
382  REAL, INTENT(IN OUT) :: x2u
383  REAL, INTENT(IN OUT) :: x1
384  REAL, INTENT(IN OUT) :: x2
385  REAL, INTENT(IN) :: c(4,4)
386  REAL, INTENT(OUT) :: ansy
387  REAL, INTENT(OUT) :: ansy1
388  REAL, INTENT(OUT) :: ansy2
389 !
390 ! ----------------------------------------------------------------------
391  !U USES bcucof
392  INTEGER :: i
393  REAL :: t, u
394 ! ----------------------------------------------------------------------
395 
396 ! call bcucof ( y, y1, y2, y12, x1u-x1l, x2u-x2l, c )
397 
398 IF ( x1u == x1l .OR. x2u == x2l ) pause 'bad input in bcuint'
399 t = (x1-x1l) / (x1u-x1l)
400 u = (x2-x2l) / (x2u-x2l)
401 ansy = 0.0
402 ansy2 = 0.0
403 ansy1 = 0.0
404 DO i = 4, 1, -1
405  ansy = t *ansy + ( (c(i,4)*u + c(i,3))*u+c(i,2) )*u + c(i,1)
406  ansy2 = t *ansy2 + ( 3.*c(i,4)*u+2.*c(i,3) )*u + c(i,2)
407  ansy1 = u *ansy1 + ( 3.*c(4,i)*t+2.*c(3,i) )*t + c(2,i)
408 END DO
409 ansy1 = ansy1 / (x1u-x1l)
410 ansy2 = ansy2 / (x2u-x2l)
411 
412 END SUBROUTINE bcuint
413 
414 
415 !WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
416 ! SUBROUTINE spline
417 !
418 ! Given arrays x(1:n) and y(1:n) containing a tabulated function,
419 ! i.e., yi = f(xi), with x1 < x2 < .. . < xN, and given values yp1 and
420 ! ypn for the first derivative of the interpolating function at points 1
421 ! and n, respectively, this routine returns an array y2(1:n) of length n
422 ! which contains the second derivatives of the interpolating function at
423 ! the tabulated points xi. If yp1 and/or ypn are equal to 1 1030 or
424 ! larger, the routine is signaled to set the corresponding boundary
425 ! condition for a natural spline, with zero second derivative on that
426 ! boundary.
427 ! Parameter: NMAX is the largest anticipated value of n.
428 !WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
429 !
430  SUBROUTINE spline ( x, y, n, yp1, ypn, y2 )
431 !
432  IMPLICIT NONE
433 !
434 ! ----------------------------------------------------------------------
435  INTEGER, INTENT(IN) :: n
436  REAL, INTENT(IN) :: x(n)
437  REAL, INTENT(IN) :: y(n)
438  REAL, INTENT(IN) :: yp1
439  REAL, INTENT(IN) :: ypn
440  REAL, INTENT(OUT) :: y2(n)
441 !
442 ! ----------------------------------------------------------------------
443  INTEGER, PARAMETER :: nmax = 500
444  INTEGER :: i, k
445  REAL :: p, qn, sig, un, u(nmax)
446 ! ----------------------------------------------------------------------
447 
448  IF ( yp1 > 0.99e30 ) THEN
449  y2(1) = 0.0
450  u(1) = 0.0
451  ELSE
452  y2(1) = -0.5
453  u(1) = ( 3.0/(x(2)-x(1)) ) * ( (y(2)-y(1))/(x(2)-x(1))-yp1 )
454  END IF
455  DO i = 2, n-1
456  IF ( (x(i+1)-x(i)) == 0.0 .OR. (x(i)-x(i-1)) == 0.0 .OR. (x(i+1)-x(i-1)) == 0.0 ) THEN
457  write (*,*) 'error in spline-interpolation'
458  stop
459  END IF
460  sig = (x(i)-x(i-1)) / (x(i+1)-x(i-1))
461  p = sig*y2(i-1) + 2.0
462  y2(i) = (sig-1.0) / p
463  u(i) = ( 6.0 * ((y(i+1)-y(i))/(x(i+1)-x(i))-(y(i)-y(i-1))/(x(i)-x(i-1))) / (x(i+1)-x(i-1)) &
464  - sig * u(i-1) ) / p
465  END DO
466  IF ( ypn > 0.99e30 ) THEN
467  qn = 0.0
468  un = 0.0
469  ELSE
470  qn = 0.5
471  un = (3.0/(x(n)-x(n-1))) * (ypn-(y(n)-y(n-1))/(x(n)-x(n-1)))
472  END IF
473  y2(n) = (un-qn*u(n-1)) / (qn*y2(n-1)+1.0)
474  DO k = n-1, 1, -1
475  y2(k) = y2(k) * y2(k+1) + u(k)
476  END DO
477 
478 END SUBROUTINE spline
479 
480 !WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
481 ! SUBROUTINE splint_integral
482 !
483 ! Given the arrays xa(1:n) and ya(1:n) of length n, which tabulate a
484 ! function (with the in order), and given the array y2a(1:n), which is
485 ! the output from spline above, and given a value of x, this routine
486 ! returns a cubic-spline interpolated value y.
487 !WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
488 !
489  SUBROUTINE splint_integral ( xa, ya, y2a, n, xlo, xhi, integral )
490 !
491  IMPLICIT NONE
492 !
493 ! ----------------------------------------------------------------------
494  INTEGER, INTENT(IN) :: n
495  REAL, INTENT(IN) :: xa(n)
496  REAL, INTENT(IN) :: ya(n)
497  REAL, INTENT(IN) :: y2a(n)
498  REAL, INTENT(IN) :: xlo
499  REAL, INTENT(IN) :: xhi
500  REAL, INTENT(OUT) :: integral
501 !
502 ! ----------------------------------------------------------------------
503  INTEGER :: k, khi_l, klo_l, khi_h, klo_h
504  REAL :: xl, xh, h, int, x0, x1, y0, y1, y20, y21
505 ! ----------------------------------------------------------------------
506 
507  integral = 0.0
508  klo_l = 1
509  khi_l = n
510 1 IF ( khi_l-klo_l > 1 ) THEN
511  k = ( khi_l + klo_l ) / 2
512  IF ( xa(k) > xlo ) THEN
513  khi_l = k
514  ELSE
515  klo_l = k
516  END IF
517  GO TO 1
518  END IF
519 
520  klo_h = 1
521  khi_h = n
522 2 IF ( khi_h-klo_h > 1 ) THEN
523  k = ( khi_h + klo_h ) / 2
524  IF ( xa(k) > xhi ) THEN
525  khi_h = k
526  ELSE
527  klo_h = k
528  END IF
529  GO TO 2
530  END IF
531 
532  ! integration in spline pieces, the lower interval, bracketed
533  ! by xa(klo_L) and xa(khi_L) is in steps shifted upward.
534 
535  ! first: determine upper integration bound
536  xl = xlo
537 3 CONTINUE
538  IF ( khi_h > khi_l ) THEN
539  xh = xa(khi_l)
540  ELSE IF ( khi_h == khi_l ) THEN
541  xh = xhi
542  ELSE
543  WRITE (*,*) 'error in spline-integration'
544  pause
545  END IF
546 
547  h = xa(khi_l) - xa(klo_l)
548  IF ( h == 0.0 ) pause 'bad xa input in splint'
549  x0 = xa(klo_l)
550  x1 = xa(khi_l)
551  y0 = ya(klo_l)
552  y1 = ya(khi_l)
553  y20= y2a(klo_l)
554  y21= y2a(khi_l)
555  ! int = -xL/h * ( (x1-.5*xL)*y0 + (0.5*xL-x0)*y1 &
556  ! +y20/6.*(x1**3-1.5*xL*x1*x1+xL*xL*x1-.25*xL**3) &
557  ! -y20/6.*h*h*(x1-.5*xL) &
558  ! +y21/6.*(.25*xL**3-xL*xL*x0+1.5*xL*x0*x0-x0**3) &
559  ! -y21/6.*h*h*(.5*xL-x0) )
560  ! int = int + xH/h * ( (x1-.5*xH)*y0 + (0.5*xH-x0)*y1 &
561  ! +y20/6.*(x1**3-1.5*xH*x1*x1+xH*xH*x1-.25*xH**3) &
562  ! -y20/6.*h*h*(x1-.5*xH) &
563  ! +y21/6.*(.25*xH**3-xH*xH*x0+1.5*xH*x0*x0-x0**3) &
564  ! -y21/6.*h*h*(.5*xH-x0) )
565  int = -1.0/h * ( xl*((x1-.5*xl)*y0 + (0.5*xl-x0)*y1) &
566  -y20/24.*(x1-xl)**4 + y20/6.*(0.5*xl*xl-x1*xl)*h*h &
567  +y21/24.*(xl-x0)**4 - y21/6.*(0.5*xl*xl-x0*xl)*h*h )
568  int = int + 1.0/h * ( xh*((x1-.5*xh)*y0 + (0.5*xh-x0)*y1) &
569  -y20/24.*(x1-xh)**4 + y20/6.*(0.5*xh*xh-x1*xh)*h*h &
570  +y21/24.*(xh-x0)**4 - y21/6.*(0.5*xh*xh-x0*xh)*h*h )
571 
572  integral = integral + int
573  ! write (*,*) integral,x1,xH
574  klo_l = klo_l + 1
575  khi_l = khi_l + 1
576  xl = x1
577  IF (khi_h /= (khi_l-1)) GO TO 3 ! the -1 in (khi_L-1) because khi_L was already counted up
578 
579 END SUBROUTINE splint_integral
580 
581 
582 
583 
584 !WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
585 !
586 !WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
587 !
588  REAL FUNCTION praxis( t0, machep, h0, n, prin, x, f, fmin )
589 
590  IMPLICIT NONE
591 
592 ! ----------------------------------------------------------------------
593  REAL, INTENT(IN OUT) :: t0
594  REAL, INTENT(IN) :: machep
595  REAL, INTENT(IN) :: h0
596  INTEGER :: n
597  INTEGER, INTENT(IN OUT) :: prin
598  REAL, INTENT(IN OUT) :: x(n)
599  REAL :: f
600  REAL, INTENT(IN OUT) :: fmin
601 ! ----------------------------------------------------------------------
602 
603 EXTERNAL f
604 
605 ! PRAXIS RETURNS THE MINIMUM OF THE FUNCTION F(X,N) OF N VARIABLES
606 ! USING THE PRINCIPAL AXIS METHOD. THE GRADIENT OF THE FUNCTION IS
607 ! NOT REQUIRED.
608 
609 ! FOR A DESCRIPTION OF THE ALGORITHM, SEE CHAPTER SEVEN OF
610 ! "ALGORITHMS FOR FINDING ZEROS AND EXTREMA OF FUNCTIONS WITHOUT
611 ! CALCULATING DERIVATIVES" BY RICHARD P BRENT.
612 
613 ! THE PARAMETERS ARE:
614 ! T0 IS A TOLERANCE. PRAXIS ATTEMPTS TO RETURN PRAXIS=F(X)
615 ! SUCH THAT IF X0 IS THE TRUE LOCAL MINIMUM NEAR X, THEN
616 ! NORM(X-X0) < T0 + SQUAREROOT(MACHEP)*NORM(X).
617 ! MACHEP IS THE MACHINE PRECISION, THE SMALLEST NUMBER SUCH THAT
618 ! 1 + MACHEP > 1. MACHEP SHOULD BE 16.**-13 (ABOUT
619 ! 2.22D-16) FOR REAL*8 ARITHMETIC ON THE IBM 360.
620 ! H0 IS THE MAXIMUM STEP SIZE. H0 SHOULD BE SET TO ABOUT THE
621 ! MAXIMUM DISTANCE FROM THE INITIAL GUESS TO THE MINIMUM.
622 ! (IF H0 IS SET TOO LARGE OR TOO SMALL, THE INITIAL RATE OF
623 ! CONVERGENCE MAY BE SLOW.)
624 ! N (AT LEAST TWO) IS THE NUMBER OF VARIABLES UPON WHICH
625 ! THE FUNCTION DEPENDS.
626 ! PRIN CONTROLS THE PRINTING OF INTERMEDIATE RESULTS.
627 ! IF PRIN=0, NOTHING IS PRINTED.
628 ! IF PRIN=1, F IS PRINTED AFTER EVERY N+1 OR N+2 LINEAR
629 ! MINIMIZATIONS. FINAL X IS PRINTED, BUT INTERMEDIATE X IS
630 ! PRINTED ONLY IF N IS AT MOST 4.
631 ! IF PRIN=2, THE SCALE FACTORS AND THE PRINCIPAL VALUES OF
632 ! THE APPROXIMATING QUADRATIC FORM ARE ALSO PRINTED.
633 ! IF PRIN=3, X IS ALSO PRINTED AFTER EVERY FEW LINEAR
634 ! MINIMIZATIONS.
635 ! IF PRIN=4, THE PRINCIPAL VECTORS OF THE APPROXIMATING
636 ! QUADRATIC FORM ARE ALSO PRINTED.
637 ! X IS AN ARRAY CONTAINING ON ENTRY A GUESS OF THE POINT OF
638 ! MINIMUM, ON RETURN THE ESTIMATED POINT OF MINIMUM.
639 ! F(X,N) IS THE FUNCTION TO BE MINIMIZED. F SHOULD BE A REAL*8
640 ! FUNCTION DECLARED EXTERNAL IN THE CALLING PROGRAM.
641 ! FMIN IS AN ESTIMATE OF THE MINIMUM, USED ONLY IN PRINTING
642 ! INTERMEDIATE RESULTS.
643 ! THE APPROXIMATING QUADRATIC FORM IS
644 ! Q(X') = F(X,N) + (1/2) * (X'-X)-TRANSPOSE * A * (X'-X)
645 ! WHERE X IS THE BEST ESTIMATE OF THE MINIMUM AND A IS
646 ! INVERSE(V-TRANSPOSE) * D * INVERSE(V)
647 ! (V(*,*) IS THE MATRIX OF SEARCH DIRECTIONS; D(*) IS THE ARRAY
648 ! OF SECOND DIFFERENCES). IF F HAS CONTINUOUS SECOND DERIVATIVES
649 ! NEAR X0, A WILL TEND TO THE HESSIAN OF F AT X0 AS X APPROACHES X0.
650 
651 ! IT IS ASSUMED THAT ON FLOATING-POINT UNDERFLOW THE RESULT IS SET
652 ! TO ZERO.
653 ! THE USER SHOULD OBSERVE THE COMMENT ON HEURISTIC NUMBERS AFTER
654 ! THE INITIALIZATION OF MACHINE DEPENDENT NUMBERS.
655 
656  LOGICAL :: illc
657  INTEGER :: nl,nf,kl,kt,ktm,idim,i,j,k,k2,km1,klmk,ii,im1
658  REAL :: s,sl,dn,dmin,fx,f1,lds,ldt,t,h,sf,df,qf1,qd0, qd1,qa,qb,qc
659  REAL :: m2,m4,small,vsmall,large,vlarge,scbd,ldfac,t2, dni,value
660  REAL :: random
661 
662 !.....IF N>20 OR IF N<20 AND YOU NEED MORE SPACE, CHANGE '20' TO THE
663 ! LARGEST VALUE OF N IN THE NEXT CARD, IN THE CARD 'IDIM=20', AND
664 ! IN THE DIMENSION STATEMENTS IN SUBROUTINES MINFIT,MIN,FLIN,QUAD.
665 
666  REAL :: d(20),y(20),z(20),q0(20),q1(20),v(20,20)
667  COMMON /global/ fx,ldt,dmin,nf,nl /q/ v,q0,q1,qa,qb,qc,qd0,qd1,qf1
668 
669 ! ---------------------------------
670 ! introduced by Joachim........
671  idim = n
672 ! ---------------------------------
673 
674 
675 
676 !.....INITIALIZATION.....
677 ! MACHINE DEPENDENT NUMBERS:
678 
679 small = machep*machep
680 vsmall = small*small
681 large = 1.d0/small
682 vlarge = 1.d0/vsmall
683 m2 = sqrt(machep)
684 m4 = sqrt(m2)
685 
686 ! HEURISTIC NUMBERS:
687 ! IF THE AXES MAY BE BADLY SCALED (WHICH IS TO BE AVOIDED IF
688 ! POSSIBLE), THEN SET SCBD=10. OTHERWISE SET SCBD=1.
689 ! IF THE PROBLEM IS KNOWN TO BE ILL-CONDITIONED, SET ILLC=TRUE.
690 ! OTHERWISE SET ILLC=FALSE.
691 ! KTM IS THE NUMBER OF ITERATIONS WITHOUT IMPROVEMENT BEFORE THE
692 ! ALGORITHM TERMINATES. KTM=4 IS VERY CAUTIOUS; USUALLY KTM=1
693 ! IS SATISFACTORY.
694 
695 scbd = 1.0
696 illc = .false.
697 ktm = 1
698 
699 ldfac = 0.01
700 IF (illc) ldfac = 0.1
701 kt = 0
702 nl = 0
703 nf = 1
704 fx = f(x,n)
705 qf1 = fx
706 t = small+abs(t0)
707 t2 = t
708 dmin = small
709 h = h0
710 IF (h < 100*t) h = 100*t
711 ldt = h
712 !.....THE FIRST SET OF SEARCH DIRECTIONS V IS THE IDENTITY MATRIX.....
713 DO i = 1,n
714  DO j = 1,n
715  v(i,j) = 0.0
716  END DO
717  v(i,i) = 1.0
718 END DO
719 d(1) = 0.0
720 qd0 = 0.0
721 DO i = 1,n
722  q0(i) = x(i)
723  q1(i) = x(i)
724 END DO
725 IF (prin > 0) CALL print(n,x,prin,fmin)
726 
727 !.....THE MAIN LOOP STARTS HERE.....
728 40 sf=d(1)
729 d(1)=0.d0
730 s=0.d0
731 
732 !.....MINIMIZE ALONG THE FIRST DIRECTION V(*,1).
733 ! FX MUST BE PASSED TO MIN BY VALUE.
734 value=fx
735 CALL min(n,1,2,d(1),s,value,.false.,f,x,t,machep,h)
736 IF (s > 0.d0) GO TO 50
737 DO i=1,n
738  v(i,1)=-v(i,1)
739 END DO
740 50 IF (sf > 0.9d0*d(1).AND.0.9d0*sf < d(1)) GO TO 70
741 DO i=2,n
742  d(i)=0.d0
743 END DO
744 
745 !.....THE INNER LOOP STARTS HERE.....
746 70 DO k=2,n
747  DO i=1,n
748  y(i)=x(i)
749  END DO
750  sf=fx
751  IF (kt > 0) illc=.true.
752  80 kl=k
753  df=0.d0
754 
755 !.....A RANDOM STEP FOLLOWS (TO AVOID RESOLUTION VALLEYS).
756 ! PRAXIS ASSUMES THAT RANDOM RETURNS A RANDOM NUMBER UNIFORMLY
757 ! DISTRIBUTED IN (0,1).
758 
759  IF(.NOT.illc) GO TO 95
760  DO i=1,n
761  s=(0.1d0*ldt+t2*(10**kt))*(random(n)-0.5d0)
762  z(i)=s
763  DO j=1,n
764  x(j)=x(j)+s*v(j,i)
765  END DO
766  END DO
767  fx=f(x,n)
768  nf=nf+1
769 
770 !.....MINIMIZE ALONG THE "NON-CONJUGATE" DIRECTIONS V(*,K),...,V(*,N)
771 
772  95 DO k2=k,n
773  sl=fx
774  s=0.d0
775  value=fx
776  CALL min(n,k2,2,d(k2),s,value,.false.,f,x,t,machep,h)
777  IF (illc) GO TO 97
778  s=sl-fx
779  GO TO 99
780  97 s=d(k2)*((s+z(k2))**2)
781  99 IF (df > s) cycle
782  df=s
783  kl=k2
784  END DO
785  IF (illc.OR.(df >= abs((100*machep)*fx))) GO TO 110
786 
787 !.....IF THERE WAS NOT MUCH IMPROVEMENT ON THE FIRST TRY, SET
788 ! ILLC=TRUE AND START THE INNER LOOP AGAIN.....
789 
790  illc=.true.
791  GO TO 80
792  110 IF (k == 2.AND.prin > 1) CALL vcprnt(1,d,n)
793 
794 !.....MINIMIZE ALONG THE "CONJUGATE" DIRECTIONS V(*,1),...,V(*,K-1)
795 
796  km1=k-1
797  DO k2=1,km1
798  s=0
799  value=fx
800  CALL min(n,k2,2,d(k2),s,value,.false.,f,x,t,machep,h)
801  END DO
802  f1=fx
803  fx=sf
804  lds=0
805  DO i=1,n
806  sl=x(i)
807  x(i)=y(i)
808  sl=sl-y(i)
809  y(i)=sl
810  lds=lds+sl*sl
811  END DO
812  lds=sqrt(lds)
813  IF (lds <= small) GO TO 160
814 
815 !.....DISCARD DIRECTION V(*,KL).
816 ! IF NO RANDOM STEP WAS TAKEN, V(*,KL) IS THE "NON-CONJUGATE"
817 ! DIRECTION ALONG WHICH THE GREATEST IMPROVEMENT WAS MADE.....
818 
819  klmk=kl-k
820  IF (klmk < 1) GO TO 141
821  DO ii=1,klmk
822  i=kl-ii
823  DO j=1,n
824  v(j,i+1)=v(j,i)
825  END DO
826  d(i+1)=d(i)
827  END DO
828  141 d(k)=0
829  DO i=1,n
830  v(i,k)=y(i)/lds
831  END DO
832 
833 !.....MINIMIZE ALONG THE NEW "CONJUGATE" DIRECTION V(*,K), WHICH IS
834 ! THE NORMALIZED VECTOR: (NEW X) - (0LD X).....
835 
836  value=f1
837  CALL min(n,k,4,d(k),lds,value,.true.,f,x,t,machep,h)
838  IF (lds > 0.d0) GO TO 160
839  lds=-lds
840  DO i=1,n
841  v(i,k)=-v(i,k)
842  END DO
843  160 ldt=ldfac*ldt
844  IF (ldt < lds) ldt=lds
845  IF (prin > 0) CALL print(n,x,prin,fmin)
846  t2=0.d0
847  DO i=1,n
848  t2=t2+x(i)**2
849  END DO
850  t2=m2*sqrt(t2)+t
851 
852 !.....SEE WHETHER THE LENGTH OF THE STEP TAKEN SINCE STARTING THE
853 ! INNER LOOP EXCEEDS HALF THE TOLERANCE.....
854 
855  IF (ldt > (0.5*t2)) kt=-1
856  kt=kt+1
857  IF (kt > ktm) GO TO 400
858 END DO
859 !.....THE INNER LOOP ENDS HERE.
860 
861 ! TRY QUADRATIC EXTRAPOLATION IN CASE WE ARE IN A CURVED VALLEY.
862 
863 CALL quad(n,f,x,t,machep,h)
864 dn=0.d0
865 DO i=1,n
866  d(i)=1.d0/sqrt(d(i))
867  IF (dn < d(i)) dn=d(i)
868 END DO
869 IF (prin > 3) CALL maprnt(1,v,idim,n)
870 DO j=1,n
871  s=d(j)/dn
872  DO i=1,n
873  v(i,j)=s*v(i,j)
874  END DO
875 END DO
876 
877 !.....SCALE THE AXES TO TRY TO REDUCE THE CONDITION NUMBER.....
878 
879 IF (scbd <= 1.d0) GO TO 200
880 s=vlarge
881 DO i=1,n
882  sl=0.d0
883  DO j=1,n
884  sl=sl+v(i,j)*v(i,j)
885  END DO
886  z(i)=sqrt(sl)
887  IF (z(i) < m4) z(i)=m4
888  IF (s > z(i)) s=z(i)
889 END DO
890 DO i=1,n
891  sl=s/z(i)
892  z(i)=1.d0/sl
893  IF (z(i) <= scbd) GO TO 189
894  sl=1.d0/scbd
895  z(i)=scbd
896  189 DO j=1,n
897  v(i,j)=sl*v(i,j)
898  END DO
899 END DO
900 
901 !.....CALCULATE A NEW SET OF ORTHOGONAL DIRECTIONS BEFORE REPEATING
902 ! THE MAIN LOOP.
903 ! FIRST TRANSPOSE V FOR MINFIT:
904 
905 200 DO i=2,n
906  im1=i-1
907  DO j=1,im1
908  s=v(i,j)
909  v(i,j)=v(j,i)
910  v(j,i)=s
911  END DO
912 END DO
913 
914 !.....CALL MINFIT TO FIND THE SINGULAR VALUE DECOMPOSITION OF V.
915 ! THIS GIVES THE PRINCIPAL VALUES AND PRINCIPAL DIRECTIONS OF THE
916 ! APPROXIMATING QUADRATIC FORM WITHOUT SQUARING THE CONDITION
917 ! NUMBER.....
918 
919 CALL minfit(idim,n,machep,vsmall,v,d)
920 
921 !.....UNSCALE THE AXES.....
922 
923 IF (scbd <= 1.d0) GO TO 250
924 DO i=1,n
925  s=z(i)
926  DO j=1,n
927  v(i,j)=s*v(i,j)
928  END DO
929 END DO
930 DO i=1,n
931  s=0.d0
932  DO j=1,n
933  s=s+v(j,i)**2
934  END DO
935  s=sqrt(s)
936  d(i)=s*d(i)
937  s=1/s
938  DO j=1,n
939  v(j,i)=s*v(j,i)
940  END DO
941 END DO
942 
943 250 DO i=1,n
944  dni=dn*d(i)
945  IF (dni > large) GO TO 265
946  IF (dni < small) GO TO 260
947  d(i)=1/(dni*dni)
948  cycle
949  260 d(i)=vlarge
950  cycle
951  265 d(i)=vsmall
952 END DO
953 
954 !.....SORT THE EIGENVALUES AND EIGENVECTORS.....
955 
956 CALL sort(idim,n,d,v)
957 dmin=d(n)
958 IF (dmin < small) dmin=small
959 illc=.false.
960 IF (m2*d(1) > dmin) illc=.true.
961 IF (prin > 1.AND.scbd > 1.d0) CALL vcprnt(2,z,n)
962 IF (prin > 1) CALL vcprnt(3,d,n)
963 IF (prin > 3) CALL maprnt(2,v,idim,n)
964 !.....THE MAIN LOOP ENDS HERE.....
965 
966 GO TO 40
967 
968 !.....RETURN.....
969 
970 400 IF (prin > 0) CALL vcprnt(4,x,n)
971 praxis=fx
972 
973 END FUNCTION praxis
974 
975 
976 !WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
977 !
978 !WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
979 !
980  SUBROUTINE minfit(m,n,machep,tol,ab,q)
981 
982  IMPLICIT NONE
983 
984  INTEGER, INTENT(IN OUT) :: m
985  INTEGER, INTENT(IN) :: n
986  REAL, INTENT(IN) :: machep
987  REAL, INTENT(IN OUT) :: tol
988  REAL, INTENT(IN OUT) :: ab(m,n)
989  REAL, INTENT(OUT) :: q(n)
990  INTEGER :: i,j,k,l, kk,kt,l2,ll2,ii,lp1
991 ! IMPLICIT REAL (A-H,O-Z)
992 
993 
994 REAL :: x,eps,e(20),g,s, f,h,y,c,z,temp
995 !...AN IMPROVED VERSION OF MINFIT (SEE GOLUB AND REINSCH, 1969)
996 ! RESTRICTED TO M=N,P=0.
997 ! THE SINGULAR VALUES OF THE ARRAY AB ARE RETURNED IN Q AND AB IS
998 ! OVERWRITTEN WITH THE ORTHOGONAL MATRIX V SUCH THAT U.DIAG(Q) = AB.V,
999 ! WHERE U IS ANOTHER ORTHOGONAL MATRIX.
1000 
1001 !...HOUSEHOLDER'S REDUCTION TO BIDIAGONAL FORM...
1002 IF (n == 1) GO TO 200
1003 eps = machep
1004 g = 0.d0
1005 x = 0.d0
1006 DO i=1,n
1007  e(i) = g
1008  s = 0.d0
1009  l = i + 1
1010  DO j=i,n
1011  s = s + ab(j,i)**2
1012  END DO
1013  g = 0.d0
1014  IF (s < tol) GO TO 4
1015  f = ab(i,i)
1016  g = sqrt(s)
1017  IF (f >= 0.d0) g = -g
1018  h = f*g - s
1019  ab(i,i)=f-g
1020  IF (l > n) GO TO 4
1021  DO j=l,n
1022  f = 0.d0
1023  DO k=i,n
1024  f = f + ab(k,i)*ab(k,j)
1025  END DO
1026  f = f/h
1027  DO k=i,n
1028  ab(k,j) = ab(k,j) + f*ab(k,i)
1029  END DO
1030  END DO
1031  4 q(i) = g
1032  s = 0.d0
1033  IF (i == n) GO TO 6
1034  DO j=l,n
1035  s = s + ab(i,j)*ab(i,j)
1036  END DO
1037  6 g = 0.d0
1038  IF (s < tol) GO TO 10
1039  IF (i == n) GO TO 16
1040  f = ab(i,i+1)
1041  16 g = sqrt(s)
1042  IF (f >= 0.d0) g = -g
1043  h = f*g - s
1044  IF (i == n) GO TO 10
1045  ab(i,i+1) = f - g
1046  DO j=l,n
1047  e(j) = ab(i,j)/h
1048  END DO
1049  DO j=l,n
1050  s = 0.d0
1051  DO k=l,n
1052  s = s + ab(j,k)*ab(i,k)
1053  END DO
1054  DO k=l,n
1055  ab(j,k) = ab(j,k) + s*e(k)
1056  END DO
1057  END DO
1058  10 y = abs(q(i)) + abs(e(i))
1059  IF (y > x) x = y
1060 END DO
1061 !...ACCUMULATION OF RIGHT-HAND TRANSFORMATIONS...
1062 ab(n,n) = 1.d0
1063 g = e(n)
1064 l = n
1065 DO ii=2,n
1066  i = n - ii + 1
1067  IF (g == 0.d0) GO TO 23
1068  h = ab(i,i+1)*g
1069  DO j=l,n
1070  ab(j,i) = ab(i,j)/h
1071  END DO
1072  DO j=l,n
1073  s = 0.d0
1074  DO k=l,n
1075  s = s + ab(i,k)*ab(k,j)
1076  END DO
1077  DO k=l,n
1078  ab(k,j) = ab(k,j) + s*ab(k,i)
1079  END DO
1080  END DO
1081  23 DO j=l,n
1082  ab(i,j) = 0.d0
1083  ab(j,i) = 0.d0
1084  END DO
1085  ab(i,i) = 1.d0
1086  g = e(i)
1087  l = i
1088 END DO
1089 !...DIAGONALIZATION OF THE BIDIAGONAL FORM...
1090 eps = eps*x
1091 DO kk=1,n
1092  k = n - kk + 1
1093  kt = 0
1094  101 kt = kt + 1
1095  IF (kt <= 30) GO TO 102
1096  e(k) = 0.d0
1097  WRITE (6,1000)
1098  1000 FORMAT (' QR FAILED')
1099  102 DO ll2=1,k
1100  l2 = k - ll2 + 1
1101  l = l2
1102  IF (abs(e(l)) <= eps) GO TO 120
1103  IF (l == 1) cycle
1104  IF (abs(q(l-1)) <= eps) EXIT
1105  END DO
1106 !...CANCELLATION OF E(L) IF L>1...
1107  c = 0.d0
1108  s = 1.d0
1109  DO i=l,k
1110  f = s*e(i)
1111  e(i) = c*e(i)
1112  IF (abs(f) <= eps) GO TO 120
1113  g = q(i)
1114 !...Q(I) = H = SQRT(G*G + F*F)...
1115  IF (abs(f) < abs(g)) GO TO 113
1116  IF (f == 0.0) THEN
1117  GO TO 111
1118  ELSE
1119  GO TO 112
1120  END IF
1121  111 h = 0.d0
1122  GO TO 114
1123  112 h = abs(f)*sqrt(1 + (g/f)**2)
1124  GO TO 114
1125  113 h = abs(g)*sqrt(1 + (f/g)**2)
1126  114 q(i) = h
1127  IF (h /= 0.d0) GO TO 115
1128  g = 1.d0
1129  h = 1.d0
1130  115 c = g/h
1131  s = -f/h
1132  END DO
1133 !...TEST FOR CONVERGENCE...
1134  120 z = q(k)
1135  IF (l == k) GO TO 140
1136 !...SHIFT FROM BOTTOM 2*2 MINOR...
1137  x = q(l)
1138  y = q(k-1)
1139  g = e(k-1)
1140  h = e(k)
1141  f = ((y - z)*(y + z) + (g - h)*(g + h))/(2*h*y)
1142  g = sqrt(f*f + 1.0d0)
1143  temp = f - g
1144  IF (f >= 0.d0) temp = f + g
1145  f = ((x - z)*(x + z) + h*(y/temp - h))/x
1146 !...NEXT QR TRANSFORMATION...
1147  c = 1.d0
1148  s = 1.d0
1149  lp1 = l + 1
1150  IF (lp1 > k) GO TO 133
1151  DO i=lp1,k
1152  g = e(i)
1153  y = q(i)
1154  h = s*g
1155  g = g*c
1156  IF (abs(f) < abs(h)) GO TO 123
1157  IF (f == 0.0) THEN
1158  GO TO 121
1159  ELSE
1160  GO TO 122
1161  END IF
1162  121 z = 0.d0
1163  GO TO 124
1164  122 z = abs(f)*sqrt(1 + (h/f)**2)
1165  GO TO 124
1166  123 z = abs(h)*sqrt(1 + (f/h)**2)
1167  124 e(i-1) = z
1168  IF (z /= 0.d0) GO TO 125
1169  f = 1.d0
1170  z = 1.d0
1171  125 c = f/z
1172  s = h/z
1173  f = x*c + g*s
1174  g = -x*s + g*c
1175  h = y*s
1176  y = y*c
1177  DO j=1,n
1178  x = ab(j,i-1)
1179  z = ab(j,i)
1180  ab(j,i-1) = x*c + z*s
1181  ab(j,i) = -x*s + z*c
1182  END DO
1183  IF (abs(f) < abs(h)) GO TO 129
1184  IF (f == 0.0) THEN
1185  GO TO 127
1186  ELSE
1187  GO TO 128
1188  END IF
1189  127 z = 0.d0
1190  GO TO 130
1191  128 z = abs(f)*sqrt(1 + (h/f)**2)
1192  GO TO 130
1193  129 z = abs(h)*sqrt(1 + (f/h)**2)
1194  130 q(i-1) = z
1195  IF (z /= 0.d0) GO TO 131
1196  f = 1.d0
1197  z = 1.d0
1198  131 c = f/z
1199  s = h/z
1200  f = c*g + s*y
1201  x = -s*g + c*y
1202  END DO
1203  133 e(l) = 0.d0
1204  e(k) = f
1205  q(k) = x
1206  GO TO 101
1207 !...CONVERGENCE: Q(K) IS MADE NON-NEGATIVE...
1208  140 IF (z >= 0.d0) cycle
1209  q(k) = -z
1210  DO j=1,n
1211  ab(j,k) = -ab(j,k)
1212  END DO
1213 END DO
1214 RETURN
1215 200 q(1) = ab(1,1)
1216 ab(1,1) = 1.d0
1217 
1218 END SUBROUTINE minfit
1219 
1220 
1221 
1222 
1223 !WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
1224 !
1225 !WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
1226 !
1227  SUBROUTINE min(n,j,nits,d2,x1,f1,fk,f,x,t,machep,h)
1228 
1229  IMPLICIT NONE
1230 
1231  INTEGER, INTENT(IN) :: n
1232  INTEGER :: j
1233  INTEGER :: nits
1234  REAL, INTENT(IN OUT) :: d2
1235  REAL, INTENT(IN OUT) :: x1
1236  REAL, INTENT(IN OUT) :: f1
1237  LOGICAL :: fk
1238  REAL :: f
1239  REAL, INTENT(IN OUT) :: x(n)
1240  REAL, INTENT(IN) :: t
1241  REAL, INTENT(IN) :: machep
1242  REAL, INTENT(IN) :: h
1243 
1244  INTEGER :: i,k
1245  EXTERNAL f
1246 
1247 
1248  REAL :: flin ! function
1249  REAL :: small,sf1,sx1,s,temp, xm,x2,f2,d1
1250  REAL :: fm,f0,t2
1251 !----------------------------------------------
1252  INTEGER :: nf,nl
1253  REAL :: fx,ldt,dmin
1254  REAL :: v(20,20),q0(20),q1(20),qa,qb,qc,qd0,qd1,qf1
1255  COMMON /global/ fx,ldt,dmin,nf,nl /q/ v,q0,q1,qa,qb,qc,qd0,qd1,qf1
1256 !----------------------------------------------
1257 !...THE SUBROUTINE MIN MINIMIZES F FROM X IN THE DIRECTION V(*,J) UNLESS
1258 ! J IS LESS THAN 1, WHEN A QUADRATIC SEARCH IS MADE IN THE PLANE
1259 ! DEFINED BY Q0,Q1,X.
1260 ! D2 IS EITHER ZERO OR AN APPROXIMATION TO HALF F".
1261 ! ON ENTRY, X1 IS AN ESTIMATE OF THE DISTANCE FROM X TO THE MINIMUM
1262 ! ALONG V(*,J) (OR, IF J=0, A CURVE). ON RETURN, X1 IS THE DISTANCE
1263 ! FOUND.
1264 ! IF FK=.TRUE., THEN F1 IS FLIN(X1). OTHERWISE X1 AND F1 ARE IGNORED
1265 ! ON ENTRY UNLESS FINAL FX IS GREATER THAN F1.
1266 ! NITS CONTROLS THE NUMBER OF TIMES AN ATTEMPT WILL BE MADE TO HALVE
1267 ! THE INTERVAL.
1268  LOGICAL :: dz
1269  REAL :: m2,m4
1270 
1271 small = machep**2
1272 m2 = sqrt(machep)
1273 m4 = sqrt(m2)
1274 sf1 = f1
1275 sx1 = x1
1276 k = 0
1277 xm = 0.d0
1278 fm = fx
1279 f0 = fx
1280 dz = d2 < machep
1281 !...FIND THE STEP SIZE...
1282 s = 0.d0
1283 DO i=1,n
1284  s = s + x(i)**2
1285 END DO
1286 s = sqrt(s)
1287 temp = d2
1288 IF (dz) temp = dmin
1289 t2 = m4*sqrt(abs(fx)/temp + s*ldt) + m2*ldt
1290 s = m4*s + t
1291 IF (dz.AND.t2 > s) t2 = s
1292 t2 = dmax1(t2,small)
1293 t2 = dmin1(t2,.01d0*h)
1294 IF (.NOT.fk.OR.f1 > fm) GO TO 2
1295 xm = x1
1296 fm = f1
1297 2 IF (fk.AND.abs(x1) >= t2) GO TO 3
1298 temp=1.d0
1299 IF (x1 < 0.d0) temp=-1.d0
1300 x1=temp*t2
1301 f1 = flin(n,j,x1,f,x,nf)
1302 3 IF (f1 > fm) GO TO 4
1303 xm = x1
1304 fm = f1
1305 4 IF (.NOT.dz) GO TO 6
1306 !...EVALUATE FLIN AT ANOTHER POINT AND ESTIMATE THE SECOND DERIVATIVE...
1307 x2 = -x1
1308 IF (f0 >= f1) x2 = 2.d0*x1
1309 f2 = flin(n,j,x2,f,x,nf)
1310 IF (f2 > fm) GO TO 5
1311 xm = x2
1312 fm = f2
1313 5 d2 = (x2*(f1 - f0)-x1*(f2 - f0))/((x1*x2)*(x1 - x2))
1314 !...ESTIMATE THE FIRST DERIVATIVE AT 0...
1315 6 d1 = (f1 - f0)/x1 - x1*d2
1316 dz = .true.
1317 !...PREDICT THE MINIMUM...
1318 IF (d2 > small) GO TO 7
1319 x2 = h
1320 IF (d1 >= 0.d0) x2 = -x2
1321 GO TO 8
1322 7 x2 = (-.5d0*d1)/d2
1323 8 IF (abs(x2) <= h) GO TO 11
1324 IF (x2 > 0.0) THEN
1325  GO TO 10
1326 END IF
1327 x2 = -h
1328 GO TO 11
1329 10 x2 = h
1330 !...EVALUATE F AT THE PREDICTED MINIMUM...
1331 11 f2 = flin(n,j,x2,f,x,nf)
1332 IF (k >= nits.OR.f2 <= f0) GO TO 12
1333 !...NO SUCCESS, SO TRY AGAIN...
1334 k = k + 1
1335 IF (f0 < f1.AND.(x1*x2) > 0.d0) GO TO 4
1336 x2 = 0.5d0*x2
1337 GO TO 11
1338 !...INCREMENT THE ONE-DIMENSIONAL SEARCH COUNTER...
1339 12 nl = nl + 1
1340 IF (f2 <= fm) GO TO 13
1341 x2 = xm
1342 GO TO 14
1343 13 fm = f2
1344 !...GET A NEW ESTIMATE OF THE SECOND DERIVATIVE...
1345 14 IF (abs(x2*(x2 - x1)) <= small) GO TO 15
1346 d2 = (x2*(f1-f0) - x1*(fm-f0))/((x1*x2)*(x1 - x2))
1347 GO TO 16
1348 15 IF (k > 0) d2 = 0.d0
1349 16 IF (d2 <= small) d2 = small
1350 x1 = x2
1351 fx = fm
1352 IF (sf1 >= fx) GO TO 17
1353 fx = sf1
1354 x1 = sx1
1355 !...UPDATE X FOR LINEAR BUT NOT PARABOLIC SEARCH...
1356 17 IF (j == 0) RETURN
1357 DO i=1,n
1358  x(i) = x(i) + x1*v(i,j)
1359 END DO
1360 
1361 END SUBROUTINE min
1362 
1363 
1364 !WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
1365 !
1366 !WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
1367 !
1368  SUBROUTINE vcprnt(option,v,n)
1369 
1370  IMPLICIT NONE
1371  INTEGER :: option
1372  REAL, INTENT(IN OUT) :: v(n)
1373  INTEGER :: n
1374 
1375  INTEGER :: i
1376 
1377 SELECT CASE ( option )
1378  CASE ( 1)
1379  GO TO 1
1380  CASE ( 2)
1381  GO TO 2
1382  CASE ( 3)
1383  GO TO 3
1384  CASE ( 4)
1385  GO TO 4
1386 END SELECT
1387 
1388 1 WRITE (6,101) (v(i),i=1,n)
1389 RETURN
1390 2 WRITE (6,102) (v(i),i=1,n)
1391 RETURN
1392 3 WRITE (6,103) (v(i),i=1,n)
1393 RETURN
1394 4 WRITE (6,104) (v(i),i=1,n)
1395 RETURN
1396 101 FORMAT (/' THE SECOND DIFFERENCE ARRAY D(*) IS:'/ (e32.14,4e25.14))
1397 102 FORMAT (/' THE SCALE FACTORS ARE:'/(e32.14,4e25.14))
1398 103 FORMAT (/' THE APPROXIMATING QUADR. FORM HAS PRINCIPAL VALUES:'/ &
1399  (e32.14,4e25.14))
1400 104 FORMAT (/' X IS:',e26.14/(e32.14))
1401 END SUBROUTINE vcprnt
1402 
1403 
1404 !WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
1405 !
1406 !WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
1407 !
1408  SUBROUTINE print(n,x,prin,fmin)
1409 
1410  IMPLICIT NONE
1411  INTEGER :: n
1412  REAL, INTENT(IN OUT) :: x(n)
1413  INTEGER, INTENT(IN OUT) :: prin
1414  REAL, INTENT(IN OUT) :: fmin
1415 
1416  INTEGER :: i
1417  REAL :: ln
1418 !----------------------------------------------
1419 INTEGER :: nf,nl
1420 REAL :: fx,ldt,dmin
1421 COMMON /global/ fx,ldt,dmin,nf,nl
1422 !----------------------------------------------
1423 WRITE (6,101) nl,nf,fx
1424 
1425 IF (fx <= fmin) GO TO 1
1426 ln = log10(fx-fmin)
1427 WRITE (6,102) fmin,ln
1428 GO TO 2
1429 1 WRITE (6,103) fmin
1430 2 IF (n > 4.AND.prin <= 2) RETURN
1431 WRITE (6,104) (x(i),i=1,n)
1432 RETURN
1433 101 FORMAT (/' AFTER',i6, &
1434  ' LINEAR SEARCHES, THE FUNCTION HAS BEEN EVALUATED',i6, &
1435  ' TIMES. THE SMALLEST VALUE FOUND IS F(X) = ',e21.14)
1436 102 FORMAT (' LOG (F(X)-',e21.14,') = ',e21.14)
1437 103 FORMAT (' LOG (F(X)-',e21.14,') IS UNDEFINED.')
1438 104 FORMAT (' X IS:',e26.14/(e32.14))
1439 END SUBROUTINE print
1440 
1441 
1442 !WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
1443 !
1444 !WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
1445 !
1446  SUBROUTINE maprnt(option,v,m,n)
1447 
1448  IMPLICIT NONE
1449  INTEGER :: option
1450  REAL, INTENT(IN OUT) :: v(m,n)
1451  INTEGER, INTENT(IN OUT) :: m
1452  INTEGER, INTENT(IN) :: n
1453  INTEGER :: i,j
1454 
1455  INTEGER :: low,upp
1456 !...THE SUBROUTINE MAPRNT PRINTS THE COLUMNS OF THE NXN MATRIX V
1457 ! WITH A HEADING AS SPECIFIED BY OPTION.
1458 ! M IS THE ROW DIMENSION OF V AS DECLARED IN THE CALLING PROGRAM...
1459 low = 1
1460 upp = 5
1461 SELECT CASE ( option )
1462  CASE ( 1)
1463  GO TO 1
1464  CASE ( 2)
1465  GO TO 2
1466 END SELECT
1467 1 WRITE (6,101)
1468 101 FORMAT (/' THE NEW DIRECTIONS ARE:')
1469 GO TO 3
1470 2 WRITE (6,102)
1471 102 FORMAT (' AND THE PRINCIPAL AXES:')
1472 3 IF (n < upp) upp = n
1473 DO i=1,n
1474  WRITE (6,104) (v(i,j),j=low,upp)
1475 END DO
1476 low = low + 5
1477 IF (n < low) RETURN
1478 upp = upp + 5
1479 WRITE (6,103)
1480 GO TO 3
1481 103 FORMAT (' ')
1482 104 FORMAT (e32.14,4e25.14)
1483 END SUBROUTINE maprnt
1484 
1485 
1486 !WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
1487 !
1488 !WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
1489 !
1490  REAL FUNCTION random(naught)
1491 
1492  IMPLICIT NONE
1493  INTEGER, INTENT(IN OUT) :: naught
1494 
1495  REAL :: ran1,ran3(127),half
1496  INTEGER :: i,j,ran2,q,r
1497  LOGICAL :: init
1498  DATA init/.false./
1499  SAVE init,ran2,ran1,ran3
1500 
1501 IF (init) GO TO 3
1502 r = mod(naught,8190) + 1
1503 ran2 = 128
1504 DO i=1,127
1505  ran2 = ran2 - 1
1506  ran1 = -2.d0**55
1507  DO j=1,7
1508  r = mod(1756*r,8191)
1509  q = r/32
1510  ran1 = (ran1 + q)*(1.0d0/256)
1511  END DO
1512  ran3(ran2) = ran1
1513 END DO
1514 init = .true.
1515 3 IF (ran2 == 1) ran2 = 128
1516 ran2 = ran2 - 1
1517 ran1 = ran1 + ran3(ran2)
1518 half = .5d0
1519 IF (ran1 >= 0.d0) half = -half
1520 ran1 = ran1 + half
1521 ran3(ran2) = ran1
1522 random = ran1 + .5d0
1523 
1524 END FUNCTION random
1525 
1526 
1527 
1528 !WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
1529 !
1530 !WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
1531 !
1532  REAL FUNCTION flin (n,j,l,f,x,nf)
1533  IMPLICIT NONE
1534 
1535  INTEGER, INTENT(IN) :: n
1536  INTEGER, INTENT(IN OUT) :: j
1537  REAL, INTENT(IN) :: l
1538  REAL :: f
1539  REAL, INTENT(IN) :: x(n)
1540  INTEGER, INTENT(OUT) :: nf
1541 
1542  INTEGER :: i
1543  REAL :: t(20)
1544 
1545  EXTERNAL f
1546 
1547 !...FLIN IS THE FUNCTION OF ONE REAL VARIABLE L THAT IS MINIMIZED
1548 ! BY THE SUBROUTINE MIN...
1549 !----------------------------------------------
1550  REAL :: v(20,20),q0(20),q1(20),qa,qb,qc,qd0,qd1,qf1
1551  COMMON /q/ v,q0,q1,qa,qb,qc,qd0,qd1,qf1
1552 !----------------------------------------------
1553 IF (j == 0) GO TO 2
1554 !...THE SEARCH IS LINEAR...
1555 DO i=1,n
1556  t(i) = x(i) + l*v(i,j)
1557 END DO
1558 GO TO 4
1559 !...THE SEARCH IS ALONG A PARABOLIC SPACE CURVE...
1560 2 qa = (l*(l - qd1))/(qd0*(qd0 + qd1))
1561 qb = ((l + qd0)*(qd1 - l))/(qd0*qd1)
1562 qc = (l*(l + qd0))/(qd1*(qd0 + qd1))
1563 DO i=1,n
1564  t(i) = (qa*q0(i) + qb*x(i)) + qc*q1(i)
1565 END DO
1566 !...THE FUNCTION EVALUATION COUNTER NF IS INCREMENTED...
1567 4 nf = nf + 1
1568 flin = f(t,n)
1569 
1570 END FUNCTION flin
1571 
1572 
1573 !WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
1574 !
1575 !WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
1576 !
1577  SUBROUTINE sort(m,n,d,v)
1578  IMPLICIT NONE
1579 !
1580  INTEGER, INTENT(IN OUT) :: m
1581  INTEGER, INTENT(IN) :: n
1582  REAL, INTENT(IN OUT) :: d(n)
1583  REAL, INTENT(IN OUT) :: v(m,n)
1584 
1585  INTEGER :: i,j,k,nm1,ip1
1586  REAL :: s
1587 !...SORTS THE ELEMENTS OF D(N) INTO DESCENDING ORDER AND MOVES THE
1588 ! CORRESPONDING COLUMNS OF V(N,N).
1589 ! M IS THE ROW DIMENSION OF V AS DECLARED IN THE CALLING PROGRAM.
1590 IF (n == 1) RETURN
1591 nm1 = n - 1
1592 DO i = 1,nm1
1593  k=i
1594  s = d(i)
1595  ip1 = i + 1
1596  DO j = ip1,n
1597  IF (d(j) <= s) cycle
1598  k = j
1599  s = d(j)
1600  END DO
1601  IF (k <= i) cycle
1602  d(k) = d(i)
1603  d(i) = s
1604  DO j = 1,n
1605  s = v(j,i)
1606  v(j,i) = v(j,k)
1607  v(j,k) = s
1608  END DO
1609 END DO
1610 END SUBROUTINE sort
1611 
1612 
1613 !WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
1614 !
1615 !WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
1616 !
1617  SUBROUTINE quad(n,f,x,t,machep,h)
1618  IMPLICIT NONE
1619 
1620  INTEGER, INTENT(IN) :: n
1621  REAL :: f
1622  REAL, INTENT(IN OUT) :: x(n)
1623  REAL, INTENT(IN OUT) :: t
1624  REAL :: machep
1625  REAL, INTENT(IN OUT) :: h
1626 ! IMPLICIT REAL (A-H,O-Z)
1627  EXTERNAL f
1628 
1629 !...QUAD LOOKS FOR THE MINIMUM OF F ALONG A CURVE DEFINED BY Q0,Q1,X...
1630  INTEGER :: i
1631  REAL :: l
1632  REAL :: s,value
1633 !----------------------------------------------
1634  INTEGER :: nf,nl
1635  REAL :: fx,ldt,dmin
1636 
1637 REAL :: v(20,20),q0(20),q1(20),qa,qb,qc,qd0,qd1,qf1
1638 COMMON /global/ fx,ldt,dmin,nf,nl /q/ v,q0,q1,qa,qb,qc,qd0,qd1,qf1
1639 !----------------------------------------------
1640 s = fx
1641 fx = qf1
1642 qf1 = s
1643 qd1 = 0.d0
1644 DO i=1,n
1645  s = x(i)
1646  l = q1(i)
1647  x(i) = l
1648  q1(i) = s
1649  qd1 = qd1 + (s-l)**2
1650 END DO
1651 qd1 = sqrt(qd1)
1652 l = qd1
1653 s = 0.d0
1654 IF (qd0 <= 0.d0 .OR. qd1 <= 0.d0 .OR. nl < 3*n*n) GO TO 2
1655 value=qf1
1656 CALL min(n,0,2,s,l,value,.true.,f,x,t,machep,h)
1657 qa = (l*(l-qd1))/(qd0*(qd0+qd1))
1658 qb = ((l+qd0)*(qd1-l))/(qd0*qd1)
1659 qc = (l*(l+qd0))/(qd1*(qd0+qd1))
1660 GO TO 3
1661 2 fx = qf1
1662 qa = 0.d0
1663 qb = qa
1664 qc = 1.d0
1665 3 qd0 = qd1
1666 DO i=1,n
1667  s = q0(i)
1668  q0(i) = x(i)
1669  x(i) = (qa*s + qb*x(i)) + qc*q1(i)
1670 END DO
1671 END SUBROUTINE quad
1672 
double sig
correlated to variance of initial distribution
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW Module DFT_MODULE This module...
Definition: modules.f90:272