FLA_QR_UT_UD_vars.h File Reference

(r)

Go to the source code of this file.

Functions

FLA_Error FLA_QR_UT_UD_blk_var1 (FLA_Obj U, FLA_Obj D, FLA_Obj T, fla_qrutud_t *cntl)
FLA_Error FLA_QR_UT_UD_blk_var2 (FLA_Obj U, FLA_Obj D, FLA_Obj T, fla_qrutud_t *cntl)
FLA_Error FLA_QR_UT_UD_Accum_T_unb_var1 (FLA_Obj U, FLA_Obj D, FLA_Obj T)
FLA_Error FLA_QR_UT_UD_Accum_T_opt_var1 (FLA_Obj U, FLA_Obj D, FLA_Obj T)
FLA_Error FLA_QR_UT_UD_Accum_T_opt_var1_float (FLA_Obj U, FLA_Obj D, FLA_Obj T)
FLA_Error FLA_QR_UT_UD_Accum_T_opt_var1_double (FLA_Obj U, FLA_Obj D, FLA_Obj T)
FLA_Error FLA_QR_UT_UD_Accum_T_opt_var1_scomplex (FLA_Obj U, FLA_Obj D, FLA_Obj T)
FLA_Error FLA_QR_UT_UD_Accum_T_opt_var1_dcomplex (FLA_Obj U, FLA_Obj D, FLA_Obj T)


Function Documentation

FLA_Error FLA_QR_UT_UD_Accum_T_opt_var1 ( FLA_Obj  U,
FLA_Obj  D,
FLA_Obj  T 
)

References FLA_Obj_datatype(), FLA_QR_UT_UD_Accum_T_opt_var1_dcomplex(), FLA_QR_UT_UD_Accum_T_opt_var1_double(), FLA_QR_UT_UD_Accum_T_opt_var1_float(), and FLA_QR_UT_UD_Accum_T_opt_var1_scomplex().

Referenced by FLA_QR_UT_UD_internal().

00037 {
00038   FLA_Datatype datatype;
00039 
00040   datatype = FLA_Obj_datatype( U );
00041 
00042   switch ( datatype )
00043   {
00044     case FLA_FLOAT:
00045     FLA_QR_UT_UD_Accum_T_opt_var1_float( U,
00046                                          D, T );
00047     break;
00048 
00049     case FLA_DOUBLE:
00050     FLA_QR_UT_UD_Accum_T_opt_var1_double( U,
00051                                           D, T );
00052     break;
00053 
00054     case FLA_COMPLEX:
00055     FLA_QR_UT_UD_Accum_T_opt_var1_scomplex( U,
00056                                             D, T );
00057     break;
00058 
00059     case FLA_DOUBLE_COMPLEX:
00060     FLA_QR_UT_UD_Accum_T_opt_var1_dcomplex( U,
00061                                             D, T );
00062     break;
00063   }
00064 
00065   return FLA_SUCCESS;
00066 }

FLA_Error FLA_QR_UT_UD_Accum_T_opt_var1_dcomplex ( FLA_Obj  U,
FLA_Obj  D,
FLA_Obj  T 
)

References FLA_Apply_househ2_UT_opt_dcomplex(), FLA_Househ2_UT_opt_dcomplex(), FLA_Obj_ldim(), FLA_Obj_length(), FLA_ONE, FLA_ZERO, and zgemv().

Referenced by FLA_QR_UT_UD_Accum_T_opt_var1().

