#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 a, xc, yc, r0; 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 r = sqrt(pow(x - xc,2) + pow(y - yc,2)); double f = -(a*pow(r,2)*(pow(a,2)*pow(r-r0,2)+1) - 2*pow(a*r,3)*(r-r0)) /(pow(r,3)*pow(pow(a*(r-r0),2)+1,2)); return f; } template class BoundaryFunction : public Function { public: double a, xc, yc, r0; 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 r = sqrt(pow(x - xc,2) + pow(y - yc,2)); double value = atan(a*(r-r0)); return value; } template class ExactSolution : public Function { public: double a, xc, yc, r0; 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 r = sqrt(pow(x - xc,2) + pow(y - yc,2)); double u = atan(a*(r-r0)); return u; } template Tensor<1,dim> ExactSolution::gradient (const Point &point, const unsigned int) const { double x = point[0]; double y = point[1]; double r = sqrt(pow(x - xc,2) + pow(y - yc,2)); Tensor<1,dim> grad_u; grad_u[0] = a*(x-xc)/(r*(pow(a*(r-r0),2)+1)); grad_u[1] = a*(y-yc)/(r*(pow(a*(r-r0),2)+1)); return grad_u; } #endif