{
FLA_Error r_val;
int i, k;
int k_iter = 0;
int n_deflations = 0;
for ( i = m_A - 1; i > 1; --i )
{
dcomplex* G1 = buff_G + (k_iter)*cs_G;
dcomplex* H1 = buff_H + (k_iter)*cs_H;
int m_ATL = i + 1;
int k_left = n_GH - k_iter;
r_val = FLA_Bsvd_sinval_v_opd_var1( m_ATL,
n_GH,
k_left,
tol,
thresh,
G1, rs_G, cs_G,
H1, rs_H, cs_H,
buff_d, inc_d,
buff_e, inc_e,
&k );
k_iter += k;
n_deflations += 1;
if ( r_val == FLA_FAILURE )
{
#ifdef PRINTF
printf( "FLA_Bsvd_iteracc_v_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_Bsvd_iteracc_v_opd_var1: found sv %22.15e in col %3d (n=%d) after %2d it k_tot=%d/%d\n", buff_d[ r_val*inc_d ], ijTL+r_val, m_ATL, k, k_iter, n_GH );
else
printf( "FLA_Bsvd_iteracc_v_opd_var1: split occurred in col %3d. (n=%d) after %2d it k_tot=%d/%d\n", r_val, m_ATL, k, k_iter, n_GH );
#endif
if ( k_iter == n_GH )
{
*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_GHr = n_GH - k_iter;
double* dTL = buff_d + (0 )*inc_d;
double* eTL = buff_e + (0 )*inc_e;
dcomplex* GT = buff_G + (0 )*rs_G + (k_iter)*cs_G;
dcomplex* HT = buff_H + (0 )*rs_H + (k_iter)*cs_H;
double* dBR = buff_d + (ijBRr)*inc_d;
double* eBR = buff_e + (ijBRr)*inc_e;
dcomplex* GB = buff_G + (ijBRr)*rs_G + (k_iter)*cs_G;
dcomplex* HB = buff_H + (ijBRr)*rs_H + (k_iter)*cs_H;
int n_deflationsTL;
int n_deflationsBR;
int n_iter_perfTL;
int n_iter_perfBR;
#ifdef PRINTF
printf( "FLA_Bsvd_iteracc_v_opd_var1: Deflation occurred in col %d\n", r_val );
printf( "FLA_Bsvd_iteracc_v_opd_var1: alpha11 alpha12 = %22.15e %22.15e\n", buff_d[r_val*inc_d], buff_e[(r_val)*inc_e] );
printf( "FLA_Bsvd_iteracc_v_opd_var1: alpha22 = %37.15e\n", buff_d[(r_val+1)*inc_d] );
printf( "FLA_Bsvd_iteracc_v_opd_var1: recursing: ijTLr m_TLr: %d %d\n", ijTLr, m_TLr );
printf( "FLA_Bsvd_iteracc_v_opd_var1: GB(0,0) i,j: %d %d\n", ijTL + m_TLr+1, k_iter );
#endif
n_deflationsTL = FLA_Bsvd_iteracc_v_opd_var1( m_TLr,
n_GHr,
ijTL + ijTLr,
tol,
thresh,
dTL, inc_d,
eTL, inc_e,
GT, rs_G, cs_G,
HT, rs_H, cs_H,
&n_iter_perfTL );
#ifdef PRINTF
printf( "FLA_Bsvd_iteracc_v_opd_var1: returning: ijTLr m_TLr: %d %d\n", ijTLr, m_TLr );
printf( "FLA_Bsvd_iteracc_v_opd_var1: recursing: ijBRr m_BRr: %d %d\n", ijBRr, m_BRr );
printf( "FLA_Bsvd_iteracc_v_opd_var1: GB(0,0) i,j: %d %d\n", ijTL + m_TLr+1, k_iter );
#endif
n_deflationsBR = FLA_Bsvd_iteracc_v_opd_var1( m_BRr,
n_GHr,
ijTL + ijBRr,
tol,
thresh,
dBR, inc_d,
eBR, inc_e,
GB, rs_G, cs_G,
HB, rs_H, cs_H,
&n_iter_perfBR );
#ifdef PRINTF
printf( "FLA_Bsvd_iteracc_v_opd_var1: returning: ijBRr m_BRr: %d %d\n", ijBRr, m_BRr );
#endif
*n_iter_perf = k_iter + max( n_iter_perfTL, n_iter_perfBR );
return n_deflations + n_deflationsTL + n_deflationsBR;
}
}
if ( m_A > 1 )
{
dcomplex* g1 = buff_G + (k_iter)*cs_G;
dcomplex* h1 = buff_H + (k_iter)*cs_H;
double* alpha11 = buff_d + (0 )*inc_d;
double* alpha12 = buff_e + (0 )*inc_e;
double* alpha22 = buff_d + (1 )*inc_d;
double smin;
double smax;
double gammaL;
double sigmaL;
double gammaR;
double sigmaR;
FLA_Svv_2x2_opd( alpha11,
alpha12,
alpha22,
&smin,
&smax,
&gammaL,
&sigmaL,
&gammaR,
&sigmaR );
*alpha11 = smax;
*alpha22 = smin;
*alpha12 = 0.0;
g1[0].real = gammaL;
g1[0].imag = sigmaL;
h1[0].real = gammaR;
h1[0].imag = sigmaR;
k_iter += 1;
n_deflations += 1;
#ifdef PRINTF
printf( "FLA_Bsvd_iteracc_v_opd_var1: Svv sval %22.15e in col %3d (n=%d) after %2d it k_tot=%d/%d\n", buff_d[ 1*inc_d ], ijTL+1, 2, 1, k_iter, n_GH );
printf( "FLA_Bsvd_iteracc_v_opd_var1: Svv sval %22.15e in col %3d (n=%d) after %2d it k_tot=%d/%d\n", buff_d[ 0*inc_d ], ijTL+0, 2, 0, k_iter, n_GH );
#endif
}
*n_iter_perf = k_iter;
return n_deflations;
}