3      IMPLICIT NONE
    4
    5
    6
    7
    8
    9
   10      INTEGER            INFO, J1, LDT, N, N1, N2
   11
   12
   13      INTEGER            ITRAF( * )
   14      DOUBLE PRECISION   DTRAF( * ), T( LDT, * ), WORK( * )
   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
   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      DOUBLE PRECISION   ZERO, ONE
   83      parameter( zero = 0.0d+0, one = 1.0d+0 )
   84      DOUBLE PRECISION   TEN
   85      parameter( ten = 1.0d+1 )
   86      INTEGER            LDD, LDX
   87      parameter( ldd = 4, ldx = 2 )
   88
   89
   90      INTEGER            IERR, J2, J3, J4, K, LD, LI, ND
   91      DOUBLE PRECISION   CS, DNORM, EPS, SCALE, SMLNUM, SN, T11, T22,
   92     $                   T33, TAU, TAU1, TAU2, TEMP, THRESH, WI1, WI2,
   93     $                   WR1, WR2, XNORM
   94
   95
   96      DOUBLE PRECISION   D( LDD, 4 ), X( LDX, 2 )
   97
   98
   99      DOUBLE PRECISION   DLAMCH, DLANGE
  101
  102
  103      EXTERNAL           dlamov, dlanv2, dlarfg, dlarfx, dlartg, dlasy2,
  104     $                   drot
  105
  106
  108
  109
  110
  111      info = 0
  112
  113
  114
  115      IF( n.EQ.0 .OR. n1.EQ.0 .OR. n2.EQ.0 )
  116     $   RETURN
  117      IF( j1+n1.GT.n )
  118     $   RETURN
  119
  120      j2 = j1 + 1
  121      j3 = j1 + 2
  122      j4 = j1 + 3
  123
  124      IF( n1.EQ.1 .AND. n2.EQ.1 ) THEN
  125
  126
  127
  128         t11 = t( j1, j1 )
  129         t22 = t( j2, j2 )
  130
  131
  132
  133         CALL dlartg( t( j1, j2 ), t22-t11, cs, sn, temp )
  134
  135
  136
  137         IF( j3.LE.n )
  138     $      CALL drot( n-j1-1, t( j1, j3 ), ldt, t( j2, j3 ), ldt, cs,
  139     $                 sn )
  140         CALL drot( j1-1, t( 1, j1 ), 1, t( 1, j2 ), 1, cs, sn )
  141
  142         t( j1, j1 ) = t22
  143         t( j2, j2 ) = t11
  144
  145         itraf( 1 ) = j1
  146         dtraf( 1 ) = cs
  147         dtraf( 2 ) = sn
  148
  149      ELSE
  150
  151
  152
  153
  154
  155
  156         nd = n1 + n2
  157         CALL dlamov( 'Full', nd, nd, t( j1, j1 ), ldt, d, ldd )
  158         dnorm = dlange( 'Max', nd, nd, d, ldd, work )
  159
  160
  161
  162
  164         smlnum = 
dlamch( 
'S' ) / eps
 
  165         thresh = 
