3
4
5
6
7
8
9 CHARACTER DIST, PACK, SYM
10 INTEGER INFO, KL, KU, LDA, M, MODE, N
11 DOUBLE PRECISION COND, DMAX
12
13
14 INTEGER ISEED( 4 )
15 DOUBLE PRECISION D( * )
16 COMPLEX*16 A( LDA, * ), 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
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264 DOUBLE PRECISION ZERO
265 parameter( zero = 0.0d+0 )
266 DOUBLE PRECISION ONE
267 parameter( one = 1.0d+0 )
268 COMPLEX*16 CZERO
269 parameter( czero = ( 0.0d+0, 0.0d+0 ) )
270 DOUBLE PRECISION TWOPI
271 parameter( twopi = 6.2831853071795864769252867663d+0 )
272
273
274 LOGICAL GIVENS, ILEXTR, ILTEMP, TOPDWN, ZSYM
275 INTEGER I, IC, ICOL, IDIST, IENDCH, IINFO, IL, ILDA,
276 $ IOFFG, IOFFST, IPACK, IPACKG, IR, IR1, IR2,
277 $ IROW, IRSIGN, ISKEW, ISYM, ISYMPK, J, JC, JCH,
278 $ JKL, JKU, JR, K, LLB, MINLDA, MNMIN, MR, NC,
279 $ UUB
280 DOUBLE PRECISION ALPHA, ANGLE, REALC, TEMP
281 COMPLEX*16 C, CT, CTEMP, DUMMY, EXTRA, S, ST
282
283
284 LOGICAL LSAME
285 DOUBLE PRECISION DLARND
286 COMPLEX*16 ZLARND
288
289
292
293
294 INTRINSIC abs, cos, dble, dcmplx, dconjg,
max,
min, mod,
295 $ sin
296
297
298
299
300
301
302 info = 0
303
304
305
306 IF( m.EQ.0 .OR. n.EQ.0 )
307 $ RETURN
308
309
310
311 IF(
lsame( dist,
'U' ) )
THEN
312 idist = 1
313 ELSE IF(
lsame( dist,
'S' ) )
THEN
314 idist = 2
315 ELSE IF(
lsame( dist,
'N' ) )
THEN
316 idist = 3
317 ELSE
318 idist = -1
319 END IF
320
321
322
323 IF(
lsame( sym,
'N' ) )
THEN
324 isym = 1
325 irsign = 0
326 zsym = .false.
327 ELSE IF(
lsame( sym,
'P' ) )
THEN
328 isym = 2
329 irsign = 0
330 zsym = .false.
331 ELSE IF(
lsame( sym,
'S' ) )
THEN
332 isym = 2
333 irsign = 0
334 zsym = .true.
335 ELSE IF(
lsame( sym,
'H' ) )
THEN
336 isym = 2
337 irsign = 1
338 zsym = .false.
339 ELSE
340 isym = -1
341 END IF
342
343
344
345 isympk = 0
346 IF(
lsame( pack,
'N' ) )
THEN
347 ipack = 0
348 ELSE IF(
lsame( pack,
'U' ) )
THEN
349 ipack = 1
350 isympk = 1
351 ELSE IF(
lsame( pack,
'L' ) )
THEN
352 ipack = 2
353 isympk = 1
354 ELSE IF(
lsame( pack,
'C' ) )
THEN
355 ipack = 3
356 isympk = 2
357 ELSE IF(
lsame( pack,
'R' ) )
THEN
358 ipack = 4
359 isympk = 3
360 ELSE IF(
lsame( pack,
'B' ) )
THEN
361 ipack = 5
362 isympk = 3
363 ELSE IF(
lsame( pack,
'Q' ) )
THEN
364 ipack = 6
365 isympk = 2
366 ELSE IF(
lsame( pack,
'Z' ) )
THEN
367 ipack = 7
368 ELSE
369 ipack = -1
370 END IF
371
372
373
379 irow = 1
380 icol = 1
381 zsym = .false.
382
383 IF( ipack.EQ.5 .OR. ipack.EQ.6 ) THEN
384 minlda = uub + 1
385 ELSE IF( ipack.EQ.7 ) THEN
386 minlda = llb + uub + 1
387 ELSE
388 minlda = m
389 END IF
390
391
392
393
394 givens = .false.
395 IF( isym.EQ.1 ) THEN
396 IF( dble( llb+uub ).LT.0.3d0*dble(
max( 1, mr+nc ) ) )
397 $ givens = .true.
398 ELSE
399 IF( 2*llb.LT.m )
400 $ givens = .true.
401 END IF
402 IF( lda.LT.m .AND. lda.GE.minlda )
403 $ givens = .true.
404
405
406
407 IF( m.LT.0 ) THEN
408 info = -1
409 ELSE IF( m.NE.n .AND. isym.NE.1 ) THEN
410 info = -1
411 ELSE IF( n.LT.0 ) THEN
412 info = -2
413 ELSE IF( idist.EQ.-1 ) THEN
414 info = -3
415 ELSE IF( isym.EQ.-1 ) THEN
416 info = -5
417 ELSE IF( abs( mode ).GT.6 ) THEN
418 info = -7
419 ELSE IF( ( mode.NE.0 .AND. abs( mode ).NE.6 ) .AND. cond.LT.one )
420 $ THEN
421 info = -8
422 ELSE IF( kl.LT.0 ) THEN
423 info = -10
424 ELSE IF( ku.LT.0 .OR. ( isym.NE.1 .AND. kl.NE.ku ) ) THEN
425 info = -11
426 ELSE IF( ipack.EQ.-1 .OR. ( isympk.EQ.1 .AND. isym.EQ.1 ) .OR.
427 $ ( isympk.EQ.2 .AND. isym.EQ.1 .AND. kl.GT.0 ) .OR.
428 $ ( isympk.EQ.3 .AND. isym.EQ.1 .AND. ku.GT.0 ) .OR.
429 $ ( isympk.NE.0 .AND. m.NE.n ) ) THEN
430 info = -12
431 ELSE IF( lda.LT.
max( 1, minlda ) )
THEN
432 info = -14
433 END IF
434
435 IF( info.NE.0 ) THEN
436 CALL xerbla( 'ZLATMS', -info )
437 RETURN
438 END IF
439
440
441
442 DO 10 i = 1, 4
443 iseed( i ) = mod( abs( iseed( i ) ), 4096 )
444 10 CONTINUE
445
446 IF( mod( iseed( 4 ), 2 ).NE.1 )
447 $ iseed( 4 ) = iseed( 4 ) + 1
448
449
450
451
452
453 CALL dlatm1( mode, cond, irsign, idist, iseed, d, mnmin, iinfo )
454 IF( iinfo.NE.0 ) THEN
455 info = 1
456 RETURN
457 END IF
458
459
460
461
462 IF( abs( d( 1 ) ).LE.abs( d( mnmin ) ) ) THEN
463 topdwn = .true.
464 ELSE
465 topdwn = .false.
466 END IF
467
468 IF( mode.NE.0 .AND. abs( mode ).NE.6 ) THEN
469
470
471
472 temp = abs( d( 1 ) )
473 DO 20 i = 2, mnmin
474 temp =
max( temp, abs( d( i ) ) )
475 20 CONTINUE
476
477 IF( temp.GT.zero ) THEN
478 alpha = dmax / temp
479 ELSE
480 info = 2
481 RETURN
482 END IF
483
484 CALL dscal( mnmin, alpha, d, 1 )
485
486 END IF
487
488 CALL zlaset( 'Full', lda, n, czero, czero, a, lda )
489
490
491
492
493
494
495
496
497
498
499 IF( ipack.GT.4 ) THEN
500 ilda = lda - 1
501 iskew = 1
502 IF( ipack.GT.5 ) THEN
503 ioffst = uub + 1
504 ELSE
505 ioffst = 1
506 END IF
507 ELSE
508 ilda = lda
509 iskew = 0
510 ioffst = 0
511 END IF
512
513
514
515
516
517 ipackg = 0
518
519
520
521
522 IF( llb.EQ.0 .AND. uub.EQ.0 ) THEN
523 DO 30 j = 1, mnmin
524 a( ( 1-iskew )*j+ioffst, j ) = dcmplx( d( j ) )
525 30 CONTINUE
526
527 IF( ipack.LE.2 .OR. ipack.GE.5 )
528 $ ipackg = ipack
529
530 ELSE IF( givens ) THEN
531
532
533
534
535 IF( isym.EQ.1 ) THEN
536
537
538
539 IF( ipack.GT.4 ) THEN
540 ipackg = ipack
541 ELSE
542 ipackg = 0
543 END IF
544
545 DO 40 j = 1, mnmin
546 a( ( 1-iskew )*j+ioffst, j ) = dcmplx( d( j ) )
547 40 CONTINUE
548
549 IF( topdwn ) THEN
550 jkl = 0
551 DO 70 jku = 1, uub
552
553
554
555
556
557
558 DO 60 jr = 1,
min( m+jku, n ) + jkl - 1
559 extra = czero
560 angle = twopi*
dlarnd( 1, iseed )
561 c = cos( angle )*
zlarnd( 5, iseed )
562 s = sin( angle )*
zlarnd( 5, iseed )
563 icol =
max( 1, jr-jkl )
564 IF( jr.LT.m ) THEN
565 il =
min( n, jr+jku ) + 1 - icol
566 CALL zlarot( .true., jr.GT.jkl, .false., il, c,
567 $ s, a( jr-iskew*icol+ioffst, icol ),
568 $ ilda, extra, dummy )
569 END IF
570
571
572
573 ir = jr
574 ic = icol
575 DO 50 jch = jr - jkl, 1, -jkl - jku
576 IF( ir.LT.m ) THEN
577 CALL zlartg( a( ir+1-iskew*( ic+1 )+ioffst,
578 $ ic+1 ), extra, realc, s, dummy )
579 dummy =
zlarnd( 5, iseed )
580 c = dconjg( realc*dummy )
581 s = dconjg( -s*dummy )
582 END IF
583 irow =
max( 1, jch-jku )
584 il = ir + 2 - irow
585 ctemp = czero
586 iltemp = jch.GT.jku
587 CALL zlarot( .false., iltemp, .true., il, c, s,
588 $ a( irow-iskew*ic+ioffst, ic ),
589 $ ilda, ctemp, extra )
590 IF( iltemp ) THEN
591 CALL zlartg( a( irow+1-iskew*( ic+1 )+ioffst,
592 $ ic+1 ), ctemp, realc, s, dummy )
593 dummy =
zlarnd( 5, iseed )
594 c = dconjg( realc*dummy )
595 s = dconjg( -s*dummy )
596
597 icol =
max( 1, jch-jku-jkl )
598 il = ic + 2 - icol
599 extra = czero
600 CALL zlarot( .true., jch.GT.jku+jkl, .true.,
601 $ il, c, s, a( irow-iskew*icol+
602 $ ioffst, icol ), ilda, extra,
603 $ ctemp )
604 ic = icol
605 ir = irow
606 END IF
607 50 CONTINUE
608 60 CONTINUE
609 70 CONTINUE
610
611 jku = uub
612 DO 100 jkl = 1, llb
613
614
615
616 DO 90 jc = 1,
min( n+jkl, m ) + jku - 1
617 extra = czero
618 angle = twopi*
dlarnd( 1, iseed )
619 c = cos( angle )*
zlarnd( 5, iseed )
620 s = sin( angle )*
zlarnd( 5, iseed )
621 irow =
max( 1, jc-jku )
622 IF( jc.LT.n ) THEN
623 il =
min( m, jc+jkl ) + 1 - irow
624 CALL zlarot( .false., jc.GT.jku, .false., il, c,
625 $ s, a( irow-iskew*jc+ioffst, jc ),
626 $ ilda, extra, dummy )
627 END IF
628
629
630
631 ic = jc
632 ir = irow
633 DO 80 jch = jc - jku, 1, -jkl - jku
634 IF( ic.LT.n ) THEN
635 CALL zlartg( a( ir+1-iskew*( ic+1 )+ioffst,
636 $ ic+1 ), extra, realc, s, dummy )
637 dummy =
zlarnd( 5, iseed )
638 c = dconjg( realc*dummy )
639 s = dconjg( -s*dummy )
640 END IF
641 icol =
max( 1, jch-jkl )
642 il = ic + 2 - icol
643 ctemp = czero
644 iltemp = jch.GT.jkl
645 CALL zlarot( .true., iltemp, .true., il, c, s,
646 $ a( ir-iskew*icol+ioffst, icol ),
647 $ ilda, ctemp, extra )
648 IF( iltemp ) THEN
649 CALL zlartg( a( ir+1-iskew*( icol+1 )+ioffst,
650 $ icol+1 ), ctemp, realc, s,
651 $ dummy )
652 dummy =
zlarnd( 5, iseed )
653 c = dconjg( realc*dummy )
654 s = dconjg( -s*dummy )
655 irow =
max( 1, jch-jkl-jku )
656 il = ir + 2 - irow
657 extra = czero
658 CALL zlarot( .false., jch.GT.jkl+jku, .true.,
659 $ il, c, s, a( irow-iskew*icol+
660 $ ioffst, icol ), ilda, extra,
661 $ ctemp )
662 ic = icol
663 ir = irow
664 END IF
665 80 CONTINUE
666 90 CONTINUE
667 100 CONTINUE
668
669 ELSE
670
671
672
673 jkl = 0
674 DO 130 jku = 1, uub
675
676
677
678
679
680
681 iendch =
min( m, n+jkl ) - 1
682 DO 120 jc =
min( m+jku, n ) - 1, 1 - jkl, -1
683 extra = czero
684 angle = twopi*
dlarnd( 1, iseed )
685 c = cos( angle )*
zlarnd( 5, iseed )
686 s = sin( angle )*
zlarnd( 5, iseed )
687 irow =
max( 1, jc-jku+1 )
688 IF( jc.GT.0 ) THEN
689 il =
min( m, jc+jkl+1 ) + 1 - irow
690 CALL zlarot( .false., .false., jc+jkl.LT.m, il,
691 $ c, s, a( irow-iskew*jc+ioffst,
692 $ jc ), ilda, dummy, extra )
693 END IF
694
695
696
697 ic = jc
698 DO 110 jch = jc + jkl, iendch, jkl + jku
699 ilextr = ic.GT.0
700 IF( ilextr ) THEN
701 CALL zlartg( a( jch-iskew*ic+ioffst, ic ),
702 $ extra, realc, s, dummy )
703 dummy =
zlarnd( 5, iseed )
704 c = realc*dummy
705 s = s*dummy
706 END IF
708 icol =
min( n-1, jch+jku )
709 iltemp = jch + jku.LT.n
710 ctemp = czero
711 CALL zlarot( .true., ilextr, iltemp, icol+2-ic,
712 $ c, s, a( jch-iskew*ic+ioffst, ic ),
713 $ ilda, extra, ctemp )
714 IF( iltemp ) THEN
715 CALL zlartg( a( jch-iskew*icol+ioffst,
716 $ icol ), ctemp, realc, s, dummy )
717 dummy =
zlarnd( 5, iseed )
718 c = realc*dummy
719 s = s*dummy
720 il =
min( iendch, jch+jkl+jku ) + 2 - jch
721 extra = czero
722 CALL zlarot( .false., .true.,
723 $ jch+jkl+jku.LE.iendch, il, c, s,
724 $ a( jch-iskew*icol+ioffst,
725 $ icol ), ilda, ctemp, extra )
726 ic = icol
727 END IF
728 110 CONTINUE
729 120 CONTINUE
730 130 CONTINUE
731
732 jku = uub
733 DO 160 jkl = 1, llb
734
735
736
737
738
739
740 iendch =
min( n, m+jku ) - 1
741 DO 150 jr =
min( n+jkl, m ) - 1, 1 - jku, -1
742 extra = czero
743 angle = twopi*
dlarnd( 1, iseed )
744 c = cos( angle )*
zlarnd( 5, iseed )
745 s = sin( angle )*
zlarnd( 5, iseed )
746 icol =
max( 1, jr-jkl+1 )
747 IF( jr.GT.0 ) THEN
748 il =
min( n, jr+jku+1 ) + 1 - icol
749 CALL zlarot( .true., .false., jr+jku.LT.n, il,
750 $ c, s, a( jr-iskew*icol+ioffst,
751 $ icol ), ilda, dummy, extra )
752 END IF
753
754
755
756 ir = jr
757 DO 140 jch = jr + jku, iendch, jkl + jku
758 ilextr = ir.GT.0
759 IF( ilextr ) THEN
760 CALL zlartg( a( ir-iskew*jch+ioffst, jch ),
761 $ extra, realc, s, dummy )
762 dummy =
zlarnd( 5, iseed )
763 c = realc*dummy
764 s = s*dummy
765 END IF
767 irow =
min( m-1, jch+jkl )
768 iltemp = jch + jkl.LT.m
769 ctemp = czero
770 CALL zlarot( .false., ilextr, iltemp, irow+2-ir,
771 $ c, s, a( ir-iskew*jch+ioffst,
772 $ jch ), ilda, extra, ctemp )
773 IF( iltemp ) THEN
774 CALL zlartg( a( irow-iskew*jch+ioffst, jch ),
775 $ ctemp, realc, s, dummy )
776 dummy =
zlarnd( 5, iseed )
777 c = realc*dummy
778 s = s*dummy
779 il =
min( iendch, jch+jkl+jku ) + 2 - jch
780 extra = czero
781 CALL zlarot( .true., .true.,
782 $ jch+jkl+jku.LE.iendch, il, c, s,
783 $ a( irow-iskew*jch+ioffst, jch ),
784 $ ilda, ctemp, extra )
785 ir = irow
786 END IF
787 140 CONTINUE
788 150 CONTINUE
789 160 CONTINUE
790
791 END IF
792
793 ELSE
794
795
796
797
798 ipackg = ipack
799 ioffg = ioffst
800
801 IF( topdwn ) THEN
802
803
804
805 IF( ipack.GE.5 ) THEN
806 ipackg = 6
807 ioffg = uub + 1
808 ELSE
809 ipackg = 1
810 END IF
811
812 DO 170 j = 1, mnmin
813 a( ( 1-iskew )*j+ioffg, j ) = dcmplx( d( j ) )
814 170 CONTINUE
815
816 DO 200 k = 1, uub
817 DO 190 jc = 1, n - 1
818 irow =
max( 1, jc-k )
819 il =
min( jc+1, k+2 )
820 extra = czero
821 ctemp = a( jc-iskew*( jc+1 )+ioffg, jc+1 )
822 angle = twopi*
dlarnd( 1, iseed )
823 c = cos( angle )*
zlarnd( 5, iseed )
824 s = sin( angle )*
zlarnd( 5, iseed )
825 IF( zsym ) THEN
826 ct = c
827 st = s
828 ELSE
829 ctemp = dconjg( ctemp )
830 ct = dconjg( c )
831 st = dconjg( s )
832 END IF
833 CALL zlarot( .false., jc.GT.k, .true., il, c, s,
834 $ a( irow-iskew*jc+ioffg, jc ), ilda,
835 $ extra, ctemp )
836 CALL zlarot( .true., .true., .false.,
837 $
min( k, n-jc )+1, ct, st,
838 $ a( ( 1-iskew )*jc+ioffg, jc ), ilda,
839 $ ctemp, dummy )
840
841
842
843 icol = jc
844 DO 180 jch = jc - k, 1, -k
845 CALL zlartg( a( jch+1-iskew*( icol+1 )+ioffg,
846 $ icol+1 ), extra, realc, s, dummy )
847 dummy =
zlarnd( 5, iseed )
848 c = dconjg( realc*dummy )
849 s = dconjg( -s*dummy )
850 ctemp = a( jch-iskew*( jch+1 )+ioffg, jch+1 )
851 IF( zsym ) THEN
852 ct = c
853 st = s
854 ELSE
855 ctemp = dconjg( ctemp )
856 ct = dconjg( c )
857 st = dconjg( s )
858 END IF
859 CALL zlarot( .true., .true., .true., k+2, c, s,
860 $ a( ( 1-iskew )*jch+ioffg, jch ),
861 $ ilda, ctemp, extra )
862 irow =
max( 1, jch-k )
863 il =
min( jch+1, k+2 )
864 extra = czero
865 CALL zlarot( .false., jch.GT.k, .true., il, ct,
866 $ st, a( irow-iskew*jch+ioffg, jch ),
867 $ ilda, extra, ctemp )
868 icol = jch
869 180 CONTINUE
870 190 CONTINUE
871 200 CONTINUE
872
873
874
875
876 IF( ipack.NE.ipackg .AND. ipack.NE.3 ) THEN
877 DO 230 jc = 1, n
878 irow = ioffst - iskew*jc
879 IF( zsym ) THEN
880 DO 210 jr = jc,
min( n, jc+uub )
881 a( jr+irow, jc ) = a( jc-iskew*jr+ioffg, jr )
882 210 CONTINUE
883 ELSE
884 DO 220 jr = jc,
min( n, jc+uub )
885 a( jr+irow, jc ) = dconjg( a( jc-iskew*jr+
886 $ ioffg, jr ) )
887 220 CONTINUE
888 END IF
889 230 CONTINUE
890 IF( ipack.EQ.5 ) THEN
891 DO 250 jc = n - uub + 1, n
892 DO 240 jr = n + 2 - jc, uub + 1
893 a( jr, jc ) = czero
894 240 CONTINUE
895 250 CONTINUE
896 END IF
897 IF( ipackg.EQ.6 ) THEN
898 ipackg = ipack
899 ELSE
900 ipackg = 0
901 END IF
902 END IF
903 ELSE
904
905
906
907 IF( ipack.GE.5 ) THEN
908 ipackg = 5
909 IF( ipack.EQ.6 )
910 $ ioffg = 1
911 ELSE
912 ipackg = 2
913 END IF
914
915 DO 260 j = 1, mnmin
916 a( ( 1-iskew )*j+ioffg, j ) = dcmplx( d( j ) )
917 260 CONTINUE
918
919 DO 290 k = 1, uub
920 DO 280 jc = n - 1, 1, -1
921 il =
min( n+1-jc, k+2 )
922 extra = czero
923 ctemp = a( 1+( 1-iskew )*jc+ioffg, jc )
924 angle = twopi*
dlarnd( 1, iseed )
925 c = cos( angle )*
zlarnd( 5, iseed )
926 s = sin( angle )*
zlarnd( 5, iseed )
927 IF( zsym ) THEN
928 ct = c
929 st = s
930 ELSE
931 ctemp = dconjg( ctemp )
932 ct = dconjg( c )
933 st = dconjg( s )
934 END IF
935 CALL zlarot( .false., .true., n-jc.GT.k, il, c, s,
936 $ a( ( 1-iskew )*jc+ioffg, jc ), ilda,
937 $ ctemp, extra )
938 icol =
max( 1, jc-k+1 )
939 CALL zlarot( .true., .false., .true., jc+2-icol,
940 $ ct, st, a( jc-iskew*icol+ioffg,
941 $ icol ), ilda, dummy, ctemp )
942
943
944
945 icol = jc
946 DO 270 jch = jc + k, n - 1, k
947 CALL zlartg( a( jch-iskew*icol+ioffg, icol ),
948 $ extra, realc, s, dummy )
949 dummy =
zlarnd( 5, iseed )
950 c = realc*dummy
951 s = s*dummy
952 ctemp = a( 1+( 1-iskew )*jch+ioffg, jch )
953 IF( zsym ) THEN
954 ct = c
955 st = s
956 ELSE
957 ctemp = dconjg( ctemp )
958 ct = dconjg( c )
959 st = dconjg( s )
960 END IF
961 CALL zlarot( .true., .true., .true., k+2, c, s,
962 $ a( jch-iskew*icol+ioffg, icol ),
963 $ ilda, extra, ctemp )
964 il =
min( n+1-jch, k+2 )
965 extra = czero
966 CALL zlarot( .false., .true., n-jch.GT.k, il,
967 $ ct, st, a( ( 1-iskew )*jch+ioffg,
968 $ jch ), ilda, ctemp, extra )
969 icol = jch
970 270 CONTINUE
971 280 CONTINUE
972 290 CONTINUE
973
974
975
976
977 IF( ipack.NE.ipackg .AND. ipack.NE.4 ) THEN
978 DO 320 jc = n, 1, -1
979 irow = ioffst - iskew*jc
980 IF( zsym ) THEN
981 DO 300 jr = jc,
max( 1, jc-uub ), -1
982 a( jr+irow, jc ) = a( jc-iskew*jr+ioffg, jr )
983 300 CONTINUE
984 ELSE
985 DO 310 jr = jc,
max( 1, jc-uub ), -1
986 a( jr+irow, jc ) = dconjg( a( jc-iskew*jr+
987 $ ioffg, jr ) )
988 310 CONTINUE
989 END IF
990 320 CONTINUE
991 IF( ipack.EQ.6 ) THEN
992 DO 340 jc = 1, uub
993 DO 330 jr = 1, uub + 1 - jc
994 a( jr, jc ) = czero
995 330 CONTINUE
996 340 CONTINUE
997 END IF
998 IF( ipackg.EQ.5 ) THEN
999 ipackg = ipack
1000 ELSE
1001 ipackg = 0
1002 END IF
1003 END IF
1004 END IF
1005
1006
1007
1008 IF( .NOT.zsym ) THEN
1009 DO 350 jc = 1, n
1010 irow = ioffst + ( 1-iskew )*jc
1011 a( irow, jc ) = dcmplx( dble( a( irow, jc ) ) )
1012 350 CONTINUE
1013 END IF
1014
1015 END IF
1016
1017 ELSE
1018
1019
1020
1021
1022
1023
1024
1025
1026 IF( isym.EQ.1 ) THEN
1027
1028
1029
1030 CALL zlagge( mr, nc, llb, uub, d, a, lda, iseed, work,
1031 $ iinfo )
1032 ELSE
1033
1034
1035
1036
1037 IF( zsym ) THEN
1038 CALL zlagsy( m, llb, d, a, lda, iseed, work, iinfo )
1039 ELSE
1040 CALL zlaghe( m, llb, d, a, lda, iseed, work, iinfo )
1041 END IF
1042 END IF
1043
1044 IF( iinfo.NE.0 ) THEN
1045 info = 3
1046 RETURN
1047 END IF
1048 END IF
1049
1050
1051
1052 IF( ipack.NE.ipackg ) THEN
1053 IF( ipack.EQ.1 ) THEN
1054
1055
1056
1057 DO 370 j = 1, m
1058 DO 360 i = j + 1, m
1059 a( i, j ) = czero
1060 360 CONTINUE
1061 370 CONTINUE
1062
1063 ELSE IF( ipack.EQ.2 ) THEN
1064
1065
1066
1067 DO 390 j = 2, m
1068 DO 380 i = 1, j - 1
1069 a( i, j ) = czero
1070 380 CONTINUE
1071 390 CONTINUE
1072
1073 ELSE IF( ipack.EQ.3 ) THEN
1074
1075
1076
1077 icol = 1
1078 irow = 0
1079 DO 410 j = 1, m
1080 DO 400 i = 1, j
1081 irow = irow + 1
1082 IF( irow.GT.lda ) THEN
1083 irow = 1
1084 icol = icol + 1
1085 END IF
1086 a( irow, icol ) = a( i, j )
1087 400 CONTINUE
1088 410 CONTINUE
1089
1090 ELSE IF( ipack.EQ.4 ) THEN
1091
1092
1093
1094 icol = 1
1095 irow = 0
1096 DO 430 j = 1, m
1097 DO 420 i = j, m
1098 irow = irow + 1
1099 IF( irow.GT.lda ) THEN
1100 irow = 1
1101 icol = icol + 1
1102 END IF
1103 a( irow, icol ) = a( i, j )
1104 420 CONTINUE
1105 430 CONTINUE
1106
1107 ELSE IF( ipack.GE.5 ) THEN
1108
1109
1110
1111
1112
1113 IF( ipack.EQ.5 )
1114 $ uub = 0
1115 IF( ipack.EQ.6 )
1116 $ llb = 0
1117
1118 DO 450 j = 1, uub
1119 DO 440 i =
min( j+llb, m ), 1, -1
1120 a( i-j+uub+1, j ) = a( i, j )
1121 440 CONTINUE
1122 450 CONTINUE
1123
1124 DO 470 j = uub + 2, n
1125 DO 460 i = j - uub,
min( j+llb, m )
1126 a( i-j+uub+1, j ) = a( i, j )
1127 460 CONTINUE
1128 470 CONTINUE
1129 END IF
1130
1131
1132
1133
1134
1135
1136 IF( ipack.EQ.3 .OR. ipack.EQ.4 ) THEN
1137 DO 490 jc = icol, m
1138 DO 480 jr = irow + 1, lda
1139 a( jr, jc ) = czero
1140 480 CONTINUE
1141 irow = 0
1142 490 CONTINUE
1143
1144 ELSE IF( ipack.GE.5 ) THEN
1145
1146
1147
1148
1149
1150
1151
1152 ir1 = uub + llb + 2
1153 ir2 = uub + m + 2
1154 DO 520 jc = 1, n
1155 DO 500 jr = 1, uub + 1 - jc
1156 a( jr, jc ) = czero
1157 500 CONTINUE
1158 DO 510 jr =
max( 1,
min( ir1, ir2-jc ) ), lda
1159 a( jr, jc ) = czero
1160 510 CONTINUE
1161 520 CONTINUE
1162 END IF
1163 END IF
1164
1165 RETURN
1166
1167
1168
subroutine dlatm1(mode, cond, irsign, idist, iseed, d, n, info)
subroutine zlagge(m, n, kl, ku, d, a, lda, iseed, work, info)
subroutine zlaghe(n, k, d, a, lda, iseed, work, info)
subroutine zlagsy(n, k, d, a, lda, iseed, work, info)
subroutine zlarot(lrows, lleft, lright, nl, c, s, a, lda, xleft, xright)