From: kanschat Date: Fri, 3 Dec 1999 02:49:56 +0000 (+0000) Subject: Example functions for singularities X-Git-Url: https://gitweb.dealii.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=36de9a3e13557bb181cf85434625f2ab965491a3;p=dealii-svn.git Example functions for singularities git-svn-id: https://svn.dealii.org/trunk@1971 0785d39b-7218-0410-832d-ea1e28bc413d --- diff --git a/deal.II/base/include/base/function_lib.h b/deal.II/base/include/base/function_lib.h index b2762dd54f..c2012f76d8 100644 --- a/deal.II/base/include/base/function_lib.h +++ b/deal.II/base/include/base/function_lib.h @@ -9,9 +9,9 @@ #include /** - * n-quadratic pillow on the unit square. + * d-quadratic pillow on the unit hypercube. * - * This is a function for testing the implementation. It has zero + * This is a function for testing the implementation. It has zero Dirichlet * boundary values on the domain $(-1,1)^d$. In the inside, it is the * product of $x_i^2-1$. * @@ -20,7 +20,7 @@ * @author: Guido Kanschat, 1999 */ template -class PillowFunction : Function +class PillowFunction : public Function { public: /** @@ -63,6 +63,100 @@ class PillowFunction : Function const unsigned int component = 0) const; }; +/** + * Singularity on the L-shaped domain in 2D. + * @author Guido Kanschat, 1999 + */ +class LSingularityFunction : public Function<2> +{ + public: + /** + * The value at a single point. + */ + virtual double value (const Point<2> &p, + const unsigned int component = 0) const; + + /** + * Values at multiple points. + */ + virtual void value_list (const vector > &points, + vector &values, + const unsigned int component = 0) const; + + /** + * Gradient at a single point. + */ + virtual Tensor<1,2> gradient (const Point<2> &p, + const unsigned int component = 0) const; + + /** + * Gradients at multiple points. + */ + virtual void gradient_list (const vector > &points, + vector > &gradients, + const unsigned int component = 0) const; + + /** + * Laplacian at a single point. + */ + double laplacian(const Point<2> &p, + const unsigned int component = 0) const; + + /** + * Laplacian at multiple points. + */ + void laplacian_list(const vector > &points, + vector &values, + const unsigned int component = 0) const; +}; + +/** + * Singularity on the slit domain in 2D. + * @author Guido Kanschat, 1999 + */ +class SlitSingularityFunction : public Function<2> +{ + public: + /** + * The value at a single point. + */ + virtual double value (const Point<2> &p, + const unsigned int component = 0) const; + + /** + * Values at multiple points. + */ + virtual void value_list (const vector > &points, + vector &values, + const unsigned int component = 0) const; + + /** + * Gradient at a single point. + */ + virtual Tensor<1,2> gradient (const Point<2> &p, + const unsigned int component = 0) const; + + /** + * Gradients at multiple points. + */ + virtual void gradient_list (const vector > &points, + vector > &gradients, + const unsigned int component = 0) const; + + /** + * Laplacian at a single point. + */ + double laplacian(const Point<2> &p, + const unsigned int component = 0) const; + + /** + * Laplacian at multiple points. + */ + void laplacian_list(const vector > &points, + vector &values, + const unsigned int component = 0) const; +}; + /*---------------------------- function_lib.h ---------------------------*/ diff --git a/deal.II/base/source/function_lib.cc b/deal.II/base/source/function_lib.cc index 47cfdfa033..575730f767 100644 --- a/deal.II/base/source/function_lib.cc +++ b/deal.II/base/source/function_lib.cc @@ -4,6 +4,8 @@ #include #include +#include + //TODO: Derivatives in 3d wrong (GK!) template @@ -162,7 +164,176 @@ PillowFunction::gradient_list (const vector > &points, } } +////////////////////////////////////////////////////////////////////// + + +double +LSingularityFunction::value (const Point<2> &p, + const unsigned int) const +{ + double x = p(0); + double y = p(1); + + if ((x>=0) && (y>=0)) + return 0.; + + double phi = atan2(y,-x)+M_PI; + double r2 = x*x+y*y; + + return pow(r2,1./3.) * sin(2./3.*phi); +} + + +void +LSingularityFunction::value_list (const vector > &points, + vector &values, + const unsigned int) const +{ + Assert (values.size() == points.size(), + ExcVectorHasWrongSize(values.size(), points.size())); + + for (unsigned int i=0;i=0) && (y>=0)) + values[i] = 0.; + else + { + double phi = atan2(y,-x)+M_PI; + double r2 = x*x+y*y; + + values[i] = pow(r2,1./3.) * sin(2./3.*phi); + } + } +} + + +double +LSingularityFunction::laplacian (const Point<2> &, + const unsigned int) const +{ + return 0.; +} + + +void +LSingularityFunction::laplacian_list (const vector > &points, + vector &values, + const unsigned int) const +{ + Assert (values.size() == points.size(), + ExcVectorHasWrongSize(values.size(), points.size())); + + for (unsigned int i=0;i +LSingularityFunction::gradient (const Point<2> &/*p*/, + const unsigned int) const +{ + Assert(false, ExcNotImplemented()); + return Tensor<1,2>(); +} + + +void +LSingularityFunction::gradient_list (const vector > &points, + vector > &gradients, + const unsigned int) const +{ + Assert (gradients.size() == points.size(), + ExcVectorHasWrongSize(gradients.size(), points.size())); + Assert(false, ExcNotImplemented()); +} + +////////////////////////////////////////////////////////////////////// + + +double +SlitSingularityFunction::value (const Point<2> &p, + const unsigned int) const +{ + double x = p(0); + double y = p(1); + + double phi = atan2(x,-y)+M_PI; + double r2 = x*x+y*y; + + return pow(r2,.25) * sin(.5*phi); +} + + +void +SlitSingularityFunction::value_list (const vector > &points, + vector &values, + const unsigned int) const +{ + Assert (values.size() == points.size(), + ExcVectorHasWrongSize(values.size(), points.size())); + + for (unsigned int i=0;i &, + const unsigned int) const +{ + return 0.; +} + + +void +SlitSingularityFunction::laplacian_list (const vector > &points, + vector &values, + const unsigned int) const +{ + Assert (values.size() == points.size(), + ExcVectorHasWrongSize(values.size(), points.size())); + + for (unsigned int i=0;i +SlitSingularityFunction::gradient (const Point<2> &/*p*/, + const unsigned int) const +{ + Assert(false, ExcNotImplemented()); + return Tensor<1,2>(); +} + + +void +SlitSingularityFunction::gradient_list (const vector > &points, + vector > &gradients, + const unsigned int) const +{ + Assert (gradients.size() == points.size(), + ExcVectorHasWrongSize(gradients.size(), points.size())); + Assert(false, ExcNotImplemented()); +} + +////////////////////////////////////////////////////////////////////// + template PillowFunction<1>; template PillowFunction<2>; template PillowFunction<3>; -