value_type Stokhos::PseudoSpectralOrthogPolyExpansion<ordinal_type, value_type, point_compare_type, node_type>:: fast_compute_times_coeff(ordinal_type i, const ExprT1& a, const ExprT2& b) const { typename Cijk_type::i_iterator i_it = this->Cijk->find_i(i); #ifdef STOKHOS_DEBUG TEUCHOS_TEST_FOR_EXCEPTION(i_it == this->Cijk->i_end(), std::logic_error, "Stokhos::PseudoSpectralOrthogPolyExpansion::fast_ompute_times_coeff()" << ": Index " << i << " is out of range [0," << this->Cijk->num_i() << ")!"); #endif value_type cc = value_type(0); value_type aa, bb, cijk; ordinal_type j, k; for (typename Cijk_type::ik_iterator k_it = this->Cijk->k_begin(i_it); k_it != this->Cijk->k_end(i_it); ++k_it) { k = index(k_it); if (k == 0) aa = a.val(); else aa = a.higher_order_coeff(k); for (typename Cijk_type::ikj_iterator j_it = this->Cijk->j_begin(k_it); j_it != this->Cijk->j_end(k_it); ++j_it) { j = index(j_it); cijk = value(j_it); if (j == 0) bb = b.val(); else bb = b.higher_order_coeff(j); cc += cijk*aa*bb; } } return cc / this->basis->norm_squared(i); }
float Stokhos::QuadOrthogPolyExpansion<int, float, Stokhos::CUDAStorage<int,float> >:: fast_compute_times_coeff(int k, const ExprT1& a, const ExprT2& b) const { float cc = float(0); float aa, bb, cijk; int i,j; typename Cijk_type::k_iterator k_it = Cijk->find_k(k); for (typename Cijk_type::kj_iterator j_it = Cijk->j_begin(k_it); j_it != Cijk->j_end(k_it); ++j_it) { j = index(j_it); if (j == 0) bb = b.val(); else bb = b.fast_higher_order_coeff(j); for (typename Cijk_type::kji_iterator i_it = Cijk->i_begin(j_it); i_it != Cijk->i_end(j_it); ++i_it) { i = index(i_it); cijk = value(i_it); if (i == 0) aa = a.val(); else aa = a.fast_higher_order_coeff(i); cc += cijk*aa*bb; } } return cc / basis->norm_squared(k); }