2
3
4
5
6
7
8
9 INTEGER INFO, J, LDS
10
11
12 DOUBLE PRECISION OUT( J, * ), S( LDS, * )
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54 DOUBLE PRECISION ZERO
55 parameter( zero = 0.0d+0 )
56
57
58 INTEGER BOT, I, LAST, TOP
59
60
61 INTRINSIC mod
62
63
64
65 last = j
66 top = 1
67 bot = j
68 info = 0
69 DO 10 i = j - 1, 1, -1
70 IF( s( i+1, i ).EQ.zero ) THEN
71 IF( last-i.EQ.2 ) THEN
72 out( bot-1, 1 ) = s( i+1, i+1 )
73 out( bot, 2 ) = s( i+2, i+2 )
74 out( bot-1, 2 ) = s( i+1, i+2 )
75 out( bot, 1 ) = s( i+2, i+1 )
76 bot = bot - 2
77 END IF
78 IF( last-i.EQ.1 ) THEN
79 IF( mod( top, 2 ).EQ.1 ) THEN
80
81
82
83 IF( ( i.EQ.j-1 ) .OR. ( i.EQ.1 ) ) THEN
84 out( top, 1 ) = s( i+1, i+1 )
85 ELSE
86 out( top, 1 ) = s( i+1, i+1 )
87 END IF
88 out( top, 2 ) = zero
89 ELSE
90
91
92
93 IF( ( i.EQ.j-1 ) .OR. ( i.EQ.1 ) ) THEN
94 out( top, 2 ) = s( i+1, i+1 )
95 ELSE
96 out( top, 2 ) = s( i+1, i+1 )
97 END IF
98 out( top, 1 ) = zero
99 END IF
100 top = top + 1
101 END IF
102 IF( last-i.GT.2 ) THEN
103 info = i
104 RETURN
105 END IF
106 last = i
107 END IF
108 10 CONTINUE
109 IF( last.EQ.2 ) THEN
110
111
112
113 out( bot-1, 1 ) = s( 1, 1 )
114 out( bot, 2 ) = s( 2, 2 )
115 out( bot-1, 2 ) = s( 1, 2 )
116 out( bot, 1 ) = s( 2, 1 )
117 bot = bot - 2
118 END IF
119 IF( last.EQ.1 .and. mod(top, 2) .eq. 0 ) THEN
120
121
122
123 out(top, 2) = s(1,1)
124 out(top, 1) = zero
125 top = top + 1
126 END IF
127 IF( top-1.NE.bot ) THEN
128 info = -bot
129 RETURN
130 END IF
131
132
133
134 DO 20 i = 1, j, 2
135 s( i, i ) = out( i, 1 )
136 s( i+1, i ) = out( i+1, 1 )
137 s( i, i+1 ) = out( i, 2 )
138 s( i+1, i+1 ) = out( i+1, 2 )
139 20 CONTINUE
140
141 RETURN
142
143
144