void Stokhos::StieltjesPCEBasis<ordinal_type, value_type>:: setup() { // Evaluate PCE at quad points const Teuchos::Array< Teuchos::Array<value_type> >& quad_points = quad->getQuadPoints(); ordinal_type nqp = pce_weights.size(); pce_vals.resize(nqp); phi_vals.resize(nqp); for (ordinal_type i=0; i<nqp; i++) { pce_vals[i] = pce->evaluate(quad_points[i], basis_values[i]); phi_vals[i].resize(this->p+1); } if (project_integrals) phi_pce_coeffs.resize(basis->size()); RecurrenceBasis<ordinal_type,value_type>::setup(); ordinal_type sz = pce->size(); fromStieltjesMat.putScalar(0.0); for (ordinal_type i=0; i<=this->p; i++) { for (ordinal_type j=0; j<sz; j++) { for (ordinal_type k=0; k<nqp; k++) fromStieltjesMat(i,j) += pce_weights[k]*phi_vals[k][i]*basis_values[k][j]; fromStieltjesMat(i,j) /= basis->norm_squared(j); } } }
void Stokhos::LanczosPCEBasis<ordinal_type, value_type>:: setup() { RecurrenceBasis<ordinal_type,value_type>::setup(); // Compute transformation matrix back to original basis ordinal_type sz = pce->size(); fromStieltjesMat.shape(sz, this->p+1); fromStieltjesMat.putScalar(0.0); const Teuchos::Array< Teuchos::Array<value_type> >& basis_values = quad->getBasisAtQuadPoints(); for (ordinal_type i=0; i<sz; i++) { for (ordinal_type j=0; j<=this->p; j++) { for (ordinal_type k=0; k<nqp; k++) fromStieltjesMat(i,j) += pce_weights[k]*lanczos_vecs(k,j)*basis_values[k][i]; fromStieltjesMat(i,j) /= pce->basis()->norm_squared(i); } } // Project original PCE into the new basis new_pce.resize(this->p+1); vector_type u(sz); for (ordinal_type i=0; i<sz; i++) u[i] = (*pce)[i]*pce->basis()->norm_squared(i); new_pce.multiply(Teuchos::TRANS, Teuchos::NO_TRANS, 1.0, fromStieltjesMat, u, 0.0); for (ordinal_type i=0; i<=this->p; i++) new_pce[i] /= this->norms[i]; }
Stokhos::StieltjesPCEBasis<ordinal_type, value_type>:: StieltjesPCEBasis( ordinal_type p, const Teuchos::RCP<const Stokhos::OrthogPolyApprox<ordinal_type, value_type> >& pce_, const Teuchos::RCP<const Stokhos::Quadrature<ordinal_type, value_type> >& quad_, bool use_pce_quad_points_, bool normalize, bool project_integrals_, const Teuchos::RCP<const Stokhos::Sparse3Tensor<ordinal_type, value_type> >& Cijk_) : RecurrenceBasis<ordinal_type, value_type>("Stieltjes PCE", p, normalize), pce(pce_), quad(quad_), pce_weights(quad->getQuadWeights()), basis_values(quad->getBasisAtQuadPoints()), pce_vals(), phi_vals(), use_pce_quad_points(use_pce_quad_points_), fromStieltjesMat(p+1,pce->size()), project_integrals(project_integrals_), basis(pce->basis()), Cijk(Cijk_), phi_pce_coeffs() { // Evaluate PCE at quad points const Teuchos::Array< Teuchos::Array<value_type> >& quad_points = quad->getQuadPoints(); ordinal_type nqp = pce_weights.size(); pce_vals.resize(nqp); phi_vals.resize(nqp); for (ordinal_type i=0; i<nqp; i++) { pce_vals[i] = pce->evaluate(quad_points[i], basis_values[i]); phi_vals[i].resize(p+1); } if (project_integrals) phi_pce_coeffs.resize(basis->size()); // Compute coefficients via Stieltjes stieltjes(0, p+1, pce_weights, pce_vals, this->alpha, this->beta, this->norms, phi_vals); for (ordinal_type i=0; i<=p; i++) this->delta[i] = value_type(1.0); ordinal_type sz = pce->size(); fromStieltjesMat.putScalar(0.0); for (ordinal_type i=0; i<=p; i++) { for (ordinal_type j=0; j<sz; j++) { for (ordinal_type k=0; k<nqp; k++) fromStieltjesMat(i,j) += pce_weights[k]*phi_vals[k][i]*basis_values[k][j]; fromStieltjesMat(i,j) /= basis->norm_squared(j); } } // Setup rest of recurrence basis //this->setup(); this->gamma[0] = value_type(1); for (ordinal_type k=1; k<=p; k++) { this->gamma[k] = value_type(1); } //If you want normalized polynomials, set gamma and reset the norms to 1. if( normalize ) { for (ordinal_type k=0; k<=p; k++) { this->gamma[k] = value_type(1)/std::sqrt(this->norms[k]); this->norms[k] = value_type(1); } } }