max( ten*eps*dnorm, smlnum )
 
  166
  167
  168
  169         CALL dlasy2( .false., .false., -1, n1, n2, d, ldd,
  170     $                d( n1+1, n1+1 ), ldd, d( 1, n1+1 ), ldd, scale, x,
  171     $                ldx, xnorm, ierr )
  172
  173
  174
  175         k = n1 + n1 + n2 - 3
  176         GO TO ( 10, 20, 30 )k
  177
  178   10    CONTINUE
  179
  180
  181
  182
  183
  184         dtraf( 1 ) = scale
  185         dtraf( 2 ) = x( 1, 1 )
  186         dtraf( 3 ) = x( 1, 2 )
  187         CALL dlarfg( 3, dtraf( 3 ), dtraf, 1, tau )
  188         dtraf( 3 ) = one
  189         t11 = t( j1, j1 )
  190
  191
  192
  193         CALL dlarfx( 'Left', 3, 3, dtraf, tau, d, ldd, work )
  194         CALL dlarfx( 'Right', 3, 3, dtraf, tau, d, ldd, work )
  195
  196
  197
  198         IF( 
max( abs( d( 3, 1 ) ), abs( d( 3, 2 ) ), abs( d( 3,
 
  199     $       3 )-t11 ) ).GT.thresh )GO TO 50
  200
  201
  202
  203         CALL dlarfx( 'Left', 3, n-j1+1, dtraf, tau, t( j1, j1 ), ldt,
  204     $                work )
  205         CALL dlarfx( 'Right', j2, 3, dtraf, tau, t( 1, j1 ), ldt,
  206     $                work )
  207
  208         t( j3, j1 ) = zero
  209         t( j3, j2 ) = zero
  210         t( j3, j3 ) = t11
  211
  212         itraf( 1 ) = 2*n + j1
  213         li = 2
  214         dtraf( 3 ) = tau
  215         ld = 4
  216         GO TO 40
  217
  218   20    CONTINUE
  219
  220
  221
  222
  223
  224
  225
  226         dtraf( 1 ) = -x( 1, 1 )
  227         dtraf( 2 ) = -x( 2, 1 )
  228         dtraf( 3 ) = scale
  229         CALL dlarfg( 3, dtraf( 1 ), dtraf( 2 ), 1, tau )
  230         dtraf( 1 ) = one
  231         t33 = t( j3, j3 )
  232
  233
  234
  235         CALL dlarfx( 'Left', 3, 3, dtraf, tau, d, ldd, work )
  236         CALL dlarfx( 'Right', 3, 3, dtraf, tau, d, ldd, work )
  237
  238
  239
  240         IF( 
max( abs( d( 2, 1 ) ), abs( d( 3, 1 ) ), abs( d( 1,
 
  241     $       1 )-t33 ) ).GT.thresh )GO TO 50
  242
  243
  244
  245         CALL dlarfx( 'Right', j3, 3, dtraf, tau, t( 1, j1 ), ldt,
  246     $                work )
  247         CALL dlarfx( 'Left', 3, n-j1, dtraf, tau, t( j1, j2 ), ldt,
  248     $                work )
  249
  250         t( j1, j1 ) = t33
  251         t( j2, j1 ) = zero
  252         t( j3, j1 ) = zero
  253
  254         itraf( 1 ) = n + j1
  255         li = 2
  256         dtraf( 1 ) = tau
  257         ld = 4
  258         GO TO 40
  259
  260   30    CONTINUE
  261
  262
  263
  264
  265
  266
  267
  268
  269
  270         dtraf( 1 ) = -x( 1, 1 )
  271         dtraf( 2 ) = -x( 2, 1 )
  272         dtraf( 3 ) = scale
  273         CALL dlarfg( 3, dtraf( 1 ), dtraf( 2 ), 1, tau1 )
  274         dtraf( 1 ) = one
  275
  276         temp = -tau1*( x( 1, 2 )+dtraf( 2 )*x( 2, 2 ) )
  277         dtraf( 4 ) = -temp*dtraf( 2 ) - x( 2, 2 )
  278         dtraf( 5 ) = -temp*dtraf( 3 )
  279         dtraf( 6 ) = scale
  280         CALL dlarfg( 3, dtraf( 4 ), dtraf( 5 ), 1, tau2 )
  281         dtraf( 4 ) = one
  282
  283
  284
  285         CALL dlarfx( 'Left', 3, 4, dtraf, tau1, d, ldd, work )
  286         CALL dlarfx( 'Right', 4, 3, dtraf, tau1, d, ldd, work )
  287         CALL dlarfx( 'Left', 3, 4, dtraf( 4 ), tau2, d( 2, 1 ), ldd,
  288     $                work )
  289         CALL dlarfx( 'Right', 4, 3, dtraf( 4 ), tau2, d( 1, 2 ), ldd,
  290     $                work )
  291
  292
  293
  294         IF( 
max( abs( d( 3, 1 ) ), abs( d( 3, 2 ) ), abs( d( 4, 1 ) ),
 
  295     $       abs( d( 4, 2 ) ) ).GT.thresh )GO TO 50
  296
  297
  298
  299         CALL dlarfx( 'Left', 3, n-j1+1, dtraf, tau1, t( j1, j1 ), ldt,
  300     $                work )
  301         CALL dlarfx( 'Right', j4, 3, dtraf, tau1, t( 1, j1 ), ldt,
  302     $                work )
  303         CALL dlarfx( 'Left', 3, n-j1+1, dtraf( 4 ), tau2, t( j2, j1 ),
  304     $                ldt, work )
  305         CALL dlarfx( 'Right', j4, 3, dtraf( 4 ), tau2, t( 1, j2 ), ldt,
  306     $                work )
  307
  308         t( j3, j1 ) = zero
  309         t( j3, j2 ) = zero
  310         t( j4, j1 ) = zero
  311         t( j4, j2 ) = zero
  312
  313         itraf( 1 ) = n + j1
  314         itraf( 2 ) = n + j2
  315         li = 3
  316         dtraf( 1 ) = tau1
  317         dtraf( 4 ) = tau2
  318         ld = 7
  319         GO TO 40
  320
  321   40    CONTINUE
  322
  323         IF( n2.EQ.2 ) THEN
  324
  325
  326
  327            CALL dlanv2( t( j1, j1 ), t( j1, j2 ), t( j2, j1 ),
  328     $                   t( j2, j2 ), wr1, wi1, wr2, wi2, cs, sn )
  329            CALL drot( n-j1-1, t( j1, j1+2 ), ldt, t( j2, j1+2 ), ldt,
  330     $                 cs, sn )
  331            CALL drot( j1-1, t( 1, j1 ), 1, t( 1, j2 ), 1, cs, sn )
  332            itraf( li ) = j1
  333            li = li + 1
  334            dtraf( ld ) = cs
  335            dtraf( ld+1 ) = sn
  336            ld = ld + 2
  337         END IF
  338
  339         IF( n1.EQ.2 ) THEN
  340
  341
  342
  343            j3 = j1 + n2
  344            j4 = j3 + 1
  345            CALL dlanv2( t( j3, j3 ), t( j3, j4 ), t( j4, j3 ),
  346     $                   t( j4, j4 ), wr1, wi1, wr2, wi2, cs, sn )
  347            IF( j3+2.LE.n )
  348     $         CALL drot( n-j3-1, t( j3, j3+2 ), ldt, t( j4, j3+2 ),
  349     $                    ldt, cs, sn )
  350            CALL drot( j3-1, t( 1, j3 ), 1, t( 1, j4 ), 1, cs, sn )
  351            itraf( li ) = j3
  352            dtraf( ld ) = cs
  353            dtraf( ld+1 ) = sn
  354         END IF
  355
  356      END IF
  357      RETURN
  358
  359
  360
  361   50 CONTINUE
  362      info = 1
  363      RETURN
  364
  365
  366