4
5
6
7
8
9
10
11
12
13 IMPLICIT NONE
14
15
16 INTEGER IHI, IHIZ, ILO, ILOZ, INFO, LIWORK, LWORK, N,
17 $ RECLEVEL
18 LOGICAL WANTT, WANTZ
19
20
21 INTEGER DESCH( * ), DESCZ( * ), IWORK( * )
22 DOUBLE PRECISION H( * ), WI( N ), WORK( * ), WR( N ),
23 $ Z( * )
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 INTEGER BLOCK_CYCLIC_2D, CSRC_, CTXT_, DLEN_, DTYPE_,
247 $ LLD_, MB_, M_, NB_, N_, RSRC_
248 INTEGER RECMAX
249 parameter( block_cyclic_2d = 1, dlen_ = 9, dtype_ = 1,
250 $ ctxt_ = 2, m_ = 3, n_ = 4, mb_ = 5, nb_ = 6,
251 $ rsrc_ = 7, csrc_ = 8, lld_ = 9, recmax = 3 )
252 INTEGER NTINY
253 parameter( ntiny = 11 )
254 INTEGER KEXNW, KEXSH
255 parameter( kexnw = 5, kexsh = 6 )
256 DOUBLE PRECISION WILK1, WILK2
257 parameter( wilk1 = 0.75d0, wilk2 = -0.4375d0 )
258 DOUBLE PRECISION ZERO, ONE
259 parameter( zero = 0.0d0, one = 1.0d0 )
260
261
262 DOUBLE PRECISION AA, BB, CC, CS, DD, SN, SS, SWAP, ELEM, T0,
263 $ ELEM1, ELEM2, ELEM3, ALPHA, SDSUM, STAMP
264 INTEGER I, J, INF, IT, ITMAX, K, KACC22, KBOT, KDU, KS,
265 $ KT, KTOP, KU, KV, KWH, KWTOP, KWV, LD, LS,
266 $ LWKOPT, NDFL, NH, NHO, NIBBLE, NMIN, NS, NSMAX,
267 $ NSR, NVE, NW, NWMAX, NWR, LLDH, LLDZ, II, JJ,
268 $ ICTXT, NPROW, NPCOL, MYROW, MYCOL, IPV, IPT,
269 $ IPW, IPWRK, VROWS, VCOLS, TROWS, TCOLS, WROWS,
270 $ WCOLS, HRSRC, HCSRC, NB, IS, IE, NPROCS, KK,
271 $ IROFFH, ICOFFH, HRSRC3, HCSRC3, NWIN, TOTIT,
272 $ SWEEP, JW, TOTNS, LIWKOPT, NPMIN, ICTXT_NEW,
273 $ MYROW_NEW, MYCOL_NEW
274 LOGICAL NWINC, SORTED, LQUERY, RECURSION
275 CHARACTER JBCMPZ*2
276
277
278 INTEGER PILAENVX, NUMROC, INDXG2P, ICEIL, BLACS_PNUM
280
281
282 INTEGER DESCV( DLEN_ ), DESCT( DLEN_ ), DESCW( DLEN_ ),
283 $ PMAP( 64*64 )
284 DOUBLE PRECISION ZDUM( 1, 1 )
285
286
288 $
pdelget, dlaqr0, dlaset, pdgemr2d
289
290
291 INTRINSIC abs, dble, int,
max,
min, mod
292
293
294 info = 0
295 ictxt = desch( ctxt_ )
296 CALL blacs_gridinfo( ictxt, nprow, npcol, myrow, mycol )
297 nprocs = nprow*npcol
298 recursion = reclevel .LT. recmax
299
300
301
302 IF( n.EQ.0 ) THEN
303 work( 1 ) = one
304 iwork( 1 ) = 1
305 RETURN
306 END IF
307
308
309
310 IF( wantt ) THEN
311 jbcmpz( 1: 1 ) = 'S'
312 ELSE
313 jbcmpz( 1: 1 ) = 'E'
314 END IF
315 IF( wantz ) THEN
316 jbcmpz( 2: 2 ) = 'V'
317 ELSE
318 jbcmpz( 2: 2 ) = 'N'
319 END IF
320
321
322
323 lquery = lwork.EQ.-1 .OR. liwork.EQ.-1
324
325
326
327
328 lldh = desch( lld_ )
329 lldz = descz( lld_ )
330 nb = desch( mb_ )
331
332
333
334 IF( n.LE.ntiny ) THEN
335
336
337
338 CALL pdlaqr1( wantt, wantz, n, ilo, ihi, h, desch, wr, wi,
339 $ iloz, ihiz, z, descz, work, lwork, iwork, liwork, info )
340 lwkopt = int( work(1) )
341 liwkopt = iwork(1)
342
343
344
345 ELSEIF( n.LE.nb ) THEN
346 IF( myrow.EQ.desch(rsrc_) .AND. mycol.EQ.desch(csrc_) ) THEN
347 CALL dlaqr0( wantt, wantz, n, ilo, ihi, h, desch(lld_),
348 $ wr, wi, iloz, ihiz, z, descz(lld_), work, lwork, info )
349 IF( n.GT.2 )
350 $ CALL dlaset( 'L', n-2, n-2, zero, zero, h(3),
351 $ desch(lld_) )
352 lwkopt = int( work(1) )
353 liwkopt = 1
354 ELSE
355 lwkopt = 1
356 liwkopt = 1
357 END IF
358
359
360
361 ELSE
362
363
364
365 totit = 0
366 sweep = 0
367 totns = 0
368
369
370
371
372
373
374 info = 0
375
376
377
378
379
380
381
382 nwr =
pilaenvx( ictxt, 13,
'PDLAQR0', jbcmpz, n, ilo, ihi,
383 $ lwork )
385 nwr =
min( ihi-ilo+1, nwr )
386 nw = nwr
387
388
389
390
391
392
393 nwin =
pilaenvx( ictxt, 19,
'PDLAQR0', jbcmpz, n, nb, nb, nb )
394 nsr =
pilaenvx( ictxt, 15,
'PDLAQR0', jbcmpz, n, ilo, ihi,
396 nsr =
min( nsr, ihi-ilo )
397 nsr =
max( 2, nsr-mod( nsr, 2 ) )
398
399
400
402
403
404
405 CALL pdlaqr3( wantt, wantz, n, ilo, ihi, nwr+1, h,
406 $ desch, iloz, ihiz, z, descz, ls, ld, wr, wi, h,
407 $ desch, n, h, desch, n, h, desch, work, -1, iwork,
408 $ liwork, reclevel )
409 lwkopt = lwkopt + int( work( 1 ) )
410 liwkopt = iwork( 1 )
411
412
413
414 CALL pdlaqr5( wantt, wantz, 2, n, 1, n, n, wr, wi, h,
415 $ desch, iloz, ihiz, z, descz, work, -1, iwork,
416 $ liwork )
417
418
419
420 lwkopt =
max( lwkopt, int( work( 1 ) ) )
421 liwkopt =
max( liwkopt, iwork( 1 ) )
422
423
424
425 IF( lquery ) THEN
426 work( 1 ) = dble( lwkopt )
427 iwork( 1 ) = liwkopt
428 RETURN
429 END IF
430
431
432
433 nmin =
pilaenvx( ictxt, 12,
'PDLAQR0', jbcmpz, n, ilo, ihi,
434 $ lwork )
435 nmin =
max( ntiny, nmin )
436
437
438
439 nibble =
pilaenvx( ictxt, 14,
'PDLAQR0', jbcmpz, n, ilo, ihi,
440 $ lwork )
441 nibble =
max( 0, nibble )
442
443
444
445
446 kacc22 =
pilaenvx( ictxt, 16,
'PDLAQR0', jbcmpz, n, ilo, ihi,
447 $ lwork )
448 kacc22 =
max( 1, kacc22 )
449 kacc22 =
min( 2, kacc22 )
450
451
452
453
454 nwmax =
min( ( n-1 ) / 3, lwork / 2 )
455
456
457
458
459 nsmax =
min( ( n+6 ) / 9, lwork - lwork/3 )
460 nsmax = nsmax - mod( nsmax, 2 )
461
462
463
464 ndfl = 1
465
466
467
468 itmax =
max( 30, 2*kexsh )*
max( 10, ( ihi-ilo+1 ) )
469
470
471
472 kbot = ihi
473
474
475
476 DO 110 it = 1, itmax
477 totit = totit + 1
478
479
480
481 IF( kbot.LT.ilo )
482 $ GO TO 120
483
484
485
486 DO 10 k = kbot, ilo + 1, -1
487 CALL infog2l( k, k-1, desch, nprow, npcol, myrow, mycol,
488 $ ii, jj, hrsrc, hcsrc )
489 IF( myrow.EQ.hrsrc .AND. mycol.EQ.hcsrc ) THEN
490 IF( h( ii + (jj-1)*lldh ).EQ.zero )
491 $ GO TO 20
492 END IF
493 10 CONTINUE
494 k = ilo
495 20 CONTINUE
496 ktop = k
497 IF( nprocs.GT.1 )
498 $ CALL igamx2d( ictxt, 'All', '1-Tree', 1, 1, ktop, 1,
499 $ -1, -1, -1, -1, -1 )
500
501
502
503 nh = kbot - ktop + 1
504 IF( nh.LE.ntiny ) THEN
505 nw = nh
506 ELSEIF( ndfl.LT.kexnw .OR. nh.LT.nw ) THEN
507
508
509
510
511
512
513
514 nwinc = .true.
515 IF( nh.LE.
min( nmin, nwmax ) )
THEN
516 nw = nh
517 ELSE
518 nw =
min( nwr, nh, nwmax )
519 IF( nw.LT.nwmax ) THEN
520 IF( nw.GE.nh-1 ) THEN
521 nw = nh
522 ELSE
523 kwtop = kbot - nw + 1
524 CALL pdelget(
'All',
'1-Tree', elem1, h, kwtop,
525 $ kwtop-1, desch )
526 CALL pdelget(
'All',
'1-Tree', elem2, h,
527 $ kwtop-1, kwtop-2, desch )
528 IF( abs( elem1 ).GT.abs( elem2 ) ) nw = nw + 1
529 END IF
530 END IF
531 END IF
532 ELSE
533
534
535
536
537
538
539
540
541
542 IF( nwinc .AND. nw.LT.
min( nwmax, nh ) )
THEN
543 nw =
min( nwmax, nh, 2*nw )
544 ELSE
545 nwinc = .false.
546 IF( nw.EQ.nh .AND. nh.GT.2 )
547 $ nw = nh - 1
548 END IF
549 END IF
550
551
552
553
554
555
556
557
558
559
560 kv = n - nw + 1
561 kt = nw + 1
562 nho = ( n-nw-1 ) - kt + 1
563 kwv = nw + 2
564 nve = ( n-nw ) - kwv + 1
565
566 jw =
min( nw, kbot-ktop+1 )
567 kwtop = kbot - jw + 1
568 iroffh = mod( kwtop - 1, nb )
569 icoffh = iroffh
570 hrsrc =
indxg2p( kwtop, nb, myrow, desch(rsrc_), nprow )
571 hcsrc =
indxg2p( kwtop, nb, mycol, desch(csrc_), npcol )
572 vrows =
numroc( jw+iroffh, nb, myrow, hrsrc, nprow )
573 vcols =
numroc( jw+icoffh, nb, mycol, hcsrc, npcol )
574 CALL descinit( descv, jw+iroffh, jw+icoffh, nb, nb,
575 $ hrsrc, hcsrc, ictxt,
max(1, vrows), info )
576
577 trows =
numroc( jw+iroffh, nb, myrow, hrsrc, nprow )
578 tcols =
numroc( jw+icoffh, nb, mycol, hcsrc, npcol )
579 CALL descinit( desct, jw+iroffh, jw+icoffh, nb, nb,
580 $ hrsrc, hcsrc, ictxt,
max(1, trows), info )
581 wrows =
numroc( jw+iroffh, nb, myrow, hrsrc, nprow )
582 wcols =
numroc( jw+icoffh, nb, mycol, hcsrc, npcol )
583 CALL descinit( descw, jw+iroffh, jw+icoffh, nb, nb,
584 $ hrsrc, hcsrc, ictxt,
max(1, wrows), info )
585
586 ipv = 1
587 ipt = ipv + descv( lld_ ) * vcols
588 ipw = ipt + desct( lld_ ) * tcols
589 ipwrk = ipw + descw( lld_ ) * wcols
590
591
592
593 iwork(1) = it
594 CALL pdlaqr3( wantt, wantz, n, ktop, kbot, nw, h,
595 $ desch, iloz, ihiz, z, descz, ls, ld, wr, wi,
596 $ work(ipv), descv, nho, work(ipt), desct, nve,
597 $ work(ipw), descw, work(ipwrk), lwork-ipwrk+1,
598 $ iwork, liwork, reclevel )
599
600
601
602 kbot = kbot - ld
603
604
605
606 ks = kbot - ls + 1
607
608
609
610
611
612
613
614 IF( ( ld.EQ.0 ) .OR. ( ( 100*ld.LE.nw*nibble ) .AND. ( kbot-
615 $ ktop+1.GT.
min( nmin, nwmax ) ) ) )
THEN
616
617
618
619
620
621 ns =
min( nsmax, nsr,
max( 2, kbot-ktop ) )
622 ns = ns - mod( ns, 2 )
623
624
625
626
627
628
629
630
631 IF( mod( ndfl, kexsh ).EQ.0 ) THEN
632 ks = kbot - ns + 1
633 DO 30 i = kbot,
max( ks+1, ktop+2 ), -2
634 CALL pdelget(
'All',
'1-Tree', elem1, h, i, i-1,
635 $ desch )
636 CALL pdelget(
'All',
'1-Tree', elem2, h, i-1, i-2,
637 $ desch )
638 CALL pdelget(
'All',
'1-Tree', elem3, h, i, i,
639 $ desch )
640 ss = abs( elem1 ) + abs( elem2 )
641 aa = wilk1*ss + elem3
642 bb = ss
643 cc = wilk2*ss
644 dd = aa
645 CALL dlanv2( aa, bb, cc, dd, wr( i-1 ), wi( i-1 ),
646 $ wr( i ), wi( i ), cs, sn )
647 30 CONTINUE
648 IF( ks.EQ.ktop ) THEN
649 CALL pdelget(
'All',
'1-Tree', elem1, h, ks+1,
650 $ ks+1, desch )
651 wr( ks+1 ) = elem1
652 wi( ks+1 ) = zero
653 wr( ks ) = wr( ks+1 )
654 wi( ks ) = wi( ks+1 )
655 END IF
656 ELSE
657
658
659
660
661
662 IF( kbot-ks+1.LE.ns / 2 ) THEN
663 ks = kbot - ns + 1
664 kt = n - ns + 1
665 npmin =
pilaenvx( ictxt, 23,
'PDLAQR0',
'EN', ns,
666 $ nb, nprow, npcol )
667
668
669
670 npmin =
min(npmin, 8)
671 IF(
min(nprow, npcol).LE.npmin+1 .OR.
672 $ reclevel.GE.1 ) THEN
673
674
675
676
677 iroffh = mod( ks - 1, nb )
678 icoffh = iroffh
679 IF( ns.GT.nmin ) THEN
680 hrsrc =
indxg2p( ks, nb, myrow, desch(rsrc_),
681 $ nprow )
682 hcsrc =
indxg2p( ks, nb, myrow, desch(csrc_),
683 $ npcol )
684 ELSE
685 hrsrc = 0
686 hcsrc = 0
687 END IF
688 trows =
numroc( ns+iroffh, nb, myrow, hrsrc,
689 $ nprow )
690 tcols =
numroc( ns+icoffh, nb, mycol, hcsrc,
691 $ npcol )
692 CALL descinit( desct, ns+iroffh, ns+icoffh, nb,
693 $ nb, hrsrc, hcsrc, ictxt,
max(1, trows),
694 $ info )
695 ipt = 1
696 ipwrk = ipt + desct(lld_) * tcols
697
698 IF( ns.GT.nmin .AND. recursion ) THEN
699 CALL pdlacpy(
'All', ns, ns, h, ks, ks,
700 $ desch, work(ipt), 1+iroffh, 1+icoffh,
701 $ desct )
702 CALL pdlaqr0( .false., .false., iroffh+ns,
703 $ 1+iroffh, iroffh+ns, work(ipt),
704 $ desct, wr( ks-iroffh ),
705 $ wi( ks-iroffh ), 1, 1, zdum,
706 $ descz, work( ipwrk ),
707 $ lwork-ipwrk+1, iwork, liwork,
708 $ inf, reclevel+1 )
709 ELSE
710 CALL pdlamve(
'All', ns, ns, h, ks, ks,
711 $ desch, work(ipt), 1+iroffh, 1+icoffh,
712 $ desct, work(ipwrk) )
713 CALL pdlaqr1( .false., .false., iroffh+ns,
714 $ 1+iroffh, iroffh+ns, work(ipt),
715 $ desct, wr( ks-iroffh ),
716 $ wi( ks-iroffh ), 1+iroffh, iroffh+ns,
717 $ zdum, descz, work( ipwrk ),
718 $ lwork-ipwrk+1, iwork, liwork, inf )
719 END IF
720 ELSE
721
722
723
724
725
726 ictxt_new = ictxt
727 DO 50 i = 0, npmin-1
728 DO 40 j = 0, npmin-1
729 pmap( j+1+i*npmin ) =
730 $ blacs_pnum( ictxt, i, j )
731 40 CONTINUE
732 50 CONTINUE
733 CALL blacs_gridmap( ictxt_new, pmap, npmin,
734 $ npmin, npmin )
735 CALL blacs_gridinfo( ictxt_new, npmin, npmin,
736 $ myrow_new, mycol_new )
737 IF( myrow.GE.npmin .OR. mycol.GE.npmin )
738 $ ictxt_new = -1
739
740 IF( ictxt_new.GE.0 ) THEN
741 trows =
numroc( ns, nb, myrow_new, 0, npmin )
742 tcols =
numroc( ns, nb, mycol_new, 0, npmin )
743 CALL descinit( desct, ns, ns, nb, nb, 0, 0,
744 $ ictxt_new,
max(1,trows), info )
745 ipt = 1
746 ipwrk = ipt + desct(lld_) * tcols
747 ELSE
748 ipt = 1
749 ipwrk = 2
750 desct( ctxt_ ) = -1
751 inf = 0
752 END IF
753 CALL pdgemr2d( ns, ns, h, ks, ks, desch,
754 $ work(ipt), 1, 1, desct, ictxt )
755
756
757
758
759
760
761
762 IF( ictxt_new.GE.0 ) THEN
763
764
765
766
767
768
769
770 CALL pdlaqr1( .false., .false., ns, 1,
771 $ ns, work(ipt), desct, wr( ks ),
772 $ wi( ks ), 1, ns, zdum, desct,
773 $ work( ipwrk ), lwork-ipwrk+1, iwork,
774 $ liwork, inf )
775
776 CALL blacs_gridexit( ictxt_new )
777 END IF
778 IF( myrow+mycol.GT.0 ) THEN
779 DO 60 j = 0, ns-1
780 wr( ks+j ) = zero
781 wi( ks+j ) = zero
782 60 CONTINUE
783 END IF
784 CALL igamn2d( ictxt, 'All', '1-Tree', 1, 1, inf,
785 $ 1, -1, -1, -1, -1, -1 )
786 CALL dgsum2d( ictxt, 'All', ' ', ns, 1, wr(ks),
787 $ ns, -1, -1 )
788 CALL dgsum2d( ictxt, 'All', ' ', ns, 1, wi(ks),
789 $ ns, -1, -1 )
790 END IF
791 ks = ks + inf
792
793
794
795
796
797 IF( ks.GE.kbot ) THEN
798 CALL pdelget(
'All',
'1-Tree', aa, h, kbot-1,
799 $ kbot-1, desch )
800 CALL pdelget(
'All',
'1-Tree', cc, h, kbot,
801 $ kbot-1, desch )
802 CALL pdelget(
'All',
'1-Tree', bb, h, kbot-1,
803 $ kbot, desch )
804 CALL pdelget(
'All',
'1-Tree', dd, h, kbot,
805 $ kbot, desch )
806 CALL dlanv2( aa, bb, cc, dd, wr( kbot-1 ),
807 $ wi( kbot-1 ), wr( kbot ),
808 $ wi( kbot ), cs, sn )
809 ks = kbot - 1
810 END IF
811 END IF
812
813 IF( kbot-ks+1.GT.ns ) THEN
814
815
816
817
818
819 sorted = .false.
820 DO 80 k = kbot, ks + 1, -1
821 IF( sorted )
822 $ GO TO 90
823 sorted = .true.
824 DO 70 i = ks, k - 1
825 IF( abs( wr( i ) )+abs( wi( i ) ).LT.
826 $ abs( wr( i+1 ) )+abs( wi( i+1 ) ) ) THEN
827 sorted = .false.
828
829 swap = wr( i )
830 wr( i ) = wr( i+1 )
831 wr( i+1 ) = swap
832
833 swap = wi( i )
834 wi( i ) = wi( i+1 )
835 wi( i+1 ) = swap
836 END IF
837 70 CONTINUE
838 80 CONTINUE
839 90 CONTINUE
840 END IF
841
842
843
844
845
846
847
848 DO 100 i = kbot, ks + 2, -2
849 IF( wi( i ).NE.-wi( i-1 ) ) THEN
850
851 swap = wr( i )
852 wr( i ) = wr( i-1 )
853 wr( i-1 ) = wr( i-2 )
854 wr( i-2 ) = swap
855
856 swap = wi( i )
857 wi( i ) = wi( i-1 )
858 wi( i-1 ) = wi( i-2 )
859 wi( i-2 ) = swap
860 END IF
861 100 CONTINUE
862 END IF
863
864
865
866
867 IF( kbot-ks+1.EQ.2 ) THEN
868 IF( wi( kbot ).EQ.zero ) THEN
869 CALL pdelget(
'All',
'1-Tree', elem, h, kbot,
870 $ kbot, desch )
871 IF( abs( wr( kbot )-elem ).LT.
872 $ abs( wr( kbot-1 )-elem ) ) THEN
873 wr( kbot-1 ) = wr( kbot )
874 ELSE
875 wr( kbot ) = wr( kbot-1 )
876 END IF
877 END IF
878 END IF
879
880
881
882
883
884
885 ns =
min( ns, kbot-ks+1 )
886 ns = ns - mod( ns, 2 )
887 ks = kbot - ns + 1
888
889
890
891 totns = totns + ns
892 sweep = sweep + 1
893 CALL pdlaqr5( wantt, wantz, kacc22, n, ktop, kbot,
894 $ ns, wr( ks ), wi( ks ), h, desch, iloz, ihiz, z,
895 $ descz, work, lwork, iwork, liwork )
896 END IF
897
898
899
900 IF( ld.GT.0 ) THEN
901 ndfl = 1
902 ELSE
903 ndfl = ndfl + 1
904 END IF
905
906
907 110 CONTINUE
908
909
910
911
912 info = kbot
913 120 CONTINUE
914 END IF
915
916
917
918 work( 1 ) = dble( lwkopt )
919 iwork( 1 ) = liwkopt
920 IF( .NOT. lquery ) THEN
921 iwork( 1 ) = totit
922 iwork( 2 ) = sweep
923 iwork( 3 ) = totns
924 END IF
925 RETURN
926
927
928
subroutine descinit(desc, m, n, mb, nb, irsrc, icsrc, ictxt, lld, info)
integer function iceil(inum, idenom)
integer function indxg2p(indxglob, nb, iproc, isrcproc, nprocs)
subroutine infog2l(grindx, gcindx, desc, nprow, npcol, myrow, mycol, lrindx, lcindx, rsrc, csrc)
integer function numroc(n, nb, iproc, isrcproc, nprocs)
subroutine pdelget(scope, top, alpha, a, ia, ja, desca)
subroutine pdlacpy(uplo, m, n, a, ia, ja, desca, b, ib, jb, descb)
subroutine pdlamve(uplo, m, n, a, ia, ja, desca, b, ib, jb, descb, dwork)
recursive subroutine pdlaqr0(wantt, wantz, n, ilo, ihi, h, desch, wr, wi, iloz, ihiz, z, descz, work, lwork, iwork, liwork, info, reclevel)
recursive subroutine pdlaqr1(wantt, wantz, n, ilo, ihi, a, desca, wr, wi, iloz, ihiz, z, descz, work, lwork, iwork, ilwork, info)
recursive subroutine pdlaqr3(wantt, wantz, n, ktop, kbot, nw, h, desch, iloz, ihiz, z, descz, ns, nd, sr, si, v, descv, nh, t, desct, nv, wv, descw, work, lwork, iwork, liwork, reclevel)
subroutine pdlaqr5(wantt, wantz, kacc22, n, ktop, kbot, nshfts, sr, si, h, desch, iloz, ihiz, z, descz, work, lwork, iwork, liwork)
integer function pilaenvx(ictxt, ispec, name, opts, n1, n2, n3, n4)