@@ -186,20 +186,19 @@ SUBROUTINE SLARFB0C2(C2I, SIDE, TRANS, DIRECT, STOREV, M, N,
186186         !     and thus don' t reference whatever is present in C2 
187187         !     at the beginning. 
188188         LOGICAL           C2I 
189- 
190189         ! Array arguments 
191190         REAL              V(LDV,*), C(LDC,*), T(LDT,*) 
192191         ! Local scalars 
193-          LOGICAL           QR, LQ, QL, DIRF, COLV, SIDEL, SIDER, 
192+          LOGICAL           QR, LQ, QL, RQ,  DIRF, COLV, SIDEL, SIDER, 
194193     $                     TRANST 
195194         INTEGER           I, J 
196195         ! External functions 
197196         LOGICAL           LSAME 
198197         EXTERNAL          LSAME 
199-          ! External Subroutines  
198+          ! External subroutines  
200199         EXTERNAL          SGEMM, STRMM, XERBLA 
201200         ! Parameters 
202-          REAL               ONE, ZERO, NEG_ONE 
201+          REAL             ONE, ZERO, NEG_ONE 
203202         PARAMETER(ONE=1.0E+0, ZERO = 0.0E+0, NEG_ONE = -1.0E+0) 
204203
205204         ! Beginning of executable statements 
@@ -225,10 +224,7 @@ SUBROUTINE SLARFB0C2(C2I, SIDE, TRANS, DIRECT, STOREV, M, N,
225224
226225         ! RQ is when we store the reflectors row by row and have the 
227226         ! '  first'  reflector stored in the last row
228-          ! RQ = (.NOT.DIRF).AND.(.NOT.COLV) 
229-          ! Since we have exactly one of these 4 modes, we don'  t need to  actually
230-          ! store the value of RQ, instead we assume this is the case if  we fail
231-          ! the above 3  checks.
227+          RQ = (.NOT.DIRF).AND.(.NOT.COLV) 
232228
233229         IF (QR) THEN 
234230            ! We are computing C = HC = (I - VTV'  )C
@@ -313,7 +309,7 @@ SUBROUTINE SLARFB0C2(C2I, SIDE, TRANS, DIRECT, STOREV, M, N,
313309            CALL STRMM('  Left' , '  Lower' , '  No Transpose' , '  Unit' ,
314310     $                  K, N, NEG_ONE, V, LDV, C, LDC) 
315311         ELSE IF (LQ) THEN 
316-             ! We are computing C =  CH '   = C(I-V' T ' V)
312+             ! We are computing C = C op(H)  = C(I-V'   op(T)  V)
317313            ! Where : V =  [ V1 V2 ] and C =  [ C1 C2 ]
318314            ! with the following dimensions:
319315            !     V1\in \R^{K\times K}
@@ -325,20 +321,20 @@ SUBROUTINE SLARFB0C2(C2I, SIDE, TRANS, DIRECT, STOREV, M, N,
325321            ! without having to  allocate anything extra.
326322            ! This lets us simplify our above equation to  get
327323            !
328-             ! C = CH '    =  [ 0 , C2 ](I -  [ V1'  ]T '  [ V1, V2 ])
329-             !                         [ V2'  ]
324+             ! C =  C op(H)  =  [ 0 , C2 ](I -  [ V1'  ]op(T) [ V1, V2 ])
325+             !                              [ V2'   ]
330326            !
331-             !   = [ 0, C2 ] - [ 0, C2 ][ V1'   ]T ' [ V1, V2 ]
327+             !   =  [ 0 , C2 ] -  [ 0 , C2 ][ V1'  ]op(T) [ V1, V2 ]
332328            !                          [ V2'   ]
333329            !
334-             !   =  [ 0 , C2 ] -  C2* V2' *T '  [ V1, V2 ]
330+             !   =  [ 0 , C2 ] -  C2* V2' *op(T) [ V1, V2 ]
335331            ! 
336-             !   =  [ - C2* V2' *T ' * V1, C2 -  C2* V2' *T ' * V2 ]
332+             !   = [ -C2*V2'  * op(T) * V1, C2 -  C2* V2' *op(T) *V2 ]
337333            ! 
338334            ! So, we can order our computations as follows: 
339335            ! 
340336            ! C1 = C2*V2'  
341-             ! C1 = C1*T '  
337+             ! C1 =  C1* op(T) 
342338            ! C2 =  C2 -  C1* V2
343339            ! C1 =  - C1* V1
344340            !
@@ -349,9 +345,6 @@ SUBROUTINE SLARFB0C2(C2I, SIDE, TRANS, DIRECT, STOREV, M, N,
349345            IF ( .NOT. SIDER ) THEN 
350346               CALL  XERBLA(' SLARFB0C2'  , 2 )
351347               RETURN 
352-             ELSE  IF (.NOT. TRANST) THEN 
353-                CALL  XERBLA(' SLARFB0C2'  , 3 )
354-                RETURN 
355348            END IF 
356349            !
357350            ! C1 =  C2* V2' 
@@ -370,8 +363,13 @@ SUBROUTINE SLARFB0C2(C2I, SIDE, TRANS, DIRECT, STOREV, M, N,
370363            ! 
371364            ! C1 = C1*T'  
372365            !
373-             CALL  STRMM(' Right'  , ' Upper'  , ' Transpose'  , ' Non-unit'  ,
374-      $            M, K, ONE, T, LDT, C, LDC)
366+             IF  (TRANST) THEN 
367+                CALL  STRMM(' Right'  , ' Upper'  , ' Transpose'  ,
368+      $               ' Non-unit'  , M, K, ONE, T, LDT, C, LDC)
369+             ELSE 
370+                CALL  STRMM(' Right'  , ' Lower'  , ' No Transpose'  ,
371+      $               ' Non-unit'  , M, K, ONE, T, LDT, C, LDC)
372+             END IF 
375373            !
376374            ! C2 =  C2 -  C1* V2 =  - C1* V2 +  C2
377375            !
@@ -472,8 +470,8 @@ SUBROUTINE SLARFB0C2(C2I, SIDE, TRANS, DIRECT, STOREV, M, N,
472470            !
473471            CALL  STRMM(' Left'  , ' Upper'  , ' No Transpose'  , ' Unit'  ,
474472     $         K, N, NEG_ONE, V(M- K+1 ,1 ), LDV, C(M- K+1 ,1 ), LDC)
475-          ELSE  !  IF  (RQ) THEN 
476-             ! We are computing C =  CH '   = C(I-V' T ' V)
473+          ELSE  IF  (RQ) THEN 
474+             ! We are computing C =  C op(H)  =  C(I- V'  op(T)  V)
477475            ! Where: V = [ V2 V1] and C = [ C2 C1 ] 
478476            ! with the following dimensions: 
479477            !     V1\in\R^{K\times K} 
@@ -485,36 +483,33 @@ SUBROUTINE SLARFB0C2(C2I, SIDE, TRANS, DIRECT, STOREV, M, N,
485483            ! without having to allocate anything extra. 
486484            ! This lets us simplify our above equation to get 
487485            ! 
488-             ! C = CH '    =  [ C2, 0  ] (I -  [ V2'  ]T '  [ V2, V1 ]
489-             !                          [ V1'  ]
486+             ! C = C op(H)  = [ C2, 0 ] (I - [ V2'   ]op(T) [ V2, V1 ]
487+             !                               [ V1'  ]
490488            ! 
491-             !   = [ C2, 0 ] - [ C2, 0 ] [ V2'   ]T ' [ V2, V1 ]
489+             !   = [ C2, 0 ] - [ C2, 0 ] [ V2'   ]op(T) [ V2, V1 ]
492490            !                           [ V1'  ]
493491            ! 
494-             !   =  [ C2, 0  ] -  C2* V2' *T '  [ V2, V1 ]
492+             !   = [ C2, 0 ] - C2*V2'  * op(T) [ V2, V1 ]
495493            !
496-             !   =  [ C2, 0  ] -  [ C2* V2' *T ' * V2, C2* V2' *T ' * V1 ]
494+             !   =  [ C2, 0  ] -  [ C2* V2' *op(T) *V2, C2*V2' * op(T) * V1 ]
497495            !
498-             !   =  [ C2 -  C2* V2' *T ' * V2, - C2* V2' *T ' * V1 ]
496+             !   =  [ C2 -  C2* V2' *op(T) *V2, -C2*V2' * op(T) * V1 ]
499497            !
500498            ! So, we can order our computations as follows:
501499            !
502500            ! C1 =  C2* V2' 
503-             ! C1 = C1*T '  
501+             ! C1 = C1*op(T)  
504502            ! C2 = C2 - C1*V2 
505503            ! C1 = -C1*V1 
506504            ! 
507505            ! 
508506            ! To achieve the same end result 
509507            ! 
510-             ! Check to  ensure side and trans are  the expected values  
508+             ! Check to ensure side has  the expected value  
511509            ! 
512510            IF( .NOT.SIDER ) THEN 
513511               CALL XERBLA('  SLARFB0C2' , 2)
514512               RETURN 
515-             ELSE  IF (.NOT. TRANST) THEN 
516-                CALL  XERBLA(' SLARFB0C2'  , 3 )
517-                RETURN 
518513            END IF 
519514            ! 
520515            ! C1 = C2*V2'  
@@ -530,10 +525,15 @@ SUBROUTINE SLARFB0C2(C2I, SIDE, TRANS, DIRECT, STOREV, M, N,
530525     $            ONE, C, LDC, V, LDV, ZERO, C(1 , N- K+1 ), LDC)
531526            END IF 
532527            !
533-             ! C1 = C1*T '  
528+             ! C1 =  C1* op(T) 
534529            !
535-             CALL  STRMM(' Right'  , ' Lower'  , ' Transpose'  , ' Non-unit'  ,
536-      $         M, K, ONE, T, LDT, C(1 , N- K+1 ), LDC)
530+             IF ( TRANST ) THEN 
531+                CALL  STRMM(' Right'  , ' Lower'  , ' Transpose'  ,
532+      $            ' Non-unit'  , M, K, ONE, T, LDT, C(1 , N- K+1 ), LDC)
533+             ELSE 
534+                CALL  STRMM(' Right'  , ' Upper'  , ' No Transpose'  ,
535+      $            ' Non-unit'  , M, K, ONE, T, LDT, C(1 , N- K+1 ), LDC)
536+             END IF 
537537            !
538538            ! C2 =  C2 -  C1* V2 =  - C1* V2 +  C2
539539            !
0 commit comments