static inline void exec(A1& out, A2& in, int inner_dim_1, int inner_dim_2) { using namespace ivl::types; if(in.iter_specialization() == I_SPECIALIZED) { loop_base_nd<3, F, A1, A2, O_OPTIMAL_ACCESS, I_OPTIMAL_ACCESS, t_false, t_false, O_ITER_1, typename types::best_fast_iterator_nd<A2, I_SPECIALIZED>::type, term, term>::exec(out, in, inner_dim_1, inner_dim_2); } else { loop_base_nd<2, F, A1, A2, O_OPTIMAL_ACCESS, I_OPTIMAL_ACCESS, t_false, number<I_SPECIALIZED - 1>, O_ITER_1, term, term, term >::exec(out, in, inner_dim_1, inner_dim_2); } }
BOOST_FORCEINLINE result_type operator()( A0& a, A1& w, A2& vr) const { char jobvl = 'N'; char jobvr = 'V'; result_type info = 0; details::workspace<typename A0::value_type> wk; nt2_la_int n = nt2::width(a); BOOST_ASSERT_MSG(n == nt2_la_int(nt2::height(a)), "input must be square"); nt2_la_int lda = nt2::max(a.leading_size(), One<size_t>()); nt2_la_int ldvl = n; nt2_la_int ldvr = vr.leading_size(); NT2_F77NAME(cgeev) ( &jobvl, &jobvr , &n , 0 /*a*/, &lda , 0 /*w*/ , 0 /*vl*/, &ldvl , 0 /*vr*/, &ldvr , wk.main(), details::query() , wk.reals() , &info); info = nt2::geev_wvr(a, w, vr, wk); return info; }