Home | Doxygen Documentation | Tutorials | Developer Tools (restricted)

app-fvdgfem/formula.hh
Go to the documentation of this file.
00001 #ifndef fvdgFormula_hh
00002 #define fvdgFormula_hh
00003 
00004 #include "basics/typedefs.hh"
00005 #include "formula/formula.hh"
00006 
00007 #include <cmath>
00008 
00009 using concepts::Real;
00010 
00011 // **************************************************************** Formulae **
00012 
00016 class BoxSin : public concepts::Formula<Real> {
00017 public:
00019   BoxSin() : pi_(3.14159265359) {}
00021   concepts::Formula<Real> * clone() const { return new BoxSin(); }
00023   Real operator() (const Real x, const Real t = 0.) const { return 0.; }
00025   Real operator() (const concepts::Real2d& x, const Real t = 0.) const {
00026     return 0.; 
00027   }
00031   Real operator() (const concepts::Real3d& x, const Real t = 0.0) const {
00032     return 0.25*std::sin(pi_*(2*x[0]+2*x[1]+2*x[2]-3-6*t));
00033   }
00034 private:
00035     const Real pi_;
00036 };
00037 
00038 class InitTest : public concepts::Formula<Real> {
00039 public:
00040   InitTest(Real a, Real b, Real c) : a_(a), b_(b), c_(c) {} 
00041   concepts::Formula<Real> * clone() const { return new InitTest(a_, b_, c_); }
00042   Real operator() (const Real x, const Real t = 0.) const { return 0.; }
00043   Real operator() (const concepts::Real2d& x, const Real t = 0.) const {
00044     return 0.; 
00045   }
00046   Real operator() (const concepts::Real3d& x, const Real t = 0.0) const {
00047     return a_*x[0]+b_*x[1]+c_*x[2];
00048   }
00049 private:
00050   Real a_;
00051   Real b_;
00052   Real c_;
00053 };
00054 
00055 class TimeSquared : public concepts::Formula<Real> {
00056 public:
00057   concepts::Formula<Real> * clone() const { return new TimeSquared; }
00058   Real operator() (const Real x, const Real t = 0.) const { return t*t; }
00059   Real operator() (const concepts::Real2d& x, const Real t = 0.) const {
00060     return t*t; 
00061   }
00062   Real operator() (const concepts::Real3d& x, const Real t = 0.0) const {
00063     return t*t;
00064   }
00065 };
00066 
00067 class HeatSolution : public concepts::Formula<Real> {
00068 public:
00069   HeatSolution() : pi_(3.14159265359) {}
00070   concepts::Formula<Real> * clone() const { return new HeatSolution; }
00071   Real operator() (const Real x, const Real t = 0.) const { return 0.; }
00072   Real operator() (const concepts::Real2d& x, const Real t = 0.) const {
00073     return 0.; 
00074   }
00075   Real operator() (const concepts::Real3d& x, const Real t = 0.0) const {
00076     return std::pow(4*pi_*(t+0.1),-1.5)*std::exp(-x.l2_2()/(4*(t+0.1)));
00077   }
00078 private:
00079   Real pi_;
00080 };
00081 
00082 class ADLoad : public concepts::Formula<Real> {
00083 public:
00084   ADLoad(Real epsilon, Real nu) : epsilon_(epsilon), nu_(nu) {}
00085   concepts::Formula<Real> * clone() const { return new ADLoad(epsilon_, nu_); }
00086   Real operator() (const Real x, const Real t = 0.) const { return 0.; }
00087   Real operator() (const concepts::Real2d& x, const Real t = 0.) const {
00088     return 0.;
00089   }
00090   Real operator() (const concepts::Real3d& x, const Real t = 0.) const {
00091     const Real z = (x[0]+x[1]+x[2]+3-3*t)/nu_;
00092     const concepts::Real3d x_2( 1 - x[0]*x[0], 1 - x[1]*x[1], 1 - x[2]*x[2] );
00093     const concepts::Real3d x_2c(x_2[1]*x_2[2], x_2[0]*x_2[2], x_2[0]*x_2[1]);
00094     Real pre = 1.;
00095     for (uint i = 0; i < 3; ++i) {
00096       pre *= x_2[i];
00097     }
00098     // Part from time derivative
00099     const Real a = 3*pre*pre/(nu_*(1+z*z));
00100     // Part from flux
00101     Real b = 0;
00102     for (uint i = 0; i < 3; ++i) {
00103       b += 2.*x[i]*x_2c[i];
00104     }
00105     b *= std::atan(z);
00106     b -= pre*3./(2.*nu_*(1+z*z));
00107     b *= -2*pre*pre*pre*std::atan(z);
00108     // Part from Laplace
00109     Real c = 0;
00110     for (uint i = 0; i < 3; ++i) {
00111       c += 4.*x_2c[i];
00112     }
00113     c *= pre;
00114     for (uint i = 0; i < 3; ++i) {
00115       c -= 8.*x[i]*x[i]*x_2c[i]*x_2c[i];
00116     }
00117     c *= std::atan(z);
00118     for (uint i = 0; i < 3; ++i) {
00119       c += 8.*x[i]*x_2c[i]*pre/(nu_*(1+z*z));
00120     }
00121     c += pre*pre*6*z/(nu_*nu_*std::pow(1+z*z,2));
00122     c *= -epsilon_;
00123     return a + b + c;
00124   }
00125 private:
00126   const Real epsilon_;
00127   const Real nu_;
00128 };
00129 
00130 class ADSolution : public concepts::Formula<Real> {
00131 public:
00132   ADSolution(Real nu) : nu_(nu) {}
00133   concepts::Formula<Real> * clone() const { return new ADSolution(nu_); }
00134   Real operator() (const Real x, const Real t = 0.) const { return 0.; }
00135   Real operator() (const concepts::Real2d& x, const Real t = 0.) const {
00136     return 0.;
00137   }
00138   Real operator() (const concepts::Real3d& x, const Real t = 0.) const {
00139     const Real z = (x[0]+x[1]+x[2]+3-3*t)/nu_;
00140     return
00141       -std::pow((1-x[0]*x[0])*(1-x[1]*x[1])*(1-x[2]*x[2]),2)*std::atan(z);
00142   }
00143 private:
00144   const Real nu_;
00145 };
00146 
00147 
00148 #endif // fvdgFormula_hh

Home | Doxygen Documentation | Tutorials | Developer Tools (restricted)