00297 {
00298   dcomplex* buff_U  = FLA_DOUBLE_COMPLEX_PTR( U );
00299   dcomplex* buff_D  = FLA_DOUBLE_COMPLEX_PTR( D );
00300   dcomplex* buff_T  = FLA_DOUBLE_COMPLEX_PTR( T );
00301   dcomplex* buff_1  = FLA_DOUBLE_COMPLEX_PTR( FLA_ONE );
00302   dcomplex* buff_0  = FLA_DOUBLE_COMPLEX_PTR( FLA_ZERO );
00303 
00304   int       m_UT    = FLA_Obj_length( U );
00305   int       m_D     = FLA_Obj_length( D );
00306   int       ldim_U  = FLA_Obj_ldim( U );
00307   int       ldim_D  = FLA_Obj_ldim( D );
00308   int       ldim_T  = FLA_Obj_ldim( T );
00309  
00310   char      trans   = 'C';
00311   int       inc_one = 1;
00312   int       i;
00313 
00314   for ( i = 0; i < m_UT; ++i )
00315   {
00316     dcomplex* upsilon11 = buff_U + (i  )*ldim_U + i;
00317     dcomplex* u12t      = buff_U + (i+1)*ldim_U + i;
00318 
00319     dcomplex* D0        = buff_D + (0  )*ldim_D;
00320     dcomplex* d1        = buff_D + (i  )*ldim_D;
00321     dcomplex* D2        = buff_D + (i+1)*ldim_D;
00322 
00323     dcomplex* tau11     = buff_T + (i  )*ldim_T + i;
00324     dcomplex* t01       = buff_T + (i  )*ldim_T;
00325 
00326     int       mn_ahead  = m_UT - i - 1;
00327     int       mn_behind = i;
00328 
00329     //------------------------------------------------------------//
00330 
00331     // FLA_Househ2_UT( upsilon11,
00332     //                 d1, tau11 );
00333     FLA_Househ2_UT_opt_dcomplex( m_D,
00334                                  upsilon11,
00335                                  d1, inc_one,
00336                                  tau11 );
00337 
00338     if ( i > 0 )
00339     {
00340       // FLA_Gemv_external( FLA_CONJ_TRANSPOSE, FLA_ONE, D0, d1, FLA_ZERO, t01 );
00341       FLA_C2F( zgemv )( &trans,
00342                         &m_D, &mn_behind,
00343                         buff_1,
00344                         D0, &ldim_D,
00345                         d1, &inc_one,
00346                         buff_0,
00347                         t01, &inc_one );
00348     }
00349 
00350     if ( i < m_UT - 1 )
00351     {
00352       // FLA_Apply_househ2_UT( tau11, d1, u12t,
00353       //                                  D2 );
00354       FLA_Apply_househ2_UT_opt_dcomplex( m_D, mn_ahead,
00355                                          tau11,
00356                                          d1, inc_one,
00357                                          u12t, ldim_U,
00358                                          D2, ldim_D );
00359     }
00360 
00361     //------------------------------------------------------------//
00362 
00363   }
00364 
00365   return FLA_SUCCESS;
00366 }

FLA_Error FLA_QR_UT_UD_Accum_T_opt_var1_double ( FLA_Obj  U,
FLA_Obj  D,
FLA_Obj  T 
)

References dgemv(), FLA_Apply_househ2_UT_opt_double(), FLA_Househ2_UT_opt_double(), FLA_Obj_ldim(), FLA_Obj_length(), FLA_ONE, and FLA_ZERO.

Referenced by FLA_QR_UT_UD_Accum_T_opt_var1().

00147 {
00148   double* buff_U  = FLA_DOUBLE_PTR( U );
00149   double* buff_D  = FLA_DOUBLE_PTR( D );
00150   double* buff_T  = FLA_DOUBLE_PTR( T );
00151   double* buff_1  = FLA_DOUBLE_PTR( FLA_ONE );
00152   double* buff_0  = FLA_DOUBLE_PTR( FLA_ZERO );
00153 
00154   int     m_UT    = FLA_Obj_length( U );
00155   int     m_D     = FLA_Obj_length( D );
00156   int     ldim_U  = FLA_Obj_ldim( U );
00157   int     ldim_D  = FLA_Obj_ldim( D );
00158   int     ldim_T  = FLA_Obj_ldim( T );
00159  
00160   char    trans   = 'T';
00161   int     inc_one = 1;
00162   int     i;
00163 
00164   for ( i = 0; i < m_UT; ++i )
00165   {
00166     double* upsilon11 = buff_U + (i  )*ldim_U + i;
00167     double* u12t      = buff_U + (i+1)*ldim_U + i;
00168 
00169     double* D0        = buff_D + (0  )*ldim_D;
00170     double* d1        = buff_D + (i  )*ldim_D;
00171     double* D2        = buff_D + (i+1)*ldim_D;
00172 
00173     double* tau11     = buff_T + (i  )*ldim_T + i;
00174     double* t01       = buff_T + (i  )*ldim_T;
00175 
00176     int     mn_ahead  = m_UT - i - 1;
00177     int     mn_behind = i;
00178 
00179     //------------------------------------------------------------//
00180 
00181     // FLA_Househ2_UT( upsilon11,
00182     //                 d1, tau11 );
00183     FLA_Househ2_UT_opt_double( m_D,
00184                                upsilon11,
00185                                d1, inc_one,
00186                                tau11 );
00187 
00188     if ( i > 0 )
00189     {
00190       // FLA_Gemv_external( FLA_CONJ_TRANSPOSE, FLA_ONE, D0, d1, FLA_ZERO, t01 );
00191       FLA_C2F( dgemv )( &trans,
00192                         &m_D, &mn_behind,
00193                         buff_1,
00194                         D0, &ldim_D,
00195                         d1, &inc_one,
00196                         buff_0,
00197                         t01, &inc_one );
00198     }
00199 
00200     if ( i < m_UT - 1 )
00201     {
00202       // FLA_Apply_househ2_UT( tau11, d1, u12t,
00203       //                                  D2 );
00204       FLA_Apply_househ2_UT_opt_double( m_D, mn_ahead,
00205                                        tau11,
00206                                        d1, inc_one,
00207                                        u12t, ldim_U,
00208                                        D2, ldim_D );
00209     }
00210 
00211     //------------------------------------------------------------//
00212 
00213   }
00214 
00215   return FLA_SUCCESS;
00216 }

