#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, b; 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 f; if (x <= b*(y + 1)) { f = pow(M_PI,2)*cos(M_PI*y/2)/4; } else { f = pow(M_PI,2)*cos(M_PI*y/2)/4 - a*(a-1)*pow(x - b*(y+1), a-2)*(1 + pow(b,2)); } return f; } template class BoundaryFunction : public Function { public: double a, b; 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; if (x <= b*(y + 1)) { value = cos(M_PI*y/2); } else { value = cos(M_PI*y/2) + pow(x - b*(y+1), a); } return value; } template class ExactSolution : public Function { public: double a, b; 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; if (x <= b*(y + 1)) { u = cos(M_PI*y/2); } else { u = cos(M_PI*y/2) + pow(x - b*(y+1), a); } return u; } template Tensor<1,dim> ExactSolution::gradient (const Point &point, const unsigned int) const { double x = point[0]; double y = point[1]; Tensor<1,dim> grad_u; if (x <= b*(y+1)) { grad_u[0] = 0; grad_u[1] = -M_PI*sin(M_PI*y/2)/2; } else { grad_u[0] = a*pow(x-b*(y+1),a-1); grad_u[1] = -M_PI*sin(M_PI*y/2)/2 - a*b*pow(x - b*(y+1), a-1); } return grad_u; } #endif