00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #ifndef __deal2__function_h
00013 #define __deal2__function_h
00014
00015
00016 #include <deal.II/base/config.h>
00017 #include <deal.II/base/exceptions.h>
00018 #include <deal.II/base/function_time.h>
00019 #include <deal.II/base/subscriptor.h>
00020 #include <deal.II/base/tensor.h>
00021 #include <deal.II/base/point.h>
00022 #include <deal.II/base/std_cxx1x/function.h>
00023
00024 #include <vector>
00025
00026 DEAL_II_NAMESPACE_OPEN
00027 template <typename number> class Vector;
00028
00100 template <int dim>
00101 class Function : public FunctionTime,
00102 public Subscriptor
00103 {
00104 public:
00112 static const unsigned int dimension = dim;
00113
00117 const unsigned int n_components;
00118
00128 Function (const unsigned int n_components = 1,
00129 const double initial_time = 0.0);
00130
00167 virtual ~Function ()
00168 #ifndef DEAL_II_IMPLEMENTED_PURE_FUNCTION_BUG
00169 = 0
00170 #endif
00171 ;
00172
00185 Function & operator= (const Function &f);
00186
00198 virtual double value (const Point<dim> &p,
00199 const unsigned int component = 0) const;
00200
00210 virtual void vector_value (const Point<dim> &p,
00211 Vector<double> &values) const;
00212
00227 virtual void value_list (const std::vector<Point<dim> > &points,
00228 std::vector<double> &values,
00229 const unsigned int component = 0) const;
00230
00247 virtual void vector_value_list (const std::vector<Point<dim> > &points,
00248 std::vector<Vector<double> > &values) const;
00249
00263 virtual void vector_values (const std::vector<Point<dim> >& points,
00264 std::vector<std::vector<double> >& values) const;
00265
00271 virtual Tensor<1,dim> gradient (const Point<dim> &p,
00272 const unsigned int component = 0) const;
00273
00279 virtual void vector_gradient (const Point<dim> &p,
00280 std::vector<Tensor<1,dim> > &gradients) const;
00281
00291 virtual void gradient_list (const std::vector<Point<dim> > &points,
00292 std::vector<Tensor<1,dim> > &gradients,
00293 const unsigned int component = 0) const;
00294
00308 virtual void vector_gradients (const std::vector<Point<dim> > &points,
00309 std::vector<std::vector<Tensor<1,dim> > > &gradients) const;
00310
00325 virtual void vector_gradient_list (const std::vector<Point<dim> > &points,
00326 std::vector<std::vector<Tensor<1,dim> > > &gradients) const;
00327
00332 virtual double laplacian (const Point<dim> &p,
00333 const unsigned int component = 0) const;
00334
00340 virtual void vector_laplacian (const Point<dim> &p,
00341 Vector<double> &values) const;
00342
00347 virtual void laplacian_list (const std::vector<Point<dim> > &points,
00348 std::vector<double> &values,
00349 const unsigned int component = 0) const;
00350
00355 virtual void vector_laplacian_list (const std::vector<Point<dim> > &points,
00356 std::vector<Vector<double> > &values) const;
00357
00374 std::size_t memory_consumption () const;
00375 };
00376
00377
00391 template <int dim>
00392 class ZeroFunction : public Function<dim>
00393 {
00394 public:
00399 ZeroFunction (const unsigned int n_components = 1);
00400
00405 virtual ~ZeroFunction ();
00406
00412 virtual double value (const Point<dim> &p,
00413 const unsigned int component) const;
00414
00420 virtual void vector_value (const Point<dim> &p,
00421 Vector<double> &return_value) const;
00422
00432 virtual void value_list (const std::vector<Point<dim> > &points,
00433 std::vector<double> &values,
00434 const unsigned int component = 0) const;
00435
00445 virtual void vector_value_list (const std::vector<Point<dim> > &points,
00446 std::vector<Vector<double> > &values) const;
00447
00453 virtual Tensor<1,dim> gradient (const Point<dim> &p,
00454 const unsigned int component = 0) const;
00455
00462 virtual void vector_gradient (const Point<dim> &p,
00463 std::vector<Tensor<1,dim> > &gradients) const;
00464
00473 virtual void gradient_list (const std::vector<Point<dim> > &points,
00474 std::vector<Tensor<1,dim> > &gradients,
00475 const unsigned int component = 0) const;
00476
00491 virtual void vector_gradient_list (const std::vector<Point<dim> > &points,
00492 std::vector<std::vector<Tensor<1,dim> > > &gradients) const;
00493 };
00494
00495
00520 template <int dim>
00521 class ConstantFunction : public ZeroFunction<dim>
00522 {
00523 public:
00529 ConstantFunction (const double value,
00530 const unsigned int n_components = 1);
00531
00536 virtual ~ConstantFunction ();
00537
00543 virtual double value (const Point<dim> &p,
00544 const unsigned int component) const;
00545
00551 virtual void vector_value (const Point<dim> &p,
00552 Vector<double> &return_value) const;
00553
00563 virtual void value_list (const std::vector<Point<dim> > &points,
00564 std::vector<double> &values,
00565 const unsigned int component = 0) const;
00566
00576 virtual void vector_value_list (const std::vector<Point<dim> > &points,
00577 std::vector<Vector<double> > &values) const;
00578
00595 std::size_t memory_consumption () const;
00596
00597 protected:
00601 const double function_value;
00602 };
00603
00604
00605
00618 template <int dim>
00619 class ComponentSelectFunction : public ConstantFunction<dim>
00620 {
00621 public:
00631 ComponentSelectFunction (const unsigned int selected,
00632 const double value,
00633 const unsigned int n_components);
00634
00642 ComponentSelectFunction (const unsigned int selected,
00643 const unsigned int n_components);
00644
00659 ComponentSelectFunction (const std::pair<unsigned int, unsigned int> &selected,
00660 const unsigned int n_components);
00661
00667 virtual void vector_value (const Point<dim> &p,
00668 Vector<double> &return_value) const;
00669
00679 virtual void vector_value_list (const std::vector<Point<dim> > &points,
00680 std::vector<Vector<double> > &values) const;
00681
00698 std::size_t memory_consumption () const;
00699
00700 protected:
00706 const std::pair<unsigned int,unsigned int> selected_components;
00707 };
00708
00709
00786 template <int dim>
00787 class ScalarFunctionFromFunctionObject : public Function<dim>
00788 {
00789 public:
00795 ScalarFunctionFromFunctionObject (const std_cxx1x::function<double (const Point<dim> &)> &function_object);
00796
00804 virtual double value (const Point<dim> &p,
00805 const unsigned int component = 0) const;
00806
00807 private:
00812 const std_cxx1x::function<double (const Point<dim> &)> function_object;
00813 };
00814
00815
00850 template <int dim>
00851 class VectorFunctionFromScalarFunctionObject : public Function<dim>
00852 {
00853 public:
00866 VectorFunctionFromScalarFunctionObject (const std_cxx1x::function<double (const Point<dim> &)> &function_object,
00867 const unsigned int selected_component,
00868 const unsigned int n_components);
00869
00877 virtual double value (const Point<dim> &p,
00878 const unsigned int component = 0) const;
00879
00889 virtual void vector_value (const Point<dim> &p,
00890 Vector<double> &values) const;
00891
00892 private:
00897 const std_cxx1x::function<double (const Point<dim> &)> function_object;
00898
00903 const unsigned int selected_component;
00904 };
00905
00906
00907 DEAL_II_NAMESPACE_CLOSE
00908
00909 #endif
00910