FLA_Error FLA_QR_UT_UD_Accum_T_opt_var1_float ( FLA_Obj  U,
FLA_Obj  D,
FLA_Obj  T 
)

References FLA_Apply_househ2_UT_opt_float(), FLA_Househ2_UT_opt_float(), FLA_Obj_ldim(), FLA_Obj_length(), FLA_ONE, FLA_ZERO, and sgemv().

Referenced by FLA_QR_UT_UD_Accum_T_opt_var1().

00072 {
00073   float* buff_U  = FLA_FLOAT_PTR( U );
00074   float* buff_D  = FLA_FLOAT_PTR( D );
00075   float* buff_T  = FLA_FLOAT_PTR( T );
00076   float* buff_1  = FLA_FLOAT_PTR( FLA_ONE );
00077   float* buff_0  = FLA_FLOAT_PTR( FLA_ZERO );
00078 
00079   int    m_UT    = FLA_Obj_length( U );
00080   int    m_D     = FLA_Obj_length( D );
00081   int    ldim_U  = FLA_Obj_ldim( U );
00082   int    ldim_D  = FLA_Obj_ldim( D );
00083   int    ldim_T  = FLA_Obj_ldim( T );
00084 
00085   char   trans   = 'T';
00086   int    inc_one = 1;
00087   int    i;
00088 
00089   for ( i = 0; i < m_UT; ++i )
00090   {
00091     float* upsilon11 = buff_U + (i  )*ldim_U + i;
00092     float* u12t      = buff_U + (i+1)*ldim_U + i;
00093 
00094     float* D0        = buff_D + (0  )*ldim_D;
00095     float* d1        = buff_D + (i  )*ldim_D;
00096     float* D2        = buff_D + (i+1)*ldim_D;
00097 
00098     float* tau11     = buff_T + (i  )*ldim_T + i;
00099     float* t01       = buff_T + (i  )*ldim_T;
00100 
00101     int    mn_ahead  = m_UT - i - 1;
00102     int    mn_behind = i;
00103 
00104     //------------------------------------------------------------//
00105 
00106     // FLA_Househ2_UT( upsilon11,
00107     //                 d1, tau11 );
00108     FLA_Househ2_UT_opt_float( m_D,
00109                               upsilon11,
00110                               d1, inc_one,
00111                               tau11 );
00112 
00113     if ( i > 0 )
00114     {
00115       // FLA_Gemv_external( FLA_CONJ_TRANSPOSE, FLA_ONE, D0, d1, FLA_ZERO, t01 );
00116       FLA_C2F( sgemv )( &trans,
00117                         &m_D, &mn_behind,
00118                         buff_1,
00119                         D0, &ldim_D,
00120                         d1, &inc_one,
00121                         buff_0,
00122                         t01, &inc_one );
00123     }
00124 
00125     if ( i < m_UT - 1 )
00126     {
00127       // FLA_Apply_househ2_UT( tau11, d1, u12t,
00128       //                                  D2 );
00129       FLA_Apply_househ2_UT_opt_float( m_D, mn_ahead,
00130                                       tau11,
00131                                       d1, inc_one,
00132                                       u12t, ldim_U,
00133                                       D2, ldim_D );
00134     }
00135 
00136     //------------------------------------------------------------//
00137 
00138   }
00139 
00140   return FLA_SUCCESS;
00141 }

