00001
00002
00003 #ifndef QuadTreeIntegrator_h
00004 #define QuadTreeIntegrator_h
00005
00006 #include <math.h>
00007
00008 #include <vector>
00009
00010 namespace BIE {
00011
00024 class QuadTreeIntegrator {
00025
00026 public:
00027
00029 typedef vector<double>(*Integrand)(double, double);
00030
00032 typedef pair<double, QuadTreeIntegrator*> FrontierNode;
00033
00034
00035
00037 struct RootVars {
00039 QuadTreeIntegrator *root;
00041 vector<FrontierNode> frontier;
00043 vector<double> value;
00045 vector<double> error;
00046 };
00047
00059 QuadTreeIntegrator(double a0, double a1, double b0, double b1,
00060 int dim, Integrand func, double eps,
00061 int minlevel, int maxlevel);
00063 ~QuadTreeIntegrator();
00064
00066 vector<double> Integral();
00067
00069 vector<double> AbsError() { return root->error; }
00070
00072 double MaxAbsError() { return max_error(root->error); }
00073
00075 double MaxRelError() { return max_rel_error(); }
00076
00078 vector<double> RelError() {
00079 vector<double> ret = root->error;
00080 for (unsigned i=0; i<ret.size(); i++)
00081 ret[i] /= fabs(root->value[i]) + 1.0e-18;
00082 return ret; }
00083
00085 int NumEvals() { return numevals; }
00086
00088 int MaxLevel() { return maxcurlevel; }
00089
00091 void PrintFrontier(ostream& out);
00092
00093 private:
00094 double a[2];
00095 double b[2];
00096 double eps;
00097
00098 QuadTreeIntegrator* parent;
00099 QuadTreeIntegrator** child;
00100
00101
00102 int dim;
00103 Integrand eval;
00104 static int numevals;
00105
00106 int minlevel;
00107 int maxlevel;
00108 int level;
00109 static int maxcurlevel;
00110
00111 vector<double> value;
00112 vector<double> error;
00113
00120 QuadTreeIntegrator(QuadTreeIntegrator* parent, int which, RootVars* root);
00121
00122
00123
00124 void compute();
00125
00126
00127
00128
00129 void add_to_master(vector<double> val, vector<double> err);
00130
00131
00132
00133 void sub_from_master(vector<double> val, vector<double> err);
00134
00135
00136 double max_error(vector<double> err);
00137
00138
00139 double max_rel_error(void);
00140
00141
00142
00143 struct RootVars *root;
00144 };
00145
00146
00147 }
00148
00149 #endif