libflame  revision_anchor
Functions
FLA_Apply_H2_UT_piv_row.c File Reference

(r)

Functions

FLA_Error FLA_Apply_H2_UT_piv_row (FLA_Obj tau, FLA_Obj a1t, FLA_Obj u1t, FLA_Obj W, FLA_Obj u2, FLA_Obj A2, FLA_Obj U2, FLA_Obj w1t, FLA_Obj vt)

Function Documentation

FLA_Error FLA_Apply_H2_UT_piv_row ( FLA_Obj  tau,
FLA_Obj  a1t,
FLA_Obj  u1t,
FLA_Obj  W,
FLA_Obj  u2,
FLA_Obj  A2,
FLA_Obj  U2,
FLA_Obj  w1t,
FLA_Obj  vt 
)

References FLA_Axpy_external(), FLA_Copy_external(), FLA_Gemvc_external(), FLA_Inv_scalc_external(), FLA_MINUS_ONE, FLA_Obj_min_dim(), FLA_Obj_width(), FLA_ONE, FLA_Part_1x2(), and FLA_ZERO.

Referenced by FLA_QR_UT_piv_unb_var2().

{
  // a1t -= u1t W = 1 a1t -1 W^T u1t;
  FLA_Gemvc_external( FLA_TRANSPOSE, FLA_NO_CONJUGATE, 
                      FLA_MINUS_ONE, W, u1t, FLA_ONE, a1t );

  // w1t := a1t;
  FLA_Copy_external( a1t, w1t );
  
  // w1t += u2' A2 = 1 w1t + 1 A2^T conj(u2);
  FLA_Gemvc_external( FLA_TRANSPOSE, FLA_CONJUGATE, FLA_ONE, A2, u2, FLA_ONE, w1t );

  if ( FLA_Obj_min_dim( U2 ) > 0 ) 
  {
    FLA_Obj vtR;

    // Partition the workspace (a row vector matching the width of a1t)
    FLA_Part_1x2( vt, &vt, &vtR, FLA_Obj_width( U2 ), FLA_LEFT );

    // vt := u2'U2 = 0 vt + 1 U2^T conj(u2);
    FLA_Gemvc_external( FLA_TRANSPOSE, FLA_CONJUGATE, 
                        FLA_ONE, U2, u2, FLA_ZERO, vt );

    // w1t -= - vt W = 1 w1t -1 W^T vt;
    FLA_Gemvc_external( FLA_TRANSPOSE, FLA_NO_CONJUGATE, 
                        FLA_MINUS_ONE, W, vt, FLA_ONE, w1t );
  }

  // w1t = w1t / tau;
  FLA_Inv_scalc_external( FLA_NO_CONJUGATE, tau, w1t );

  // a1t  = a1t - w1t;
  FLA_Axpy_external( FLA_MINUS_ONE, w1t, a1t );

  return FLA_SUCCESS;
}