FLA_Error FLA_QR_UT_UD_Accum_T_opt_var1_scomplex ( FLA_Obj  U,
FLA_Obj  D,
FLA_Obj  T 
)

References cgemv(), FLA_Apply_househ2_UT_opt_scomplex(), FLA_Househ2_UT_opt_scomplex(), FLA_Obj_ldim(), FLA_Obj_length(), FLA_ONE, and FLA_ZERO.

Referenced by FLA_QR_UT_UD_Accum_T_opt_var1().

00222 {
00223   scomplex* buff_U  = FLA_COMPLEX_PTR( U );
00224   scomplex* buff_D  = FLA_COMPLEX_PTR( D );
00225   scomplex* buff_T  = FLA_COMPLEX_PTR( T );
00226   scomplex* buff_1  = FLA_COMPLEX_PTR( FLA_ONE );
00227   scomplex* buff_0  = FLA_COMPLEX_PTR( FLA_ZERO );
00228 
00229   int       m_UT    = FLA_Obj_length( U );
00230   int       m_D     = FLA_Obj_length( D );
00231   int       ldim_U  = FLA_Obj_ldim( U );
00232   int       ldim_D  = FLA_Obj_ldim( D );
00233   int       ldim_T  = FLA_Obj_ldim( T );
00234  
00235   char      trans   = 'C';
00236   int       inc_one = 1;
00237   int       i;
00238 
00239   for ( i = 0; i < m_UT; ++i )
00240   {
00241     scomplex* upsilon11 = buff_U + (i  )*ldim_U + i;
00242     scomplex* u12t      = buff_U + (i+1)*ldim_U + i;
00243 
00244     scomplex* D0        = buff_D + (0  )*ldim_D;
00245     scomplex* d1        = buff_D + (i  )*ldim_D;
00246     scomplex* D2        = buff_D + (i+1)*ldim_D;
00247 
00248     scomplex* tau11     = buff_T + (i  )*ldim_T + i;
00249     scomplex* t01       = buff_T + (i  )*ldim_T;
00250 
00251     int       mn_ahead  = m_UT - i - 1;
00252     int       mn_behind = i;
00253 
00254     //------------------------------------------------------------//
00255 
00256     // FLA_Househ2_UT( upsilon11,
00257     //                 d1, tau11 );
00258     FLA_Househ2_UT_opt_scomplex( m_D,
00259                                  upsilon11,
00260                                  d1, inc_one,
00261                                  tau11 );
00262 
00263     if ( i > 0 )
00264     {
00265       // FLA_Gemv_external( FLA_CONJ_TRANSPOSE, FLA_ONE, D0, d1, FLA_ZERO, t01 );
00266       FLA_C2F( cgemv )( &trans,
00267                         &m_D, &mn_behind,
00268                         buff_1,
00269                         D0, &ldim_D,
00270                         d1, &inc_one,
00271                         buff_0,
00272                         t01, &inc_one );
00273     }
00274 
00275     if ( i < m_UT - 1 )
00276     {
00277       // FLA_Apply_househ2_UT( tau11, d1, u12t,
00278       //                                  D2 );
00279       FLA_Apply_househ2_UT_opt_scomplex( m_D, mn_ahead,
00280                                          tau11,
00281                                          d1, inc_one,
00282                                          u12t, ldim_U,
00283                                          D2, ldim_D );
00284     }
00285 
00286     //------------------------------------------------------------//
00287 
00288   }
00289 
00290   return FLA_SUCCESS;
00291 }

FLA_Error FLA_QR_UT_UD_Accum_T_unb_var1 ( FLA_Obj  U,
FLA_Obj  D,
FLA_Obj  T 
)

References FLA_Apply_househ2_UT(), FLA_Cont_with_1x3_to_1x2(), FLA_Cont_with_3x3_to_2x2(), FLA_Gemv_external(), FLA_Househ2_UT(), FLA_Obj_min_dim(), FLA_ONE, FLA_Part_1x2(), FLA_Part_2x2(), FLA_Repart_1x2_to_1x3(), FLA_Repart_2x2_to_3x3(), and FLA_ZERO.

