From: guido Date: Fri, 9 Jun 2000 20:49:36 +0000 (+0000) Subject: Exponential function X-Git-Url: https://gitweb.dealii.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=c94bd3c04987eaccd75adb9f31cb94fd3ff38eb9;p=dealii-svn.git Exponential function git-svn-id: https://svn.dealii.org/trunk@2997 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 45b06be82d..7c6b527f02 100644 --- a/deal.II/base/include/base/function_lib.h +++ b/deal.II/base/include/base/function_lib.h @@ -127,6 +127,56 @@ class CosineFunction : public Function +/** + * Product of exponential functions in each coordinate direction. + * @author Guido Kanschat, 1999 + */ +template +class ExpFunction : 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 vector > &points, + vector &values, + const unsigned int component = 0) const; + + /** + * Gradient at a single point. + */ + virtual Tensor<1,dim> gradient (const Point &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 &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 L-shaped domain in 2D. * @author Guido Kanschat, 1999 diff --git a/deal.II/base/source/function_lib.cc b/deal.II/base/source/function_lib.cc index a7319a9e52..14f8f594ee 100644 --- a/deal.II/base/source/function_lib.cc +++ b/deal.II/base/source/function_lib.cc @@ -333,6 +333,162 @@ CosineFunction::gradient_list (const vector > &points, ////////////////////////////////////////////////////////////////////// +template +double +ExpFunction::value (const Point &p, + const unsigned int) const +{ + switch(dim) + { + case 1: + return exp(p(0)); + case 2: + return exp(p(0)) * exp(p(1)); + case 3: + return exp(p(0)) * exp(p(1)) * exp(p(2)); + default: + Assert(false, ExcNotImplemented()); + } + return 0.; +} + +template +void +ExpFunction::value_list (const vector > &points, + vector &values, + const unsigned int) const +{ + Assert (values.size() == points.size(), + ExcDimensionMismatch(values.size(), points.size())); + + for (unsigned int i=0;i& p = points[i]; + switch(dim) + { + case 1: + values[i] = exp(p(0)); + break; + case 2: + values[i] = exp(p(0)) * exp(p(1)); + break; + case 3: + values[i] = exp(p(0)) * exp(p(1)) * exp(p(2)); + break; + default: + Assert(false, ExcNotImplemented()); + } + } +} + +template +double +ExpFunction::laplacian (const Point &p, + const unsigned int) const +{ + switch(dim) + { + case 1: + return exp(p(0)); + case 2: + return 2 * exp(p(0)) * exp(p(1)); + case 3: + return 3 * exp(p(0)) * exp(p(1)) * exp(p(2)); + default: + Assert(false, ExcNotImplemented()); + } + return 0.; +} + +template +void +ExpFunction::laplacian_list (const vector > &points, + vector &values, + const unsigned int) const +{ + Assert (values.size() == points.size(), + ExcDimensionMismatch(values.size(), points.size())); + + for (unsigned int i=0;i& p = points[i]; + switch(dim) + { + case 1: + values[i] = exp(p(0)); + break; + case 2: + values[i] = 2 * exp(p(0)) * exp(p(1)); + break; + case 3: + values[i] = 3 * exp(p(0)) * exp(p(1)) * exp(p(2)); + break; + default: + Assert(false, ExcNotImplemented()); + } + } +} + +template +Tensor<1,dim> +ExpFunction::gradient (const Point &p, + const unsigned int) const +{ + Tensor<1,dim> result; + switch(dim) + { + case 1: + result[0] = exp(p(0)); + break; + case 2: + result[0] = exp(p(0)) * exp(p(1)); + result[1] = exp(p(0)) * exp(p(1)); + break; + case 3: + result[0] = exp(p(0)) * exp(p(1)) * exp(p(2)); + result[1] = exp(p(0)) * exp(p(1)) * exp(p(2)); + result[2] = exp(p(0)) * exp(p(1)) * exp(p(2)); + break; + default: + Assert(false, ExcNotImplemented()); + } + return result; +} + +template +void +ExpFunction::gradient_list (const vector > &points, + vector > &gradients, + const unsigned int) const +{ + Assert (gradients.size() == points.size(), + ExcDimensionMismatch(gradients.size(), points.size())); + + for (unsigned int i=0;i& p = points[i]; + switch(dim) + { + case 1: + gradients[i][0] = exp(p(0)); + break; + case 2: + gradients[i][0] = exp(p(0)) * exp(p(1)); + gradients[i][1] = exp(p(0)) * exp(p(1)); + break; + case 3: + gradients[i][0] = exp(p(0)) * exp(p(1)) * exp(p(2)); + gradients[i][1] = exp(p(0)) * exp(p(1)) * exp(p(2)); + gradients[i][2] = exp(p(0)) * exp(p(1)) * exp(p(2)); + break; + default: + Assert(false, ExcNotImplemented()); + } + } +} + +////////////////////////////////////////////////////////////////////// + double LSingularityFunction::value (const Point<2> &p, @@ -520,3 +676,6 @@ template PillowFunction<3>; template CosineFunction<1>; template CosineFunction<2>; template CosineFunction<3>; +template ExpFunction<1>; +template ExpFunction<2>; +template ExpFunction<3>;