{
FLA_Error r_val;
int i, k;
int k_iter = 0;
int n_deflations = 0;
for ( i = m_A - 1; i > 1; --i )
{
int m_ATL = i + 1;
int k_left = n_G - k_iter;
r_val = FLA_Tevd_eigval_n_opd_var1( m_ATL,
k_left,
buff_d, inc_d,
buff_e, inc_e,
&k );
k_iter += k;
n_deflations += 1;
if ( r_val == FLA_FAILURE )
{
#ifdef PRINTF
printf( "FLA_Tevd_iteracc_n_opd_var1: failed to converge (m_A11 = %d) after %2d iters k_total=%d/%d\n", i, k, k_iter, n_G );
#endif
*n_iter_perf = k_iter;
return n_deflations;
}
#ifdef PRINTF
if ( r_val == i )
printf( "FLA_Tevd_iteracc_n_opd_var1: found eig %22.15e in col %3d (n=%d) after %2d iters k_total=%d/%d\n", buff_d[ r_val*inc_d ], ijTL+r_val, m_ATL, k, k_iter, n_G );
else
printf( "FLA_Tevd_iteracc_n_opd_var1: split occurred in col %3d (n=%d) after %2d iters k_total=%d/%d\n", ijTL+r_val, m_ATL, k, k_iter, n_G );
#endif
if ( k_iter == n_G )
{
*n_iter_perf = k_iter;
return n_deflations;
}
if ( r_val != i )
{
int m_TLr = r_val + 1;
int m_BRr = m_ATL - m_TLr;
int ijTLr = 0;
int ijBRr = m_TLr;
int n_Gr = n_G - k_iter;
double* dTL = buff_d + (0 )*inc_d;
double* eTL = buff_e + (0 )*inc_e;
double* dBR = buff_d + (ijBRr)*inc_d;
double* eBR = buff_e + (ijBRr)*inc_e;
int n_deflationsTL;
int n_deflationsBR;
int n_iter_perfTL;
int n_iter_perfBR;
#ifdef PRINTF
printf( "FLA_Tevd_iteracc_n_opd_var1: Internal deflation in col %d\n", ijTL+r_val );
printf( "FLA_Tevd_iteracc_n_opd_var1: alpha11 = %23.19e\n", buff_d[r_val*inc_d] );
printf( "FLA_Tevd_iteracc_n_opd_var1: alpha21 alpha22 = %23.19e %23.19e\n", buff_e[r_val*inc_e], buff_d[(r_val+1)*inc_d] );
#endif
#ifdef PRINTF
printf( "FLA_Tevd_iteracc_n_opd_var1: recursing: m_TLr m_BRr: %d %d\n", m_TLr, m_BRr );
printf( "FLA_Tevd_iteracc_n_opd_var1: ijTLr ijBRr: %d %d\n", ijTLr, ijBRr );
printf( "FLA_Tevd_iteracc_n_opd_var1: GB(0,0) i,j: %d %d\n", ijTL + m_TLr+1, k_iter );
#endif
n_deflationsTL = FLA_Tevd_iteracc_n_opd_var1( m_TLr,
n_Gr,
ijTL + ijTLr,
dTL, inc_d,
eTL, inc_e,
&n_iter_perfTL );
n_deflationsBR = FLA_Tevd_iteracc_n_opd_var1( m_BRr,
n_Gr,
ijTL + ijBRr,
dBR, inc_d,
eBR, inc_e,
&n_iter_perfBR );
*n_iter_perf = k_iter + max( n_iter_perfTL, n_iter_perfBR );
#ifdef PRINTF
printf( "FLA_Tevd_iteracc_n_opd_var1: num deflations: %d = (prev:%d, TL:%d, BR:%d)\n", n_deflations + n_deflationsTL + n_deflationsBR, n_deflations, n_deflationsTL, n_deflationsBR );
printf( "FLA_Tevd_iteracc_n_opd_var1: num iterations: %d = (prev:%d, TL:%d, BR:%d)\n", *n_iter_perf, k_iter, n_iter_perfTL, n_iter_perfBR );
#endif
return n_deflations + n_deflationsTL + n_deflationsBR;
}
}
if ( m_A > 1 )
{
double* alpha11 = buff_d + (0 )*inc_d;
double* alpha21 = buff_e + (0 )*inc_e;
double* alpha22 = buff_d + (1 )*inc_d;
double lambda1;
double lambda2;
FLA_Hev_2x2_opd( alpha11,
alpha21,
alpha22,
&lambda1,
&lambda2 );
*alpha11 = lambda1;
*alpha22 = lambda2;
*alpha21 = 0.0;
k_iter += 1;
n_deflations += 1;
#ifdef PRINTF
printf( "FLA_Tevd_iteracc_n_opd_var1: Hevv eig %22.15e in col %3d (n=%d) after %2d iters k_total=%d/%d\n", buff_d[ 1*inc_d ], ijTL+1, 2, 1, k_iter, n_G );
printf( "FLA_Tevd_iteracc_n_opd_var1: Hevv eig %22.15e in col %3d (n=%d) after %2d iters k_total=%d/%d\n", buff_d[ 0*inc_d ], ijTL+0, 2, 0, k_iter, n_G );
#endif
}
*n_iter_perf = k_iter;
return n_deflations;
}