Referenced by FLA_QR_UT_UD_internal().

00037 {
00038   FLA_Obj UTL,   UTR,      U00,  u01,       U02, 
00039           UBL,   UBR,      u10t, upsilon11, u12t,
00040                            U20,  u21,       U22;
00041 
00042   FLA_Obj DL,    DR,       D0,  d1,  D2;
00043 
00044   FLA_Obj TTL,   TTR,      T00,  t01,   T02, 
00045           TBL,   TBR,      t10t, tau11, t12t,
00046                            T20,  t21,   T22;
00047 
00048 
00049   FLA_Part_2x2( U,    &UTL, &UTR,
00050                       &UBL, &UBR,     0, 0, FLA_TL );
00051 
00052   FLA_Part_1x2( D,    &DL,  &DR,      0, FLA_LEFT );
00053 
00054   FLA_Part_2x2( T,    &TTL, &TTR,
00055                       &TBL, &TBR,     0, 0, FLA_TL );
00056 
00057   while ( FLA_Obj_min_dim( UBR ) > 0 ){
00058 
00059     FLA_Repart_2x2_to_3x3( UTL, /**/ UTR,       &U00,  /**/ &u01,       &U02,
00060                         /* ************* */   /* ************************** */
00061                                                 &u10t, /**/ &upsilon11, &u12t,
00062                            UBL, /**/ UBR,       &U20,  /**/ &u21,       &U22,
00063                            1, 1, FLA_BR );
00064 
00065     FLA_Repart_1x2_to_1x3( DL,  /**/ DR,        &D0, /**/ &d1, &D2,
00066                            1, FLA_RIGHT );
00067 
00068     FLA_Repart_2x2_to_3x3( TTL, /**/ TTR,       &T00,  /**/ &t01,   &T02,
00069                         /* ************* */   /* ************************ */
00070                                                 &t10t, /**/ &tau11, &t12t,
00071                            TBL, /**/ TBR,       &T20,  /**/ &t21,   &T22,
00072                            1, 1, FLA_BR );
00073 
00074     /*------------------------------------------------------------*/
00075 
00076     // [ upsilon11, ...
00077     //   d1, tau11 ] = FLA_Househ2_UT( upsilon11, ...
00078     //                                 d1 );
00079     FLA_Househ2_UT( upsilon11,
00080                     d1, tau11 );
00081 
00082     // t01 = D0' * d1;
00083     FLA_Gemv_external( FLA_CONJ_TRANSPOSE, FLA_ONE, D0, d1, FLA_ZERO, t01 );
00084 
00085     // [ u12t, ...
00086     //   D2 ] = FLA_Apply_househ2_UT( tau11, d1, u12t, ...
00087     //                                           D2 );
00088     FLA_Apply_househ2_UT( tau11, d1, u12t,
00089                                      D2 );
00090 
00091     /*------------------------------------------------------------*/
00092 
00093     FLA_Cont_with_3x3_to_2x2( &UTL, /**/ &UTR,       U00,  u01,       /**/ U02,
00094                                                      u10t, upsilon11, /**/ u12t,
00095                             /* ************** */  /* ************************ */
00096                               &UBL, /**/ &UBR,       U20,  u21,       /**/ U22,
00097                               FLA_TL );
00098 
00099     FLA_Cont_with_1x3_to_1x2( &DL,  /**/ &DR,        D0, d1, /**/ D2,
00100                               FLA_LEFT );
00101 
00102     FLA_Cont_with_3x3_to_2x2( &TTL, /**/ &TTR,       T00,  t01,   /**/ T02,
00103                                                      t10t, tau11, /**/ t12t,
00104                             /* ************** */  /* ********************** */
00105                               &TBL, /**/ &TBR,       T20,  t21,   /**/ T22,
00106                               FLA_TL );
00107   }
00108 
00109   return FLA_SUCCESS;
00110 }

FLA_Error FLA_QR_UT_UD_blk_var1 ( FLA_Obj  U,
FLA_Obj  D,
FLA_Obj  T,
fla_qrutud_t cntl 
)

