@@ -189,7 +189,7 @@ SUBROUTINE DLARFB0C2(C2I, SIDE, TRANS, DIRECT, STOREV, M, N,
189189 ! Array arguments
190190 DOUBLE PRECISION V(LDV,*), C(LDC,*), T(LDT,*)
191191 ! Local scalars
192- LOGICAL QR, LQ, QL, DIRF, COLV, SIDEL, SIDER,
192+ LOGICAL QR, LQ, QL, RQ, DIRF, COLV, SIDEL, SIDER,
193193 $ TRANST
194194 INTEGER I, J
195195 ! External functions
@@ -224,10 +224,7 @@ SUBROUTINE DLARFB0C2(C2I, SIDE, TRANS, DIRECT, STOREV, M, N,
224224
225225 ! RQ is when we store the reflectors row by row and have the
226226 ! ' first' reflector stored in the last row
227- ! RQ = (.NOT.DIRF).AND.(.NOT.COLV)
228- ! Since we have exactly one of these 4 modes, we don' t need to actually
229- ! store the value of RQ, instead we assume this is the case if we fail
230- ! the above 3 checks.
227+ RQ = (.NOT.DIRF).AND.(.NOT.COLV)
231228
232229 IF (QR) THEN
233230 ! We are computing C = HC = (I - VTV' )C
@@ -312,7 +309,7 @@ SUBROUTINE DLARFB0C2(C2I, SIDE, TRANS, DIRECT, STOREV, M, N,
312309 CALL DTRMM(' Left' , ' Lower' , ' No Transpose' , ' Unit' ,
313310 $ K, N, NEG_ONE, V, LDV, C, LDC)
314311 ELSE IF (LQ) THEN
315- ! We are computing C = CH ' = C(I-V' T ' V)
312+ ! We are computing C = C op(H) = C(I-V' op(T) V)
316313 ! Where : V = [ V1 V2 ] and C = [ C1 C2 ]
317314 ! with the following dimensions:
318315 ! V1\in \R^{K\times K}
@@ -324,20 +321,20 @@ SUBROUTINE DLARFB0C2(C2I, SIDE, TRANS, DIRECT, STOREV, M, N,
324321 ! without having to allocate anything extra.
325322 ! This lets us simplify our above equation to get
326323 !
327- ! C = CH ' = [ 0 , C2 ](I - [ V1' ]T ' [ V1, V2 ])
328- ! [ V2' ]
324+ ! C = C op(H) = [ 0 , C2 ](I - [ V1' ]op(T) [ V1, V2 ])
325+ ! [ V2' ]
329326 !
330- ! = [ 0, C2 ] - [ 0, C2 ][ V1' ]T ' [ V1, V2 ]
327+ ! = [ 0 , C2 ] - [ 0 , C2 ][ V1' ]op(T) [ V1, V2 ]
331328 ! [ V2' ]
332329 !
333- ! = [ 0 , C2 ] - C2* V2' *T ' [ V1, V2 ]
330+ ! = [ 0 , C2 ] - C2* V2' *op(T) [ V1, V2 ]
334331 !
335- ! = [ - C2* V2' *T ' * V1, C2 - C2* V2' *T ' * V2 ]
332+ ! = [ -C2*V2' * op(T) * V1, C2 - C2* V2' *op(T) *V2 ]
336333 !
337334 ! So, we can order our computations as follows:
338335 !
339336 ! C1 = C2*V2'
340- ! C1 = C1*T '
337+ ! C1 = C1* op(T)
341338 ! C2 = C2 - C1* V2
342339 ! C1 = - C1* V1
343340 !
@@ -348,9 +345,6 @@ SUBROUTINE DLARFB0C2(C2I, SIDE, TRANS, DIRECT, STOREV, M, N,
348345 IF ( .NOT. SIDER ) THEN
349346 CALL XERBLA(' DLARFB0C2' , 2 )
350347 RETURN
351- ELSE IF (.NOT. TRANST) THEN
352- CALL XERBLA(' DLARFB0C2' , 3 )
353- RETURN
354348 END IF
355349 !
356350 ! C1 = C2* V2'
@@ -369,8 +363,13 @@ SUBROUTINE DLARFB0C2(C2I, SIDE, TRANS, DIRECT, STOREV, M, N,
369363 !
370364 ! C1 = C1*T'
371365 !
372- CALL DTRMM(' Right' , ' Upper' , ' Transpose' , ' Non-unit' ,
373- $ M, K, ONE, T, LDT, C, LDC)
366+ IF (TRANST) THEN
367+ CALL DTRMM(' Right' , ' Upper' , ' Transpose' ,
368+ $ ' Non-unit' , M, K, ONE, T, LDT, C, LDC)
369+ ELSE
370+ CALL DTRMM(' Right' , ' Lower' , ' No Transpose' ,
371+ $ ' Non-unit' , M, K, ONE, T, LDT, C, LDC)
372+ END IF
374373 !
375374 ! C2 = C2 - C1* V2 = - C1* V2 + C2
376375 !
@@ -471,8 +470,8 @@ SUBROUTINE DLARFB0C2(C2I, SIDE, TRANS, DIRECT, STOREV, M, N,
471470 !
472471 CALL DTRMM(' Left' , ' Upper' , ' No Transpose' , ' Unit' ,
473472 $ K, N, NEG_ONE, V(M- K+1 ,1 ), LDV, C(M- K+1 ,1 ), LDC)
474- ELSE ! IF (RQ) THEN
475- ! 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)
476475 ! Where: V = [ V2 V1] and C = [ C2 C1 ]
477476 ! with the following dimensions:
478477 ! V1\in\R^{K\times K}
@@ -484,36 +483,33 @@ SUBROUTINE DLARFB0C2(C2I, SIDE, TRANS, DIRECT, STOREV, M, N,
484483 ! without having to allocate anything extra.
485484 ! This lets us simplify our above equation to get
486485 !
487- ! C = CH ' = [ C2, 0 ] (I - [ V2' ]T ' [ V2, V1 ]
488- ! [ V1' ]
486+ ! C = C op(H) = [ C2, 0 ] (I - [ V2' ]op(T) [ V2, V1 ]
487+ ! [ V1' ]
489488 !
490- ! = [ C2, 0 ] - [ C2, 0 ] [ V2' ]T ' [ V2, V1 ]
489+ ! = [ C2, 0 ] - [ C2, 0 ] [ V2' ]op(T) [ V2, V1 ]
491490 ! [ V1' ]
492491 !
493- ! = [ C2, 0 ] - C2* V2' *T ' [ V2, V1 ]
492+ ! = [ C2, 0 ] - C2*V2' * op(T) [ V2, V1 ]
494493 !
495- ! = [ C2, 0 ] - [ C2* V2' *T ' * V2, C2* V2' *T ' * V1 ]
494+ ! = [ C2, 0 ] - [ C2* V2' *op(T) *V2, C2*V2' * op(T) * V1 ]
496495 !
497- ! = [ C2 - C2* V2' *T ' * V2, - C2* V2' *T ' * V1 ]
496+ ! = [ C2 - C2* V2' *op(T) *V2, -C2*V2' * op(T) * V1 ]
498497 !
499498 ! So, we can order our computations as follows:
500499 !
501500 ! C1 = C2* V2'
502- ! C1 = C1*T '
501+ ! C1 = C1*op(T)
503502 ! C2 = C2 - C1*V2
504503 ! C1 = -C1*V1
505504 !
506505 !
507506 ! To achieve the same end result
508507 !
509- ! Check to ensure side and trans are the expected values
508+ ! Check to ensure side has the expected value
510509 !
511510 IF( .NOT.SIDER ) THEN
512511 CALL XERBLA(' DLARFB0C2' , 2)
513512 RETURN
514- ELSE IF (.NOT. TRANST) THEN
515- CALL XERBLA(' DLARFB0C2' , 3 )
516- RETURN
517513 END IF
518514 !
519515 ! C1 = C2*V2'
@@ -529,10 +525,15 @@ SUBROUTINE DLARFB0C2(C2I, SIDE, TRANS, DIRECT, STOREV, M, N,
529525 $ ONE, C, LDC, V, LDV, ZERO, C(1 , N- K+1 ), LDC)
530526 END IF
531527 !
532- ! C1 = C1*T '
528+ ! C1 = C1* op(T)
533529 !
534- CALL DTRMM(' Right' , ' Lower' , ' Transpose' , ' Non-unit' ,
535- $ M, K, ONE, T, LDT, C(1 , N- K+1 ), LDC)
530+ IF ( TRANST ) THEN
531+ CALL DTRMM(' Right' , ' Lower' , ' Transpose' ,
532+ $ ' Non-unit' , M, K, ONE, T, LDT, C(1 , N- K+1 ), LDC)
533+ ELSE
534+ CALL DTRMM(' Right' , ' Upper' , ' No Transpose' ,
535+ $ ' Non-unit' , M, K, ONE, T, LDT, C(1 , N- K+1 ), LDC)
536+ END IF
536537 !
537538 ! C2 = C2 - C1* V2 = - C1* V2 + C2
538539 !
0 commit comments