00001 #ifndef __DDM_H__
00002 #define __DDM_H__
00003
00004 #include <vector>
00005 #include <map>
00006 #include <set>
00007 #include <boost/shared_ptr.hpp>
00008 #include "bvp.hpp"
00009 #include "interpolator.hpp"
00010 #include "diff_op.hpp"
00011 #include "func.hpp"
00012
00013 namespace bvp{
00014 using std::map;
00015 using std::set;
00016 using boost::shared_ptr;
00017
00018
00019
00020
00021
00022
00023
00024 class ddm_bdry_diff_op : public bdry_diff_op{
00025 public:
00026 ddm_bdry_diff_op(shared_ptr<const bdry_diff_op> B_in,
00027 shared_ptr<const bdry_diff_op> Bprime_in,
00028 const set<point>& ibps);
00029 double at(const realfunc &f, const point &p) const;
00030 double at(const realfunc &f, const point &p, const vector &n) const;
00031 private:
00032 shared_ptr<const bdry_diff_op> B;
00033 shared_ptr<const bdry_diff_op> Bprime;
00034 set<point> intr_bdry_pts;
00035 };
00036
00037
00038
00039
00040 class ddm{
00041 public:
00042
00043 ddm(const set<shared_ptr<const domain> >& ds,
00044 shared_ptr<const BVP> thebvp);
00045
00046
00047 void set_tolerance(double tol);
00048 virtual double at(const point& p) const = 0;
00049 double operator()(const point& p) const;
00050
00051 virtual ~ddm();
00052
00053 protected:
00054 shared_ptr<const BVP> bvp;
00055 set<shared_ptr<const domain> > domains;
00056 double tolerance;
00057
00058
00059 virtual void solve() = 0;
00060 };
00061
00062 class overlapping_domain;
00063
00064
00065
00066
00067 template <typename RBF>
00068 class additive_schwarz_ddm : public ddm{
00069 public:
00070 additive_schwarz_ddm(const set<shared_ptr<const domain> >&,
00071 shared_ptr<const linear_BVP2> bvp);
00072 double at(const point& p) const;
00073 private:
00074 map<shared_ptr<const overlapping_domain>,
00075 shared_ptr<interpolator<RBF> > > phis;
00076
00077 set<shared_ptr<const interpolator<RBF> > >
00078 which_interps(const point& p) const;
00079
00080 void solve();
00081
00082
00083 double avg_interp(set<shared_ptr<const interpolator<RBF> > >
00084 relevant_interpolators,
00085 const point& p) const;
00086
00087
00088 vector at_all_points() const;
00089
00090 };
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110 class overlapping_domain : public domain{
00111 public:
00112 overlapping_domain(string intr, string bdry, string ns);
00113 overlapping_domain(string intr, string bdry, string ns,
00114 const set<shared_ptr<const overlapping_domain> >& ols,
00115 const map<point,
00116 shared_ptr<const overlapping_domain> >& bdry_asst);
00117
00118 overlapping_domain(size_t dimension);
00119 overlapping_domain(size_t dimension, set<point> intr,
00120 set<point> bdry, map<point, vector> ns);
00121
00122 set<shared_ptr<const overlapping_domain> > get_domains() const;
00123
00124
00125 shared_ptr<const overlapping_domain> which_domain(const point& p) const;
00126
00127
00128
00129
00130 friend void set_overlapper_info(set<shared_ptr<overlapping_domain> >
00131 domains);
00132
00133
00134 void set_overlapper_info(const point& p,
00135 const shared_ptr<overlapping_domain> o);
00136
00137 private:
00138 set<shared_ptr<const overlapping_domain> > overlappers;
00139 map<point, shared_ptr<const overlapping_domain> > boundary_assignments;
00140 };
00141 }
00142
00143 #endif // __DDM_H__
00144