Пример #1
0
float
Stokhos::QuadOrthogPolyExpansion<int, float, Stokhos::CUDAStorage<int,float> >::
compute_times_coeff(int k, const ExprT1& a, const ExprT2& b) const
{
  int pa = a.size();
  int pb = b.size();

  typename Cijk_type::k_iterator k_it = Cijk->find_k(k);

  if (pa > 1 && pb > 1) {
    float cc = float(0);
    float aa, bb, cijk;
    int i,j;
    cc = float(0.0);
    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 < pb) {
	if (j == 0)
	  bb = b.val();
	else
	  bb = b.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 < pa) {
	    if (i == 0)
	      aa = a.val();
	    else
	      aa = a.higher_order_coeff(i);
	  }
	  cc += cijk*aa*bb;
	}
      }
    }
    return cc / basis->norm_squared(k);
  }
  else if (k == 0)
    return a.val() * b.val();
  else if (pa > 1) {
    return a.higher_order_coeff(k)*b.val();
  }
  else {
    return a.val()*b.higher_order_coeff(k);
  }
}
Пример #2
0
value_type
Stokhos::PseudoSpectralOrthogPolyExpansion<ordinal_type, value_type, point_compare_type, node_type>::
compute_times_coeff(ordinal_type i, const ExprT1& a, const ExprT2& b) const
{
  ordinal_type pa = a.size();
  ordinal_type pb = b.size();

  if (pa > 1 && pb > 1) {
    ordinal_type k_lim = pa;
    ordinal_type j_lim = pb;
    if (pb < pa) {
      k_lim = pb;
      j_lim = pa;
    }
    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::compute_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 < k_lim) {
	if (pa < pb) {
	  if (k == 0)
	    aa = a.val();
	  else
	    aa = a.higher_order_coeff(k);
	}
	else {
	  if (k == 0)
	    aa = b.val();
	  else
	    aa = b.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 < j_lim) {
	    if (pa < pb) {
	      if (j == 0)
		bb = b.val();
	      else
		bb = b.higher_order_coeff(j);
	    }
	    else {
	      if (j == 0)
		bb = a.val();
	      else
		bb = a.higher_order_coeff(j);
	    }
	    cc += cijk*aa*bb;
	  }
	}
      }
    }
    return cc / this->basis->norm_squared(i);
  }
  else if (i == 0)
    return a.val() * b.val();
  else if (pa > 1) {
    return a.higher_order_coeff(i)*b.val();
  }
  else {
    return a.val()*b.higher_order_coeff(i);
  }
}