Scalar AdaptiveSparseGrid<Scalar,UserVector>::refine_grid( typename std::multimap<Scalar,std::vector<int> > & indexSet, UserVector & integralValue, AdaptiveSparseGridInterface<Scalar,UserVector> & problem_data) { int dimension = problem_data.getDimension(); std::vector<EIntrepidBurkardt> rule1D; problem_data.getRule(rule1D); std::vector<EIntrepidGrowth> growth1D; problem_data.getGrowth(growth1D); // Copy Multimap into a Set for ease of use typename std::multimap<Scalar,std::vector<int> >::iterator it; std::set<std::vector<int> > oldSet; std::set<std::vector<int> >::iterator it1(oldSet.begin()); for (it=indexSet.begin(); it!=indexSet.end(); it++) { oldSet.insert(it1,it->second); it1++; } indexSet.clear(); // Find Possible Active Points int flag = 1; std::vector<int> index(dimension,0); typename std::multimap<Scalar,std::vector<int> > activeSet; for (it1=oldSet.begin(); it1!=oldSet.end(); it1++) { index = *it1; for (int i=0; i<dimension; i++) { index[i]++; flag = (int)(!oldSet.count(index)); index[i]--; if (flag) { activeSet.insert(std::pair<Scalar,std::vector<int> >(1.0,index)); oldSet.erase(it1); break; } } } // Compute local and global error indicators for active set typename std::multimap<Scalar,std::vector<int> >::iterator it2; Scalar eta = 0.0; Scalar G = 0.0; Teuchos::RCP<UserVector> s = integralValue.Create(); for (it2=activeSet.begin(); it2!=activeSet.end(); it2++) { // Build Differential Quarature Rule index = it2->second; CubatureTensorSorted<Scalar> diffRule(0,dimension); build_diffRule(diffRule,index,problem_data); // Apply Rule to function problem_data.eval_cubature(*s,diffRule); // Update local error indicator and index set G = problem_data.error_indicator(*s); activeSet.erase(it2); activeSet.insert(it2,std::pair<Scalar,std::vector<int> >(G,index)); eta += G; } // Refine Sparse Grid eta = refine_grid(activeSet,oldSet,integralValue,eta, dimension,rule1D,growth1D); // Insert New Active and Old Index sets into indexSet indexSet.insert(activeSet.begin(),activeSet.end()); for (it1=oldSet.begin(); it1!=oldSet.end(); it1++) { index = *it1; indexSet.insert(std::pair<Scalar,std::vector<int> >(-1.0,index)); } return eta; }