References FLA_Axpy_internal(), FLA_Cont_with_1x3_to_1x2(), FLA_Cont_with_3x3_to_2x2(), FLA_Copy_internal(), FLA_Determine_blocksize(), FLA_Gemm_internal(), FLA_MINUS_ONE, FLA_Obj_min_dim(), FLA_Obj_set_to_scalar(), FLA_Obj_width(), FLA_ONE, FLA_Part_1x2(), FLA_Part_2x1(), FLA_Part_2x2(), FLA_QR_UT_UD_internal(), FLA_Repart_1x2_to_1x3(), FLA_Repart_2x2_to_3x3(), FLA_Trsm_internal(), and FLA_ZERO.

Referenced by FLA_QR_UT_UD_internal().

00037 {
00038   FLA_Obj UTL,   UTR,      U00, U01, U02, 
00039           UBL,   UBR,      U10, U11, U12,
00040                            U20, U21, U22;
00041 
00042   FLA_Obj DL,    DR,       D0,  D1,  D2;
00043 
00044   FLA_Obj TL,    TR,       T0,  T1,  W12;
00045 
00046   FLA_Obj W12T, W12B;
00047 
00048   FLA_Obj T1T, T2B;
00049 
00050   dim_t b;
00051 
00052   FLA_Part_2x2( U,    &UTL, &UTR,
00053                       &UBL, &UBR,     0, 0, FLA_TL );
00054 
00055   FLA_Part_1x2( D,    &DL,  &DR,      0, FLA_LEFT );
00056 
00057   FLA_Part_1x2( T,    &TL,  &TR,      0, FLA_LEFT );
00058 
00059   while ( FLA_Obj_min_dim( UBR ) > 0 ){
00060 
00061     b = FLA_Determine_blocksize( UBR, FLA_BR, FLA_Cntl_blocksize( cntl ) );
00062 
00063     FLA_Repart_2x2_to_3x3( UTL, /**/ UTR,       &U00, /**/ &U01, &U02,
00064                         /* ************* */   /* ******************** */
00065                                                 &U10, /**/ &U11, &U12,
00066                            UBL, /**/ UBR,       &U20, /**/ &U21, &U22,
00067                            b, b, FLA_BR );
00068 
00069     FLA_Repart_1x2_to_1x3( DL,  /**/ DR,        &D0, /**/ &D1, &D2,
00070                            b, FLA_RIGHT );
00071 
00072     FLA_Repart_1x2_to_1x3( TL,  /**/ TR,        &T0, /**/ &T1, &W12,
00073                            b, FLA_RIGHT );
00074 
00075     /*------------------------------------------------------------*/
00076 
00077     /*
00078       T1T = FLA_Top_part( T1, b );
00079     */
00080 
00081     FLA_Part_2x1( T1,   &T1T, 
00082                         &T2B, b, FLA_TOP );
00083 
00084     /*
00085       [ U11, ...
00086         D1, T1 ] = FLA_QR_UT_UD_internal( U11
00087                                           D1, T1T );
00088     */
00089 
00090     FLA_QR_UT_UD_internal( U11,
00091                            D1, T1T, 
00092                            FLA_Cntl_sub_qrutud( cntl ) );
00093 
00094 
00095     if ( FLA_Obj_width( U12 ) > 0 )
00096     {
00097       /*
00098         W12T = FLA_Top_part( W12, b );
00099       */
00100 
00101       FLA_Part_2x1( W12,  &W12T, 
00102                           &W12B, b, FLA_TOP );
00103 
00104       /*
00105         W12T = inv( triu( T1T ) )' * ( U12 + D1' * D2 );
00106       */
00107 
00108       FLA_Copy_internal( U12, W12T,
00109                          FLA_Cntl_sub_copy( cntl ) );
00110 
00111       FLA_Gemm_internal( FLA_CONJ_TRANSPOSE, FLA_NO_TRANSPOSE,
00112                          FLA_ONE, D1, D2, FLA_ONE, W12T,
00113                          FLA_Cntl_sub_gemm1( cntl ) );
00114 
00115       FLA_Trsm_internal( FLA_LEFT, FLA_UPPER_TRIANGULAR, 
00116                          FLA_CONJ_TRANSPOSE, FLA_NONUNIT_DIAG, 
00117                          FLA_ONE, T1T, W12T,
00118                          FLA_Cntl_sub_trsm( cntl ) );
00119 
00120       /*
00121         U12 = U12 - W12T;
00122         D2  = D2  - D1 * W12T;
00123       */
00124 
00125       FLA_Axpy_internal( FLA_MINUS_ONE, W12T, U12,
00126                          FLA_Cntl_sub_axpy( cntl ) );
00127 
00128       FLA_Gemm_internal( FLA_NO_TRANSPOSE, FLA_NO_TRANSPOSE, 
00129                          FLA_MINUS_ONE, D1, W12T, FLA_ONE, D2,
00130                          FLA_Cntl_sub_gemm2( cntl ) );
00131 
00132       FLA_Obj_set_to_scalar( FLA_ZERO, W12T );
00133     }
00134 
00135     /*------------------------------------------------------------*/
00136 
00137     FLA_Cont_with_3x3_to_2x2( &UTL, /**/ &UTR,       U00, U01, /**/ U02,
00138                                                      U10, U11, /**/ U12,
00139                             /* ************** */  /* ****************** */
00140                               &UBL, /**/ &UBR,       U20, U21, /**/ U22,
00141                               FLA_TL );
00142 
00143     FLA_Cont_with_1x3_to_1x2( &DL,  /**/ &DR,        D0, D1, /**/ D2,
00144                               FLA_LEFT );
00145 
00146     FLA_Cont_with_1x3_to_1x2( &TL,  /**/ &TR,        T0, T1, /**/ W12,
00147                               FLA_LEFT );
00148 
00149   }
00150 
00151   return FLA_SUCCESS;
00152 }

