From: kanschat Date: Wed, 6 Oct 2010 15:49:27 +0000 (+0000) Subject: standardize test for functions and test more X-Git-Url: https://gitweb.dealii.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=49797e2f3fb3905c466393045a5b8166e0a4042e;p=dealii-svn.git standardize test for functions and test more git-svn-id: https://svn.dealii.org/trunk@22270 0785d39b-7218-0410-832d-ea1e28bc413d --- diff --git a/tests/base/functions.h b/tests/base/functions.h index 97555eb530..7c06a1c00f 100644 --- a/tests/base/functions.h +++ b/tests/base/functions.h @@ -95,3 +95,136 @@ check_function_gradient_consistency( deallog << std::endl; } +/** + * A class replacing the implemented derivatives of a function with + * difference quotients. This way, the correctness of the + * implementation can be tested. + */ +template +class DerivativeTestFunction : + public AutoDerivativeFunction +{ + public: + DerivativeTestFunction(const Function&, const double h); + ~DerivativeTestFunction(); + + virtual void vector_value (const Point& points, Vector& value) const; + virtual double value (const Point& points, const unsigned int component) const; + virtual void vector_value_list (const std::vector< Point< dim > > &points, + std::vector< Vector< double > > &values) const; + + private: + const Function& func; +}; + + +template +DerivativeTestFunction::DerivativeTestFunction(const Function& f, + const double h) + : + AutoDerivativeFunction(h, f.n_components), + func(f) +{ + this->set_formula(AutoDerivativeFunction::FourthOrder); +} + + +template +DerivativeTestFunction::~DerivativeTestFunction() +{} + + +template +void +DerivativeTestFunction::vector_value_list ( + const std::vector< Point< dim > > &points, + std::vector< Vector< double > > &values) const +{ + func.vector_value_list(points, values); +} + + +template +void DerivativeTestFunction::vector_value ( + const Point& point, + Vector& value) const +{ + func.vector_value(point, value); +} + + +template +double DerivativeTestFunction::value ( + const Point& point, + const unsigned int comp) const +{ +// std::cerr << '[' << point << '!' << func.value(point, comp) << ']'; + + return func.value(point, comp); +} + + +// Check whether the difference quotients converge to the gradient +template +void +check_gradient( + const Function& f, + unsigned int sub, + double threshold = 1./14.) +{ + DerivativeTestFunction dtest1(f, 1.e-2); + DerivativeTestFunction dtest2(f, 2.e-2); + + QMidpoint<1> mid; + QIterated quadrature(mid, sub); + const std::vector >& points = quadrature.get_points(); + + std::vector > > + gradients(f.n_components, std::vector >(points.size())); + std::vector > > + gradients1(f.n_components, std::vector >(points.size())); + std::vector > > + gradients2(f.n_components, std::vector >(points.size())); + + deallog << "gradients vs difference quotients"; + + f.vector_gradients(points, gradients); + dtest1.vector_gradients(points, gradients1); + dtest2.vector_gradients(points, gradients2); + + // Compare gradients and difference quotients + for (unsigned int k=0;k d1 = gradients1[k][i] - gradients[k][i]; + Tensor<1,dim> d2 = gradients2[k][i] - gradients[k][i]; + + // If the difference is + // already small, we are fine + if (d1.norm() > 1.e-13) + { + // Check for + // convergence. For full + // 4th order, gradients2 + // should be 16 times as + // large, so let's be a + // bit generous + if (threshold * d2.norm() < d1.norm()) + { + deallog << "Gradient error: point " << i + << " (" << points[i] << " )" + << " comp " << k +// << " norms " << d1.norm() << " " << d2.norm() + << std::endl; + for (unsigned int d=0;d); CHECK(Functions::CosineFunction<2>); CHECK(Functions::CosineFunction<3>); + CHECK(Functions::CosineGradFunction<1>); + CHECK(Functions::CosineGradFunction<2>); + CHECK(Functions::CosineGradFunction<3>); CHECK(Functions::ExpFunction<1>); CHECK(Functions::ExpFunction<2>); CHECK(Functions::ExpFunction<3>); diff --git a/tests/base/functions_01/cmp/generic b/tests/base/functions_01/cmp/generic index 94ed7e6375..867ad3cb31 100644 --- a/tests/base/functions_01/cmp/generic +++ b/tests/base/functions_01/cmp/generic @@ -4,43 +4,70 @@ DEAL::value vs vector value list DEAL::value list vs vector value list DEAL::gradient vs vector gradient list DEAL::gradient list vs vector gradient list +DEAL::gradients vs difference quotients DEAL::Functions::SquareFunction<2> DEAL::value vs vector value list DEAL::value list vs vector value list DEAL::gradient vs vector gradient list DEAL::gradient list vs vector gradient list +DEAL::gradients vs difference quotients DEAL::Functions::SquareFunction<3> DEAL::value vs vector value list DEAL::value list vs vector value list DEAL::gradient vs vector gradient list DEAL::gradient list vs vector gradient list +DEAL::gradients vs difference quotients DEAL::Functions::CosineFunction<1> DEAL::value vs vector value list DEAL::value list vs vector value list DEAL::gradient vs vector gradient list DEAL::gradient list vs vector gradient list +DEAL::gradients vs difference quotients DEAL::Functions::CosineFunction<2> DEAL::value vs vector value list DEAL::value list vs vector value list DEAL::gradient vs vector gradient list DEAL::gradient list vs vector gradient list +DEAL::gradients vs difference quotients DEAL::Functions::CosineFunction<3> DEAL::value vs vector value list DEAL::value list vs vector value list DEAL::gradient vs vector gradient list DEAL::gradient list vs vector gradient list +DEAL::gradients vs difference quotients +DEAL::Functions::CosineGradFunction<1> +DEAL::value vs vector value list +DEAL::value list vs vector value list +DEAL::gradient vs vector gradient list +DEAL::gradient list vs vector gradient list +DEAL::gradients vs difference quotients +DEAL::Functions::CosineGradFunction<2> +DEAL::value vs vector value list +DEAL::value list vs vector value list +DEAL::gradient vs vector gradient list +DEAL::gradient list vs vector gradient list +DEAL::gradients vs difference quotients +DEAL::Functions::CosineGradFunction<3> +DEAL::value vs vector value list +DEAL::value list vs vector value list +DEAL::gradient vs vector gradient list +DEAL::gradient list vs vector gradient list +DEAL::gradients vs difference quotients DEAL::Functions::ExpFunction<1> DEAL::value vs vector value list DEAL::value list vs vector value list DEAL::gradient vs vector gradient list DEAL::gradient list vs vector gradient list +DEAL::gradients vs difference quotients DEAL::Functions::ExpFunction<2> DEAL::value vs vector value list DEAL::value list vs vector value list DEAL::gradient vs vector gradient list DEAL::gradient list vs vector gradient list +DEAL::gradients vs difference quotients DEAL::Functions::ExpFunction<3> DEAL::value vs vector value list DEAL::value list vs vector value list DEAL::gradient vs vector gradient list DEAL::gradient list vs vector gradient list +DEAL::gradients vs difference quotients diff --git a/tests/base/functions_04.cc b/tests/base/functions_04.cc index aedbe826cd..3182841df8 100644 --- a/tests/base/functions_04.cc +++ b/tests/base/functions_04.cc @@ -28,29 +28,7 @@ #include #include - -/** - * A class replacing the implemented derivatives of a function with - * difference quotients. This way, the correctness of the - * implementation can be tested. - */ -template -class DerivativeTestFunction : - public AutoDerivativeFunction -{ - public: - DerivativeTestFunction(const Function&, const double h); - ~DerivativeTestFunction(); - - virtual void vector_value (const Point& points, Vector& value) const; - virtual double value (const Point& points, const unsigned int component) const; - virtual void vector_value_list (const std::vector< Point< dim > > &points, - std::vector< Vector< double > > &values) const; - - private: - const Function& func; -}; - +#include "functions.h" template void @@ -267,47 +245,3 @@ int main() } -template -DerivativeTestFunction::DerivativeTestFunction(const Function& f, - const double h) - : - AutoDerivativeFunction(h, f.n_components), - func(f) -{ - this->set_formula(AutoDerivativeFunction::FourthOrder); -} - - -template -DerivativeTestFunction::~DerivativeTestFunction() -{} - - -template -void -DerivativeTestFunction::vector_value_list ( - const std::vector< Point< dim > > &points, - std::vector< Vector< double > > &values) const -{ - func.vector_value_list(points, values); -} - - -template -void DerivativeTestFunction::vector_value ( - const Point& point, - Vector& value) const -{ - func.vector_value(point, value); -} - - -template -double DerivativeTestFunction::value ( - const Point& point, - const unsigned int comp) const -{ -// std::cerr << '[' << point << '!' << func.value(point, comp) << ']'; - - return func.value(point, comp); -} diff --git a/tests/base/functions_singularity.cc b/tests/base/functions_singularity.cc index 247acf170f..b2a776e73c 100644 --- a/tests/base/functions_singularity.cc +++ b/tests/base/functions_singularity.cc @@ -30,31 +30,6 @@ #include #include - -/** - * A class replacing the implemented derivatives of a function with - * difference quotients. This way, the correctness of the - * implementation can be tested. - */ -template -class DerivativeTestFunction : - public AutoDerivativeFunction -{ - public: - DerivativeTestFunction(const Function&, const double h); - ~DerivativeTestFunction(); - - virtual void vector_value (const Point& points, Vector& value) const; - virtual double value (const Point& points, const unsigned int component) const; - virtual void vector_value_list (const std::vector< Point< dim > > &points, - std::vector< Vector< double > > &values) const; - - private: - const Function& func; -}; - - - template void check_function_consistency( @@ -275,48 +250,3 @@ int main() check_function_consistency(fl, flg, 5); } - -template -DerivativeTestFunction::DerivativeTestFunction(const Function& f, - const double h) - : - AutoDerivativeFunction(h, f.n_components), - func(f) -{ - this->set_formula(AutoDerivativeFunction::FourthOrder); -} - - -template -DerivativeTestFunction::~DerivativeTestFunction() -{} - - -template -void -DerivativeTestFunction::vector_value_list ( - const std::vector< Point< dim > > &points, - std::vector< Vector< double > > &values) const -{ - func.vector_value_list(points, values); -} - - -template -void DerivativeTestFunction::vector_value ( - const Point& point, - Vector& value) const -{ - func.vector_value(point, value); -} - - -template -double DerivativeTestFunction::value ( - const Point& point, - const unsigned int comp) const -{ -// std::cerr << '[' << point << '!' << func.value(point, comp) << ']'; - - return func.value(point, comp); -}