void Stokhos::QuadOrthogPolyExpansion<ordinal_type, value_type>:: timesEqual(Stokhos::OrthogPolyApprox<ordinal_type, value_type>& c, const Stokhos::OrthogPolyApprox<ordinal_type, value_type>& x) { if (use_quad_for_times) { binary_op(times_quad_func(), c, c, x); return; } ordinal_type p = c.size(); ordinal_type xp = x.size(); ordinal_type pc; if (p > 1 && xp > 1) pc = sz; else pc = p*xp; TEST_FOR_EXCEPTION(sz < pc, std::logic_error, "Stokhos::QuadOrthogPolyExpansion::timesEqual()" << ": Expansion size (" << sz << ") is too small for computation."); if (c.size() != pc) c.resize(pc); value_type* cc = c.coeff(); const value_type* xc = x.coeff(); if (p > 1 && xp > 1) { // Copy c coefficients into temporary array value_type* tc = Stokhos::ds_array<value_type>::get_and_fill(cc,p); value_type tmp, cijk; ordinal_type i,j; for (ordinal_type k=0; k<pc; k++) { tmp = value_type(0.0); ordinal_type n = Cijk->num_values(k); for (ordinal_type l=0; l<n; l++) { Cijk->value(k,l,i,j,cijk); if (i < p && j < xp) tmp += cijk*tc[i]*xc[j]; } cc[k] = tmp / basis->norm_squared(k); } } else if (p > 1) { for (ordinal_type i=0; i<p; i++) cc[i] *= xc[0]; } else if (xp > 1) { for (ordinal_type i=1; i<xp; i++) cc[i] = cc[0]*xc[i]; cc[0] *= xc[0]; } else { cc[0] *= xc[0]; } }
void Stokhos::QuadOrthogPolyExpansion<ordinal_type, value_type>:: times(Stokhos::OrthogPolyApprox<ordinal_type, value_type>& c, const Stokhos::OrthogPolyApprox<ordinal_type, value_type>& a, const Stokhos::OrthogPolyApprox<ordinal_type, value_type>& b) { if (use_quad_for_times) { binary_op(times_quad_func(), c, a, b); return; } ordinal_type pa = a.size(); ordinal_type pb = b.size(); ordinal_type pc; if (pa > 1 && pb > 1) pc = sz; else pc = pa*pb; TEST_FOR_EXCEPTION(sz < pc, std::logic_error, "Stokhos::QuadOrthogPolyExpansion::times()" << ": Expansion size (" << sz << ") is too small for computation."); if (c.size() != pc) c.resize(pc); const value_type* ca = a.coeff(); const value_type* cb = b.coeff(); value_type* cc = c.coeff(); if (pa > 1 && pb > 1) { value_type tmp, cijk; ordinal_type i,j; for (ordinal_type k=0; k<pc; k++) { tmp = value_type(0.0); ordinal_type n = Cijk->num_values(k); for (ordinal_type l=0; l<n; l++) { Cijk->value(k,l,i,j,cijk); if (i < pa && j < pb) tmp += cijk*ca[i]*cb[j]; } cc[k] = tmp / basis->norm_squared(k); } } else if (pa > 1) { for (ordinal_type i=0; i<pc; i++) cc[i] = ca[i]*cb[0]; } else if (pb > 1) { for (ordinal_type i=0; i<pc; i++) cc[i] = ca[0]*cb[i]; } else { cc[0] = ca[0]*cb[0]; } }
void Stokhos::PseudoSpectralOrthogPolyExpansion<ordinal_type, value_type, point_compare_type, node_type>:: times(Stokhos::OrthogPolyApprox<ordinal_type, value_type, node_type>& c, const Stokhos::OrthogPolyApprox<ordinal_type, value_type, node_type>& a, const Stokhos::OrthogPolyApprox<ordinal_type, value_type, node_type>& b) { if (use_quad_for_times) binary_op(times_quad_func(), c, a, b); else OrthogPolyExpansionBase<ordinal_type, value_type, node_type>::times(c, a, b); }