FLA_Error FLA_QR_UT_UD_blk_var2 ( FLA_Obj  U,
FLA_Obj  D,
FLA_Obj  T,
fla_qrutud_t cntl 
)

References FLA_Cont_with_3x1_to_2x1(), FLA_Determine_blocksize(), FLA_Obj_length(), FLA_Part_2x1(), FLA_QR_UT_UD_internal(), and FLA_Repart_2x1_to_3x1().

Referenced by FLA_QR_UT_UD_internal().

00037 {
00038   FLA_Obj DT,              D0,
00039           DB,              D1,
00040                            D2;
00041 
00042   FLA_Obj TT,              T0,
00043           TB,              T1,
00044                            T2;
00045 
00046   dim_t b;
00047 
00048   FLA_Part_2x1( D,    &DT, 
00049                       &DB,            0, FLA_TOP );
00050 
00051   FLA_Part_2x1( T,    &TT, 
00052                       &TB,            0, FLA_TOP );
00053 
00054   while ( FLA_Obj_length( DT ) < FLA_Obj_length( D ) ){
00055 
00056     b = FLA_Determine_blocksize( DB, FLA_BOTTOM, FLA_Cntl_blocksize( cntl ) );
00057 
00058     FLA_Repart_2x1_to_3x1( DT,                &D0, 
00059                         /* ** */            /* ****** */
00060                                               &D1, 
00061                            DB,                &D2,        b, FLA_BOTTOM );
00062 
00063     FLA_Repart_2x1_to_3x1( TT,                &T0, 
00064                         /* ** */            /* ****** */
00065                                               &T1, 
00066                            TB,                &T2,        b, FLA_BOTTOM );
00067 
00068     /*------------------------------------------------------------*/
00069 
00070     /*
00071       [ U, ...
00072         D1, T ] = FLA_QR_UT_UD_internal( U
00073                                          D1, T1 );
00074     */
00075 
00076     FLA_QR_UT_UD_internal( U,
00077                            D1, T1, 
00078                            FLA_Cntl_sub_qrutud( cntl ) );
00079 
00080     /*------------------------------------------------------------*/
00081 
00082     FLA_Cont_with_3x1_to_2x1( &DT,                D0, 
00083                                                   D1, 
00084                             /* ** */           /* ****** */
00085                               &DB,                D2,     FLA_TOP );
00086 
00087     FLA_Cont_with_3x1_to_2x1( &TT,                T0, 
00088                                                   T1, 
00089                             /* ** */           /* ****** */
00090                               &TB,                T2,     FLA_TOP );
00091   }
00092 
00093   return FLA_SUCCESS;
00094 }


Generated on Mon Jul 6 05:45:56 2009 for libflame by  doxygen 1.5.9