3 IMPLICIT NONE
4
5
6
7
8
9
10
11
12 INTEGER IFST, ILST, INFO, LDT, N, NDTRAF, NITRAF
13
14
15 INTEGER ITRAF( * )
16 REAL DTRAF( * ), T( LDT, * ), WORK( * )
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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131 REAL ZERO
132 parameter( zero = 0.0e+0 )
133 INTEGER DLNGTH(3), ILNGTH(3)
134
135
136 INTEGER CDTRAF, CITRAF, LDTRAF, LITRAF, HERE, I, NBF,
137 $ NBL, NBNEXT
138
139
140 LOGICAL LSAME
142
143
145
146
148
149
150
151 DATA ilngth(1)/1/, ilngth(2)/2/, ilngth(3)/4/
152 DATA dlngth(1)/2/, dlngth(2)/5/, dlngth(3)/10/
153
154
155
156
157
158 info = 0
159 IF( n.LT.0 ) THEN
160 info = -1
161 ELSE IF( ldt.LT.
max( 1, n ) )
THEN
162 info = -3
163 ELSE IF( ifst.LT.1 .OR. ifst.GT.n ) THEN
164 info = -4
165 ELSE IF( ilst.LT.1 .OR. ilst.GT.n ) THEN
166 info = -5
167 ELSE IF ( nitraf.LT.
max( 1, abs( ilst-ifst ) ) )
THEN
168 info = -6
169 ELSE IF ( ndtraf.LT.
max( 1, 2*abs( ilst-ifst ) ) )
THEN
170 info = -8
171 END IF
172 IF( info.NE.0 ) THEN
173 CALL xerbla( 'DTREXC', -info )
174 RETURN
175 END IF
176
177
178
179 IF( n.LE.1 )
180 $ RETURN
181 citraf = 1
182 cdtraf = 1
183
184
185
186
187 IF( ifst.GT.1 ) THEN
188 IF( t( ifst, ifst-1 ).NE.zero )
189 $ ifst = ifst - 1
190 END IF
191 nbf = 1
192 IF( ifst.LT.n ) THEN
193 IF( t( ifst+1, ifst ).NE.zero )
194 $ nbf = 2
195 END IF
196
197
198
199
200 IF( ilst.GT.1 ) THEN
201 IF( t( ilst, ilst-1 ).NE.zero )
202 $ ilst = ilst - 1
203 END IF
204 nbl = 1
205 IF( ilst.LT.n ) THEN
206 IF( t( ilst+1, ilst ).NE.zero )
207 $ nbl = 2
208 END IF
209
210 IF( ifst.EQ.ilst )
211 $ RETURN
212
213 IF( ifst.LT.ilst ) THEN
214
215
216
217 IF( nbf.EQ.2 .AND. nbl.EQ.1 )
218 $ ilst = ilst - 1
219 IF( nbf.EQ.1 .AND. nbl.EQ.2 )
220 $ ilst = ilst + 1
221
222 here = ifst
223
224 10 CONTINUE
225
226
227
228 IF( nbf.EQ.1 .OR. nbf.EQ.2 ) THEN
229
230
231
232 nbnext = 1
233 IF( here+nbf+1.LE.n ) THEN
234 IF( t( here+nbf+1, here+nbf ).NE.zero )
235 $ nbnext = 2
236 END IF
237
238 litraf = ilngth(nbf+nbnext-1)
239 ldtraf = dlngth(nbf+nbnext-1)
240 IF( citraf+litraf-1.GT.nitraf ) THEN
241 info = -6
242 CALL xerbla( 'BSTREXC', -info )
243 RETURN
244 END IF
245 IF( cdtraf+ldtraf-1.GT.ndtraf ) THEN
246 info = -8
247 CALL xerbla( 'BSTREXC', -info )
248 RETURN
249 END IF
250 CALL bslaexc( n, t, ldt, here, nbf, nbnext, itraf(citraf),
251 $ dtraf(cdtraf), work, info )
252 IF( info.NE.0 ) THEN
253 ilst = here
254 nitraf = citraf - 1
255 ndtraf = cdtraf - 1
256 RETURN
257 END IF
258 citraf = citraf + litraf
259 cdtraf = cdtraf + ldtraf
260 here = here + nbnext
261
262
263
264 IF( nbf.EQ.2 ) THEN
265 IF( t( here+1, here ).EQ.zero )
266 $ nbf = 3
267 END IF
268
269 ELSE
270
271
272
273
274 nbnext = 1
275 IF( here+3.LE.n ) THEN
276 IF( t( here+3, here+2 ).NE.zero )
277 $ nbnext = 2
278 END IF
279 litraf = ilngth(nbnext)
280 ldtraf = dlngth(nbnext)
281 IF( citraf+litraf-1.GT.nitraf ) THEN
282 info = -6
283 CALL xerbla( 'BSTREXC', -info )
284 RETURN
285 END IF
286 IF( cdtraf+ldtraf-1.GT.ndtraf ) THEN
287 info = -8
288 CALL xerbla( 'BSTREXC', -info )
289 RETURN
290 END IF
291 CALL bslaexc( n, t, ldt, here+1, 1, nbnext, itraf(citraf),
292 $ dtraf(cdtraf), work, info )
293 IF( info.NE.0 ) THEN
294 ilst = here
295 nitraf = citraf - 1
296 ndtraf = cdtraf - 1
297 RETURN
298 END IF
299 citraf = citraf + litraf
300 cdtraf = cdtraf + ldtraf
301
302 IF( nbnext.EQ.1 ) THEN
303
304
305
306 litraf = ilngth(1)
307 ldtraf = dlngth(1)
308 IF( citraf+litraf-1.GT.nitraf ) THEN
309 info = -6
310 CALL xerbla( 'BSTREXC', -info )
311 RETURN
312 END IF
313 IF( cdtraf+ldtraf-1.GT.ndtraf ) THEN
314 info = -8
315 CALL xerbla( 'BSTREXC', -info )
316 RETURN
317 END IF
318 CALL bslaexc( n, t, ldt, here, 1, nbnext, itraf(citraf),
319 $ dtraf(cdtraf), work, info )
320 citraf = citraf + litraf
321 cdtraf = cdtraf + ldtraf
322 here = here + 1
323 ELSE
324
325
326
327 IF( t( here+2, here+1 ).EQ.zero )
328 $ nbnext = 1
329 IF( nbnext.EQ.2 ) THEN
330
331
332
333 litraf = ilngth(2)
334 ldtraf = dlngth(2)
335 IF( citraf+litraf-1.GT.nitraf ) THEN
336 info = -6
337 CALL xerbla( 'BSTREXC', -info )
338 RETURN
339 END IF
340 IF( cdtraf+ldtraf-1.GT.ndtraf ) THEN
341 info = -8
342 CALL xerbla( 'BSTREXC', -info )
343 RETURN
344 END IF
345 CALL bslaexc( n, t, ldt, here, 1, nbnext,
346 $ itraf(citraf), dtraf(cdtraf), work,
347 $ info )
348 IF( info.NE.0 ) THEN
349 info = 2
350 ilst = here
351 nitraf = citraf - 1
352 ndtraf = cdtraf - 1
353 RETURN
354 END IF
355 citraf = citraf + litraf
356 cdtraf = cdtraf + ldtraf
357 here = here + 2
358 ELSE
359
360
361
362 litraf = ilngth(1)
363 ldtraf = dlngth(1)
364 IF( citraf+2*litraf-1.GT.nitraf ) THEN
365 info = -6
366 CALL xerbla( 'BSTREXC', -info )
367 RETURN
368 END IF
369 IF( cdtraf+2*ldtraf-1.GT.ndtraf ) THEN
370 info = -8
371 CALL xerbla( 'BSTREXC', -info )
372 RETURN
373 END IF
374 CALL bslaexc( n, t, ldt, here, 1, 1, itraf(citraf),
375 $ dtraf(cdtraf), work, info )
376 citraf = citraf + litraf
377 cdtraf = cdtraf + ldtraf
378 CALL bslaexc( n, t, ldt, here+1, 1, 1, itraf(citraf),
379 $ dtraf(cdtraf), work, info )
380 citraf = citraf + litraf
381 cdtraf = cdtraf + ldtraf
382 here = here + 2
383 END IF
384 END IF
385 END IF
386 IF( here.LT.ilst )
387 $ GO TO 10
388
389 ELSE
390
391 here = ifst
392 20 CONTINUE
393
394
395
396 IF( nbf.EQ.1 .OR. nbf.EQ.2 ) THEN
397
398
399
400 nbnext = 1
401 IF( here.GE.3 ) THEN
402 IF( t( here-1, here-2 ).NE.zero )
403 $ nbnext = 2
404 END IF
405
406 litraf = ilngth(nbf+nbnext-1)
407 ldtraf = dlngth(nbf+nbnext-1)
408 IF( citraf+litraf-1.GT.nitraf ) THEN
409 info = -6
410 CALL xerbla( 'BSTREXC', -info )
411 RETURN
412 END IF
413 IF( cdtraf+ldtraf-1.GT.ndtraf ) THEN
414 info = -8
415 CALL xerbla( 'BSTREXC', -info )
416 RETURN
417 END IF
418 CALL bslaexc( n, t, ldt, here-nbnext, nbnext, nbf,
419 $ itraf(citraf), dtraf(cdtraf), work, info )
420 IF( info.NE.0 ) THEN
421 ilst = here
422 nitraf = citraf - 1
423 ndtraf = cdtraf - 1
424 RETURN
425 END IF
426 citraf = citraf + litraf
427 cdtraf = cdtraf + ldtraf
428 here = here - nbnext
429
430
431
432 IF( nbf.EQ.2 ) THEN
433 IF( t( here+1, here ).EQ.zero )
434 $ nbf = 3
435 END IF
436
437 ELSE
438
439
440
441
442 nbnext = 1
443 IF( here.GE.3 ) THEN
444 IF( t( here-1, here-2 ).NE.zero )
445 $ nbnext = 2
446 END IF
447 litraf = ilngth(nbnext)
448 ldtraf = dlngth(nbnext)
449 IF( citraf+litraf-1.GT.nitraf ) THEN
450 info = -6
451 CALL xerbla( 'BSTREXC', -info )
452 RETURN
453 END IF
454 IF( cdtraf+ldtraf-1.GT.ndtraf ) THEN
455 info = -8
456 CALL xerbla( 'BSTREXC', -info )
457 RETURN
458 END IF
459 CALL bslaexc( n, t, ldt, here-nbnext, nbnext, 1,
460 $ itraf(citraf), dtraf(cdtraf), work, info )
461 IF( info.NE.0 ) THEN
462 ilst = here
463 nitraf = citraf - 1
464 ndtraf = cdtraf - 1
465 RETURN
466 END IF
467 citraf = citraf + litraf
468 cdtraf = cdtraf + ldtraf
469
470 IF( nbnext.EQ.1 ) THEN
471
472
473
474 litraf = ilngth(1)
475 ldtraf = dlngth(1)
476 IF( citraf+litraf-1.GT.nitraf ) THEN
477 info = -6
478 CALL xerbla( 'BSTREXC', -info )
479 RETURN
480 END IF
481 IF( cdtraf+ldtraf-1.GT.ndtraf ) THEN
482 info = -8
483 CALL xerbla( 'BSTREXC', -info )
484 RETURN
485 END IF
486 CALL bslaexc( n, t, ldt, here, nbnext, 1, itraf(citraf),
487 $ dtraf(cdtraf), work, info )
488 citraf = citraf + litraf
489 cdtraf = cdtraf + ldtraf
490 here = here - 1
491 ELSE
492
493
494
495 IF( t( here, here-1 ).EQ.zero )
496 $ nbnext = 1
497 IF( nbnext.EQ.2 ) THEN
498
499
500
501 litraf = ilngth(2)
502 ldtraf = dlngth(2)
503 IF( citraf+litraf-1.GT.nitraf ) THEN
504 info = -6
505 CALL xerbla( 'BSTREXC', -info )
506 RETURN
507 END IF
508 IF( cdtraf+ldtraf-1.GT.ndtraf ) THEN
509 info = -8
510 CALL xerbla( 'BSTREXC', -info )
511 RETURN
512 END IF
513 CALL bslaexc( n, t, ldt, here-1, 2, 1, itraf(citraf),
514 $ dtraf(cdtraf), work, info )
515 IF( info.NE.0 ) THEN
516 info = 2
517 ilst = here
518 nitraf = citraf - 1
519 ndtraf = cdtraf - 1
520 RETURN
521 END IF
522 citraf = citraf + litraf
523 cdtraf = cdtraf + ldtraf
524 here = here - 2
525 ELSE
526
527
528
529 litraf = ilngth(1)
530 ldtraf = dlngth(1)
531 IF( citraf+2*litraf-1.GT.nitraf ) THEN
532 info = -6
533 CALL xerbla( 'BSTREXC', -info )
534 RETURN
535 END IF
536 IF( cdtraf+2*ldtraf-1.GT.ndtraf ) THEN
537 info = -8
538 CALL xerbla( 'BSTREXC', -info )
539 RETURN
540 END IF
541 CALL bslaexc( n, t, ldt, here, 1, 1, itraf(citraf),
542 $ dtraf(cdtraf), work, info )
543 citraf = citraf + litraf
544 cdtraf = cdtraf + ldtraf
545 CALL bslaexc( n, t, ldt, here-1, 1, 1, itraf(citraf),
546 $ dtraf(cdtraf), work, info )
547 citraf = citraf + litraf
548 cdtraf = cdtraf + ldtraf
549 here = here - 2
550 END IF
551 END IF
552 END IF
553 IF( here.GT.ilst )
554 $ GO TO 20
555 END IF
556 ilst = here
557 nitraf = citraf - 1
558 ndtraf = cdtraf - 1
559
560 RETURN
561
562
563
subroutine bslaexc(n, t, ldt, j1, n1, n2, itraf, dtraf, work, info)