54 #include "Teuchos_oblackholestream.hpp"
55 #include "Teuchos_RCP.hpp"
56 #include "Teuchos_RefCountPtr.hpp"
57 #include "Teuchos_GlobalMPISession.hpp"
59 using namespace Intrepid;
61 template<
class Scalar>
64 Teuchos::RefCountPtr<std::vector<Scalar> > std_vec_;
68 StdVector(
const Teuchos::RefCountPtr<std::vector<Scalar> > & std_vec )
69 : std_vec_(std_vec) {}
71 Teuchos::RefCountPtr<StdVector<Scalar> > Create()
const {
73 Teuchos::rcp(
new std::vector<Scalar>(std_vec_->size(),0))));
77 int dimension = (int)(std_vec_->size());
78 for (
int i=0; i<dimension; i++)
79 (*std_vec_)[i] += s[i];
83 int dimension = (int)(std_vec_->size());
84 for (
int i=0; i<dimension; i++)
85 (*std_vec_)[i] += alpha*s[i];
88 Scalar operator[](
int i) {
89 return (*std_vec_)[i];
96 void resize(
int n, Scalar p) {
97 std_vec_->resize(n,p);
101 return (
int)std_vec_->size();
104 void Set( Scalar alpha ) {
105 int dimension = (int)(std_vec_->size());
106 for (
int i=0; i<dimension; i++)
107 (*std_vec_)[i] = alpha;
111 template<
class Scalar,
class UserVector>
117 ASGdata(
int dimension,std::vector<EIntrepidBurkardt> rule1D,
118 std::vector<EIntrepidGrowth> growth1D,
int maxLevel,
120 dimension,rule1D,growth1D,maxLevel,isNormalized) {}
123 output.clear(); output.resize(1,std::exp(-input[0]*input[0])
124 +10.0*std::exp(-input[1]*input[1]));
127 int dimension = (int)input.size();
129 for (
int i=0; i<dimension; i++)
130 norm2 += input[i]*input[i];
134 norm2 = std::sqrt(norm2)/ID;
141 problem_data,
long double TOL) {
144 int dimension = problem_data.getDimension();
145 std::vector<int> index(dimension,1);
148 long double eta = 1.0;
151 std::multimap<long double,std::vector<int> > activeIndex;
152 activeIndex.insert(std::pair<
long double,std::vector<int> >(eta,index));
155 std::set<std::vector<int> > oldIndex;
160 activeIndex,oldIndex,iv,eta,problem_data);
165 int main(
int argc,
char *argv[]) {
167 Teuchos::GlobalMPISession mpiSession(&argc, &argv);
171 int iprint = argc - 1;
172 Teuchos::RCP<std::ostream> outStream;
173 Teuchos::oblackholestream bhs;
175 outStream = Teuchos::rcp(&std::cout,
false);
177 outStream = Teuchos::rcp(&bhs,
false);
180 Teuchos::oblackholestream oldFormatState;
181 oldFormatState.copyfmt(std::cout);
184 <<
"===============================================================================\n" \
186 <<
"| Unit Test (AdaptiveSparseGrid) |\n" \
188 <<
"| 1) Integrate a sum of Gaussians in 2D (Gerstner and Griebel). |\n" \
190 <<
"| Questions? Contact Drew Kouri (dpkouri@sandia.gov) or |\n" \
191 <<
"| Denis Ridzal (dridzal@sandia.gov). |\n" \
193 <<
"| Intrepid's website: http://trilinos.sandia.gov/packages/intrepid |\n" \
194 <<
"| Trilinos website: http://trilinos.sandia.gov |\n" \
196 <<
"===============================================================================\n"\
197 <<
"| TEST 20: Integrate an anisotropic sum of Gaussians in 2D |\n"\
198 <<
"===============================================================================\n";
203 long double TOL = INTREPID_TOL;
206 bool isNormalized =
true;
208 std::vector<EIntrepidBurkardt> rule1D(dimension,BURK_CLENSHAWCURTIS);
209 std::vector<EIntrepidGrowth> growth1D(dimension,GROWTH_FULLEXP);
212 dimension,rule1D,growth1D,maxLevel,isNormalized);
213 Teuchos::RCP<std::vector<long double> > integralValue =
214 Teuchos::rcp(
new std::vector<long double>(1,0.0));
216 problem_data.init(sol);
218 long double eta = adaptSG(sol,problem_data,TOL);
220 long double analyticInt = (1.0+10.0)*std::sqrt(M_PI)/2.0*erff(1.0);
221 long double abstol = 1.0e1*std::sqrt(INTREPID_TOL);
222 long double absdiff = std::abs(analyticInt-sol[0]);
224 *outStream <<
"Adaptive Sparse Grid exited with global error "
225 << std::scientific << std::setprecision(16) << eta <<
"\n"
226 <<
"Approx = " << std::scientific << std::setprecision(16) << sol[0]
227 <<
", Exact = " << std::scientific << std::setprecision(16) << analyticInt <<
"\n"
228 <<
"Error = " << std::scientific << std::setprecision(16) << absdiff <<
" "
229 <<
"<?" <<
" " << abstol <<
"\n";
230 if (absdiff > abstol) {
232 *outStream << std::right << std::setw(104) <<
"^^^^---FAILURE!\n";
235 catch (std::logic_error err) {
236 *outStream << err.what() <<
"\n";
241 std::cout <<
"End Result: TEST FAILED\n";
243 std::cout <<
"End Result: TEST PASSED\n";
246 std::cout.copyfmt(oldFormatState);
Builds general adaptive sparse grid rules (Gerstner and Griebel) using the 1D cubature rules in the I...
Scalar getInitialDiff()
Return initial error indicator.
Header file for the Intrepid::AdaptiveSparseGrid class.
Scalar error_indicator(UserVector &input)
User defined error indicator function.
void eval_integrand(UserVector &output, std::vector< Scalar > &input)
Evaluate the integrand function.