00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #ifndef _FRAMETL_ELLIPTIC_EQUATION_H
00011 #define _FRAMETL_ELLIPTIC_EQUATION_H
00012
00013 #include <aggregated_frame.h>
00014 #include <numerics/bvp.h>
00015 #include <adaptive/compression.h>
00016 #include <interval/i_index.h>
00017 #include <index1D.h>
00018
00019 #include <galerkin/infinite_preconditioner.h>
00020
00021 #include <frame_support.h>
00022
00023 using FrameTL::AggregatedFrame;
00024 using MathTL::EllipticBVP;
00025 using WaveletTL::CompressionStrategy;
00026 using WaveletTL::IntervalIndex;
00027 using WaveletTL::FullyDiagonalEnergyNormPreconditioner;
00028
00029 namespace FrameTL
00030 {
00031
00066 template <class IBASIS, unsigned int DIM>
00067 class EllipticEquation
00068
00069 : public FullyDiagonalEnergyNormPreconditioner<typename AggregatedFrame<IBASIS,DIM>::Index>
00070 {
00071 public:
00072
00081 EllipticEquation(const EllipticBVP<DIM>* ell_bvp,
00082 const AggregatedFrame<IBASIS,DIM>* frame,
00083 const int jmax);
00084
00088 typedef AggregatedFrame<IBASIS,DIM> Frame;
00089
00094 typedef AggregatedFrame<IBASIS,DIM> WaveletBasis;
00095
00099 typedef typename Frame::Index Index;
00100
00104 const AggregatedFrame<IBASIS,DIM>& frame() const { return *frame_; }
00105
00109 const EllipticBVP<DIM>& get_bvp() const { return *ell_bvp_; }
00110
00111
00116 const AggregatedFrame<IBASIS,DIM>& basis() const { return *frame_; }
00117
00121 static const int space_dimension = DIM;
00122
00126 static bool local_operator() { return true; }
00127
00131 double operator_order() const { return 1; }
00132
00136 double D(const typename AggregatedFrame<IBASIS,DIM>::Index& lambda) const;
00137
00141 void rescale(InfiniteVector<double, typename AggregatedFrame<IBASIS,DIM>::Index>& coeffs,
00142 const int n) const;
00143
00147 double a(const typename AggregatedFrame<IBASIS,DIM>::Index& lambda,
00148 const typename AggregatedFrame<IBASIS,DIM>::Index& nu) const;
00149
00153 double norm_A() const;
00154
00161 double norm_Ainv() const { return normAinv; };
00162
00166 void set_norm_A(const double _normA) { normA = _normA; }
00167
00171 void set_Ainv(const double nAinv) { normAinv = nAinv; };
00172
00176 double s_star() const;
00177
00182 double alphak(const unsigned int k) const {
00183 return pow(2,(-k))*norm_A();
00184 }
00185
00189 double f(const typename AggregatedFrame<IBASIS,DIM>::Index& lambda) const;
00190
00195 void RHS(const double eta, InfiniteVector<double,
00196 typename AggregatedFrame<IBASIS,DIM>::Index>& coeffs) const;
00197
00201 double F_norm() const { return sqrt(fnorm_sqr); }
00202
00206 void set_bvp(const EllipticBVP<DIM>*);
00207
00208
00213 void add_level (const Index& lambda,
00214 InfiniteVector<double, Index>& w, const int j,
00215 const double factor,
00216 const int J,
00217 const CompressionStrategy strategy) const;
00218
00219 protected:
00220
00224 const EllipticBVP<DIM>* ell_bvp_;
00225
00229 const AggregatedFrame<IBASIS,DIM>* frame_;
00230
00231 private:
00232
00240 double a_same_patches(const typename AggregatedFrame<IBASIS,DIM>::Index& lambda,
00241 const typename AggregatedFrame<IBASIS,DIM>::Index& nu,
00242 const unsigned int n_Gauss_knots = 3) const;
00243
00252 double a_different_patches(const typename AggregatedFrame<IBASIS,DIM>::Index& lambda,
00253 const typename AggregatedFrame<IBASIS,DIM>::Index& nu,
00254 const unsigned int n_Gauss_knots = 3, const unsigned int rank = 1) const;
00255
00256
00258 void compute_rhs();
00259
00261 void compute_diagonal();
00262
00264 const int jmax_;
00265
00267 Array1D<std::pair<typename AggregatedFrame<IBASIS,DIM>::Index,double> > fcoeffs;
00268
00270 InfiniteVector<double,typename AggregatedFrame<IBASIS,DIM>::Index> stiff_diagonal;
00271
00272
00274 double fnorm_sqr;
00275
00276
00277
00278
00279
00280
00281 mutable double normA, normAinv;
00282 };
00283 }
00284
00285 #include <elliptic_equation.cpp>
00286
00287 #endif