/[lmdze]/trunk/filtrez/jacobi.f
ViewVC logotype

Contents of /trunk/filtrez/jacobi.f

Parent Directory Parent Directory | Revision Log Revision Log


Revision 82 - (show annotations)
Wed Mar 5 14:57:53 2014 UTC (10 years, 2 months ago) by guez
File size: 2427 byte(s)
Changed all ".f90" suffixes to ".f".
1
2 ! $Header: /home/cvsroot/LMDZ4/libf/filtrez/jacobi.F,v 1.1.1.1 2004/05/19
3 ! 12:53:09 lmdzadmin Exp $
4
5 SUBROUTINE jacobi(a, n, np, d, v, nrot)
6 PARAMETER (nmax=400)
7 DIMENSION a(np, np), d(np), v(np, np), b(nmax), z(nmax)
8
9 IF (n>nmax) THEN
10 PRINT *, 'n, nmax=', n, nmax
11 PRINT *, 'Surdimensionnement insuffisant dans jacobi'
12 STOP 1
13 END IF
14 DO ip = 1, n
15 DO iq = 1, n
16 v(ip, iq) = 0.
17 END DO
18 v(ip, ip) = 1.
19 END DO
20 DO ip = 1, n
21 b(ip) = a(ip, ip)
22 d(ip) = b(ip)
23 z(ip) = 0.
24 END DO
25 nrot = 0
26 DO i = 1, 50
27 sm = 0.
28 DO ip = 1, n - 1
29 DO iq = ip + 1, n
30 sm = sm + abs(a(ip,iq))
31 END DO
32 END DO
33 IF (sm==0.) RETURN
34 IF (i<4) THEN
35 tresh = 0.2*sm/n**2
36 ELSE
37 tresh = 0.
38 END IF
39 DO ip = 1, n - 1
40 DO iq = ip + 1, n
41 g = 100.*abs(a(ip,iq))
42 IF ((i>4) .AND. (abs(d(ip))+g==abs(d(ip))) .AND. (abs(d(iq))+g==abs( &
43 d(iq)))) THEN
44 a(ip, iq) = 0.
45 ELSE IF (abs(a(ip,iq))>tresh) THEN
46 h = d(iq) - d(ip)
47 IF (abs(h)+g==abs(h)) THEN
48 t = a(ip, iq)/h
49 ELSE
50 theta = 0.5*h/a(ip, iq)
51 t = 1./(abs(theta)+sqrt(1.+theta**2))
52 IF (theta<0.) t = -t
53 END IF
54 c = 1./sqrt(1+t**2)
55 s = t*c
56 tau = s/(1.+c)
57 h = t*a(ip, iq)
58 z(ip) = z(ip) - h
59 z(iq) = z(iq) + h
60 d(ip) = d(ip) - h
61 d(iq) = d(iq) + h
62 a(ip, iq) = 0.
63 DO j = 1, ip - 1
64 g = a(j, ip)
65 h = a(j, iq)
66 a(j, ip) = g - s*(h+g*tau)
67 a(j, iq) = h + s*(g-h*tau)
68 END DO
69 DO j = ip + 1, iq - 1
70 g = a(ip, j)
71 h = a(j, iq)
72 a(ip, j) = g - s*(h+g*tau)
73 a(j, iq) = h + s*(g-h*tau)
74 END DO
75 DO j = iq + 1, n
76 g = a(ip, j)
77 h = a(iq, j)
78 a(ip, j) = g - s*(h+g*tau)
79 a(iq, j) = h + s*(g-h*tau)
80 END DO
81 DO j = 1, n
82 g = v(j, ip)
83 h = v(j, iq)
84 v(j, ip) = g - s*(h+g*tau)
85 v(j, iq) = h + s*(g-h*tau)
86 END DO
87 nrot = nrot + 1
88 END IF
89 END DO
90 END DO
91 DO ip = 1, n
92 b(ip) = b(ip) + z(ip)
93 d(ip) = b(ip)
94 z(ip) = 0.
95 END DO
96 END DO
97 STOP '50 iterations should never happen'
98 RETURN
99 END SUBROUTINE jacobi

  ViewVC Help
Powered by ViewVC 1.1.21