void AdaptiveSparseGrid<Scalar,UserVector>::build_diffRule( CubatureTensorSorted<Scalar> & outRule, std::vector<int> index, AdaptiveSparseGridInterface<Scalar,UserVector> & problem_data) { int numPoints = 0; int dimension = problem_data.getDimension(); bool isNormalized = problem_data.isNormalized(); std::vector<EIntrepidBurkardt> rule1D; problem_data.getRule(rule1D); std::vector<EIntrepidGrowth> growth1D; problem_data.getGrowth(growth1D); for (int i=0; i<dimension; i++) { // Compute 1D rules numPoints = growthRule1D(index[i],growth1D[i],rule1D[i]); CubatureLineSorted<Scalar> diffRule1(rule1D[i],numPoints,isNormalized); if (numPoints!=1) { // Compute differential rule numPoints = growthRule1D(index[i]-1,growth1D[i],rule1D[i]); CubatureLineSorted<Scalar> rule1(rule1D[i],numPoints,isNormalized); diffRule1.update(-1.0,rule1,1.0); } // Build Tensor Rule outRule = kron_prod<Scalar>(outRule,diffRule1); } }
Quadrature<Real>::Quadrature(const int dimension, const std::vector<int> &numPoints1D, const std::vector<EQuadrature> &rule1D, const std::vector<EGrowth> &growth1D, const bool isNormalized) : dimension_(dimension) { TEUCHOS_TEST_FOR_EXCEPTION((dimension!=(int)numPoints1D.size()|| dimension!=(int)rule1D.size()|| dimension!=(int)growth1D.size()),std::out_of_range, ">>> ERROR (Quadrature): Dimension mismatch for inputs."); accuracy_.clear(); accuracy_.resize(dimension); std::vector<int> degree(1); Quadrature<Real> newRule(0,1); for (int i=0; i<dimension; i++) { // Compute 1D rules int numPoints = growthRule1D(numPoints1D[i],growth1D[i],rule1D[i]); Quadrature<Real> rule1(rule1D[i],numPoints,isNormalized); rule1.getAccuracy(degree); accuracy_.push_back(degree[0]); // Build Tensor Rule newRule = kron_prod<Real>(newRule,rule1); } typename std::map<std::vector<Real>,int>::iterator it; int loc = 0; std::vector<Real> node; for (it=newRule.begin(); it!=newRule.end(); it++) { node = it->first; addPointAndWeight(node,newRule.getWeight(node),loc); loc++; } if (isNormalized) { normalize(); } }