From 94bf169687a03b272089aff118ce42c6819dfc43 Mon Sep 17 00:00:00 2001 From: kanschat Date: Sat, 17 Feb 2007 03:52:57 +0000 Subject: [PATCH] add vector valued versions git-svn-id: https://svn.dealii.org/trunk@14490 0785d39b-7218-0410-832d-ea1e28bc413d --- deal.II/base/include/base/function_lib.h | 71 +++------- deal.II/base/source/function_lib.cc | 166 ++++++++++++++++++++++- 2 files changed, 187 insertions(+), 50 deletions(-) diff --git a/deal.II/base/include/base/function_lib.h b/deal.II/base/include/base/function_lib.h index 7c1eab5405..135a0f58f4 100644 --- a/deal.II/base/include/base/function_lib.h +++ b/deal.II/base/include/base/function_lib.h @@ -2,7 +2,7 @@ // $Id$ // Version: $Name$ // -// Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006 by the deal.II authors +// Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007 by the deal.II authors // // This file is subject to QPL and may not be distributed // without copyright and license information. Please refer @@ -100,32 +100,26 @@ namespace Functions class Q1WedgeFunction : public Function { public: - /** - * Function value at one point. - */ virtual double value (const Point &p, const unsigned int component = 0) const; - /** - * Function values at multiple points. - */ virtual void value_list (const std::vector > &points, std::vector &values, const unsigned int component = 0) const; - /** - * Gradient at one point. - */ + virtual void vector_value_list (const std::vector >& points, + std::vector >& values) const; + virtual Tensor<1,dim> gradient (const Point &p, const unsigned int component = 0) const; - /** - Gradients at multiple points. - */ virtual void gradient_list (const std::vector > &points, std::vector > &gradients, const unsigned int component = 0) const; + virtual void vector_gradient_list (const std::vector > &, + std::vector > >&) const; + /** * Laplacian of the function at one point. */ @@ -359,6 +353,9 @@ namespace Functions std::vector > &gradients, const unsigned int component = 0) const; + virtual void vector_gradient_list (const std::vector > &, + std::vector > >&) const; + virtual double laplacian (const Point<2> &p, const unsigned int component = 0) const; @@ -379,41 +376,29 @@ namespace Functions class SlitSingularityFunction : public Function { public: - /** - * The value at a single point. - */ virtual double value (const Point &p, const unsigned int component = 0) const; - /** - * Values at multiple points. - */ virtual void value_list (const std::vector > &points, std::vector &values, const unsigned int component = 0) const; - /** - * Gradient at a single point. - */ + virtual void vector_value_list (const std::vector >& points, + std::vector >& values) const; + virtual Tensor<1,dim> gradient (const Point &p, const unsigned int component = 0) const; - /** - * Gradients at multiple points. - */ virtual void gradient_list (const std::vector > &points, std::vector > &gradients, const unsigned int component = 0) const; - /** - * Laplacian at a single point. - */ + virtual void vector_gradient_list (const std::vector > &, + std::vector > >&) const; + virtual double laplacian (const Point &p, const unsigned int component = 0) const; - /** - * Laplacian at multiple points. - */ virtual void laplacian_list (const std::vector > &points, std::vector &values, const unsigned int component = 0) const; @@ -429,41 +414,29 @@ namespace Functions class SlitHyperSingularityFunction : 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 std::vector > &points, std::vector &values, const unsigned int component = 0) const; - /** - * Gradient at a single point. - */ + virtual void vector_value_list (const std::vector >& points, + std::vector >& values) const; + virtual Tensor<1,2> gradient (const Point<2> &p, const unsigned int component = 0) const; - /** - * Gradients at multiple points. - */ virtual void gradient_list (const std::vector > &points, std::vector > &gradients, const unsigned int component = 0) const; - /** - * Laplacian at a single point. - */ + virtual void vector_gradient_list (const std::vector > &, + std::vector > >&) const; + virtual double laplacian (const Point<2> &p, const unsigned int component = 0) const; - /** - * Laplacian at multiple points. - */ virtual void laplacian_list (const std::vector > &points, std::vector &values, const unsigned int component = 0) const; diff --git a/deal.II/base/source/function_lib.cc b/deal.II/base/source/function_lib.cc index 7fd8503d40..b69879023c 100644 --- a/deal.II/base/source/function_lib.cc +++ b/deal.II/base/source/function_lib.cc @@ -2,7 +2,7 @@ // $Id$ // Version: $Name$ // -// Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006 by the deal.II authors +// Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007 by the deal.II authors // // This file is subject to QPL and may not be distributed // without copyright and license information. Please refer @@ -144,6 +144,25 @@ namespace Functions } + template + void + Q1WedgeFunction::vector_value_list ( + const std::vector >& points, + std::vector >& values) const + { + Assert (dim>=2, ExcInternalError()); + Assert (values.size() == points.size(), + ExcDimensionMismatch(values.size(), points.size())); + Assert(values[0].size() == 1, ExcDimensionMismatch(values[0].size(), 1)); + + for (unsigned int i=0;i& p = points[i]; + values[i](0) = p(0)*p(1); + } + } + + template double Q1WedgeFunction::laplacian (const Point &, @@ -202,6 +221,26 @@ namespace Functions } + template + void + Q1WedgeFunction::vector_gradient_list ( + const std::vector >& points, + std::vector > >& gradients) const + { + Assert (dim>=2, ExcInternalError()); + Assert (gradients.size() == points.size(), + ExcDimensionMismatch(gradients.size(), points.size())); + Assert(gradients[0].size() == 1, + ExcDimensionMismatch(gradients[0].size(), 1)); + + for (unsigned int i=0; i >& points, + std::vector > >& gradients) const + { + Assert (gradients.size() == points.size(), + ExcDimensionMismatch(gradients.size(), points.size())); + + for (unsigned int i=0;i& p = points[i]; + double x = p(0); + double y = p(1); + double phi = std::atan2(y,-x)+M_PI; + double r43 = std::pow(x*x+y*y,2./3.); + + gradients[i][0][0] = 2./3.*(std::sin(2./3.*phi)*x + std::cos(2./3.*phi)*y)/r43; + gradients[i][0][1] = 2./3.*(std::sin(2./3.*phi)*y - std::cos(2./3.*phi)*x)/r43; + } + } + ////////////////////////////////////////////////////////////////////// template @@ -961,6 +1024,31 @@ namespace Functions } + template + void + SlitSingularityFunction::vector_value_list ( + const std::vector >& points, + std::vector >& values) const + { + Assert (values.size() == points.size(), + ExcDimensionMismatch(values.size(), points.size())); + + for (unsigned int i=0;i double SlitSingularityFunction::laplacian (const Point &, @@ -1026,6 +1114,33 @@ namespace Functions } } + template + void + SlitSingularityFunction::vector_gradient_list ( + const std::vector >& points, + std::vector > >& gradients) const + { + Assert (gradients.size() == points.size(), + ExcDimensionMismatch(gradients.size(), points.size())); + + for (unsigned int i=0;i& p = points[i]; + double x = p(0); + double y = p(1); + double phi = std::atan2(x,y)+M_PI; + double r64 = std::pow(x*x+y*y,3./4.); + + gradients[i][0][0] = 1./2.*(std::sin(1./2.*phi)*x + std::cos(1./2.*phi)*y)/r64; + gradients[i][0][1] = 1./2.*(std::sin(1./2.*phi)*y - std::cos(1./2.*phi)*x)/r64; + for (unsigned int d=2;d >& points, + std::vector >& values) const + { + Assert (values.size() == points.size(), + ExcDimensionMismatch(values.size(), points.size())); + + for (unsigned int i=0;i &, @@ -1128,6 +1267,31 @@ namespace Functions } } + + void + SlitHyperSingularityFunction::vector_gradient_list ( + const std::vector > &points, + std::vector > >& gradients) const + { + Assert (gradients.size() == points.size(), + ExcDimensionMismatch(gradients.size(), points.size())); + + for (unsigned int i=0;i& p = points[i]; + double x = p(0); + double y = p(1); + double phi = std::atan2(x,y)+M_PI; + double r78 = std::pow(x*x+y*y,7./8.); + + gradients[i][0][0] = 1./4.*(std::sin(1./4.*phi)*x + std::cos(1./4.*phi)*y)/r78; + gradients[i][0][1] = 1./4.*(std::sin(1./4.*phi)*y - std::cos(1./4.*phi)*x)/r78; + } + } + ////////////////////////////////////////////////////////////////////// template -- 2.39.5