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
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
00099 const Real a = 3*pre*pre/(nu_*(1+z*z));
00100
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
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