#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 #include using namespace dealii; /******************************************************************************* * Define forcing function and exact solution ******************************************************************************/ template class ForcingFunction : public Function { public: double p; 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 (abs(p) < 1e-14) { f = 0; } else if (abs(p - 1) < 1e-14) { f = 32*(y*(1-y) + x*(1-x)); } else { f = -pow(2,4*p)*p*(pow(y,p)*pow(1-y,p)*((p-1)*pow(x,p-2)*pow(1-x,p) - 2*p*pow(x,p-1)*pow(1-x,p-1) + (p-1)*pow(x,p)*pow(1-x,p-2)) + pow(x,p)*pow(1-x,p)*((p-1)*pow(y,p-2)*pow(1-y,p) - 2*p*pow(y,p-1)*pow(1-y,p-1) + (p-1)*pow(y,p)*pow(1-y,p-2))); } return f; } template class ExactSolution : public Function { public: double p; 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; u = pow(2,4*p)*pow(x,p)*pow(1-x,p)*pow(y,p)*pow(1-y,p); 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 (abs(p) < 1e-14) { grad_u[0] = 1; grad_u[1] = 1; } else { grad_u[0] = pow(2,4*p)*pow(y,p)*pow(1-y,p)*(p*pow(x,p-1)*pow(1-x,p) - p*pow(x,p)*pow(1-x,p-1)); grad_u[1] = pow(2,4*p)*pow(x,p)*pow(1-x,p)*(p*pow(y,p-1)*pow(1-y,p) - p*pow(y,p)*pow(1-y,p-1)); } return grad_u; } #endif