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;
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;
00152
00153 double *Uf;
00154
00155 Complex *Uf_fourier;
00156 Complex *tmp_complex0;
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;
00239 double *a;
00240
00241 void calc_a();
00242 public:
00244
00247 SmoluchowskiLinearOperator(SmoluchowskiCalc& _base,
00248 const double *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