Main Page | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Class Members | File Members

operator.hpp

Go to the documentation of this file.
00001 #ifndef OPERATOR_HPP
00002 #define OPERATOR_HPP
00003 
00004 #include "skeleton.hpp"
00005 #include "fft.hpp"
00006 
00016 
00017 
00026 class SmoluchowskiCalc {
00027 protected:
00028     const Skeleton& K;
00029     const Skeleton& Psi;
00030     unsigned N;
00031     double H, h;
00032 public:
00034 
00042     SmoluchowskiCalc(const Skeleton& K_skel, const Skeleton& Psi_skel, 
00043             double _H, unsigned _N);
00045     virtual ~SmoluchowskiCalc() { }
00047     unsigned GetN() const { return N; }
00049     double GetH() const { return H; }
00050 
00052 
00058     virtual void
00059     calc_L1(const double *f, const double *g, double *res) = 0;
00061 
00067     virtual void
00068     calc_L2(const double *f, const double *g, double *res) = 0;
00070     virtual void fix_f_arg(const double *f) = 0;
00072 
00077     virtual void calc_L1_fix_f(const double *g, double *res) = 0;
00079 
00084     virtual void calc_L2_fix_f(const double *g, double *res) = 0;
00085 
00087 
00092     virtual void calc_L3(const double *g, double *res) const = 0;
00094 
00099     virtual void calc_L4(const double *g, double *res) const = 0;
00101 
00106     virtual void calc_L5(const double *g, double *res) const = 0;
00107 };
00108 
00110 
00114 class SmoluchowskiCalcDirect : public SmoluchowskiCalc {
00115     double *Uf; // if fix_f_arg is called save K.GetU().elem(i,k) * f[i]
00116 public:
00118 
00126     SmoluchowskiCalcDirect(const Skeleton& K_skel, 
00127             const Skeleton& Psi_skel, double _H, unsigned _N);
00129     ~SmoluchowskiCalcDirect();
00130     void calc_L1(const double *f, const double *g, double *res);
00131     void calc_L2(const double *f, const double *g, double *res);
00132     void fix_f_arg(const double *f);
00133     void calc_L1_fix_f(const double *g, double *res);
00134     void calc_L2_fix_f(const double *g, double *res);
00135 
00136     void calc_L3(const double *g, double *res) const;
00137     void calc_L4(const double *g, double *res) const;
00138     void calc_L5(const double *g, double *res) const;
00139 };
00140 
00142 
00148 class SmoluchowskiCalcFast : public SmoluchowskiCalc {
00149     unsigned N_log2, N_2;
00150     FourierTransform Fourier;
00151     double *tmp_mv;   /* array with max(K.rank, Psi.rank) elem */
00152     // if fix_f_arg is called save K.GetU().elem(i,k) * f[i]
00153     double *Uf;
00154     // result of applying discrete fourier transform to Uf
00155     Complex *Uf_fourier;
00156     Complex *tmp_complex0; // keep last part zero!
00157     Complex *tmp_complex1;
00158     Complex *tmp_complex2;
00159 public:
00161 
00169     SmoluchowskiCalcFast(const Skeleton& K_skel, 
00170             const Skeleton& Psi_skel, double _H, unsigned _N);
00172     ~SmoluchowskiCalcFast();
00173     void calc_L1(const double *f, const double *g, double *res);
00174     void calc_L2(const double *f, const double *g, double *res);
00175     void fix_f_arg(const double *f);
00176     void calc_L1_fix_f(const double *g, double *res);
00177     void calc_L2_fix_f(const double *g, double *res);
00178 
00179     void calc_L3(const double *g, double *res) const;
00180     void calc_L4(const double *g, double *res) const;
00181     void calc_L5(const double *g, double *res) const;
00182 };
00183 
00184 
00186 class SmoluchowskiOperator {
00187 protected:
00188     unsigned N;
00189     double H, h;
00190     SmoluchowskiCalc& smol_base;
00191     double *tmp_l;
00192 public:
00194     SmoluchowskiOperator(SmoluchowskiCalc& _base);
00196     ~SmoluchowskiOperator();
00198     SmoluchowskiCalc& GetSmolCalc() { return smol_base; }
00200     double Get_h() const { return h; }
00202 
00208     virtual void Apply(const double *g, double *res) = 0;
00209 };
00210 
00212 
00217 class SmoluchowskiNonLinearOperator : public SmoluchowskiOperator {
00218 public:
00220     SmoluchowskiNonLinearOperator(SmoluchowskiCalc& _base);
00222     ~SmoluchowskiNonLinearOperator();
00223     void Apply(const double *g, double *res);
00224 };
00225 
00227 
00237 class SmoluchowskiLinearOperator : public SmoluchowskiOperator {
00238     double *c0; // start distribution of particle
00239     double *a;
00240     
00241     void calc_a();
00242 public:
00244 
00247     SmoluchowskiLinearOperator(SmoluchowskiCalc& _base, 
00248             const double *st); // with copy st
00250     ~SmoluchowskiLinearOperator();
00251     const double *Get_c0() const;
00252     const double *Get_a() const;
00253     virtual void Apply(const double *g, double *res);
00255 
00262     virtual void ApplyAdjoint(const double *g, double *res);
00263 };
00264 
00265 #endif /* OPERATOR_HPP */

Generated on Sun May 25 01:58:04 2025 for SmoluchowskiSolver by Doxygen