#ifndef MYFUNCTIONS_H #define MYFUNCTIONS_H #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace dealii; /******************************************************************************* * Define forcing function, boundary values and exact solution ******************************************************************************/ template class ForcingFunction : public Function { public: double eps; ForcingFunction() : Function(1) {} virtual double value(const Point & point, const unsigned int component = 0 ) const; }; template double ForcingFunction::value(const Point & point, const unsigned int ) const { double x = point[0]; double y = point[1]; double a = exp((x-1)/eps); double b = exp((y-1)/eps); double f = -eps*(2*M_PI*sin(M_PI*(x+y))*(a-2*a*b+b)/eps - cos(M_PI*(x+y))*(a-2*a*b+b)/pow(eps,2) - 2*pow(M_PI,2)*(1-a)*(1-b)*cos(M_PI*(x+y))) - 3*M_PI*(1-a)*(1-b)*sin(M_PI*(x+y)) - cos(M_PI*(x+y))*(2*a-3*a*b+b)/eps; return f; } template class BoundaryFunction : public Function { public: double eps; BoundaryFunction() : Function(1) {} virtual double value(const Point & point, const unsigned int component = 0 ) const; }; template double BoundaryFunction::value(const Point & point, const unsigned int ) const { double x = point[0]; double y = point[1]; double value = (1-exp((x-1)/eps))*(1-exp((y-1)/eps))*cos(M_PI*(x+y)); return value; } template class ExactSolution : public Function { public: double eps; ExactSolution() : Function(1) {}; virtual double value(const Point & point, const unsigned int component = 0 ) const; virtual Tensor<1,dim> gradient (const Point &point, const unsigned int component = 0) const; }; template double ExactSolution::value(const Point & point, const unsigned int ) const { double x = point[0]; double y = point[1]; double u = (1-exp((x-1)/eps))*(1-exp((y-1)/eps))*cos(M_PI*(x+y)); return u; } template Tensor<1,dim> ExactSolution::gradient (const Point &point, const unsigned int) const { double x = point[0]; double y = point[1]; double a = exp((x-1)/eps); double b = exp((y-1)/eps); Tensor<1,dim> grad_u; grad_u[0] = -M_PI*(1-a)*(1-b)*sin(M_PI*(x+y)) - a*(1-b)*cos(M_PI*(x+y))/eps; grad_u[1] = -M_PI*(1-a)*(1-b)*sin(M_PI*(x+y)) - b*(1-a)*cos(M_PI*(x+y))/eps; return grad_u; } #endif