DOpE
function_wrapper.h
Go to the documentation of this file.
1 
24 #ifndef DOPE_FUNCTION_H_
25 #define DOPE_FUNCTION_H_
26 
27 #include <deal.II/base/exceptions.h>
28 #include <deal.II/base/function.h>
29 #include <deal.II/lac/vector.h>
30 
31 namespace DOpEWrapper
32 {
43  template<int dim>
44  class Function : public dealii::Function<dim>
45  {
46  public:
47  Function(const unsigned int n_components = 1,
48  const double initial_time = 0.0)
49  : dealii::Function<dim>(n_components, initial_time)
50  {
51  init_time_ = initial_time;
52  }
53 
54  /******************************************************/
55  void
56  vector_value(const dealii::Point<dim> &p,
57  dealii::Vector<double> &return_value) const
58  {
59  Assert(return_value.size() == this->n_components,
60  dealii::ExcDimensionMismatch(return_value.size(), this->n_components));
61  for (unsigned int comp = 0; comp < this->n_components; comp++)
62  {
63  return_value(comp) = this->value(p, comp);
64  }
65  }
66 
73  virtual void
74  SetTime(double /*time*/) const
75  {
76  }
77  ;
78 
82  double
83  InitialTime() const
84  {
85  return init_time_;
86  }
87  ;
88  private:
89  double init_time_;
90  };
91 
92  /******************************************************/
93  /******************************************************/
94 
100  template<int dim>
101  class ZeroFunction : public Function<dim>
102  {
103  public:
104 
105  ZeroFunction(const unsigned int n_components = 1)
106  : Function<dim>(n_components)
107  {
108  }
109 
110  virtual
112  {
113  }
114 
115  virtual double
116  value(const dealii::Point<dim> &/*p*/,
117  const unsigned int /*component*/) const
118  {
119  return 0.0;
120  }
121 
122  virtual void
123  vector_value(const dealii::Point<dim> &/*p*/,
124  dealii::Vector<double> &return_value) const
125  {
126  Assert(return_value.size() == this->n_components,
127  ExcDimensionMismatch (return_value.size(), this->n_components));
128 
129  std::fill(return_value.begin(), return_value.end(), 0.0);
130  }
131 
132  virtual void
133  value_list(const std::vector<dealii::Point<dim> > &/*points*/,
134  std::vector<double> &values,
135  const unsigned int /*component*/ = 0) const
136  {
137  // Assert(values.size() == points.size(),
138  // ExcDimensionMismatch(values.size(), points.size()));
139 
140  std::fill(values.begin(), values.end(), 0.);
141  }
142 
143  virtual void
144  vector_value_list(const std::vector<dealii::Point<dim> > &points,
145  std::vector<dealii::Vector<double> > &values) const
146  {
147  Assert(values.size() == points.size(),
148  ExcDimensionMismatch(values.size(), points.size()));
149 
150  for (unsigned int i = 0; i < points.size(); ++i)
151  {
152  Assert(values[i].size() == this->n_components,
153  ExcDimensionMismatch(values[i].size(), this->n_components));
154  std::fill(values[i].begin(), values[i].end(), 0.);
155  };
156  }
157 
158  virtual dealii::Tensor<1, dim>
159  gradient(const dealii::Point<dim> &/*p*/,
160  const unsigned int /*component*/ = 0) const
161  {
162  return dealii::Tensor<1, dim>();
163  }
164 
165  virtual void
166  vector_gradient(const dealii::Point<dim> &/*p*/,
167  std::vector<dealii::Tensor<1, dim> > &gradients) const
168  {
169  Assert(gradients.size() == this->n_components,
170  ExcDimensionMismatch(gradients.size(), this->n_components));
171 
172  for (unsigned int c = 0; c < this->n_components; ++c)
173  gradients[c].clear();
174  }
175 
176  virtual void
177  gradient_list(const std::vector<dealii::Point<dim> > &points,
178  std::vector<dealii::Tensor<1, dim> > &gradients,
179  const unsigned int /*component*/ = 0) const
180  {
181  Assert(gradients.size() == points.size(),
182  ExcDimensionMismatch(gradients.size(), points.size()));
183 
184  for (unsigned int i = 0; i < points.size(); ++i)
185  gradients[i].clear();
186  }
187 
188  virtual void
189  vector_gradient_list(const std::vector<dealii::Point<dim> > &points,
190  std::vector<std::vector<dealii::Tensor<1, dim> > > &gradients) const
191  {
192  Assert(gradients.size() == points.size(),
193  ExcDimensionMismatch(gradients.size(), points.size()));
194  for (unsigned int i = 0; i < points.size(); ++i)
195  {
196  Assert(gradients[i].size() == this->n_components,
197  ExcDimensionMismatch(gradients[i].size(), this->n_components));
198  for (unsigned int c = 0; c < this->n_components; ++c)
199  gradients[i][c].clear();
200  };
201  }
202  };
203 
204  /******************************************************/
205 
212  template<int dim>
213  class ConstantFunction : public ZeroFunction<dim>
214  {
215  public:
216  ConstantFunction(const double value,
217  const unsigned int n_components = 1)
218  : ZeroFunction<dim>(n_components), function_value_(value)
219  {
220  }
221  ;
222 
223  virtual
225  {
226  }
227  ;
228 
229  virtual double
230  value(const dealii::Point<dim> &/*p*/,
231  const unsigned int /*component*/) const
232  {
233  return function_value_;
234  }
235 
236  virtual void
237  vector_value(const dealii::Point<dim> &/*p*/,
238  dealii::Vector<double> &return_value) const
239  {
240  Assert(return_value.size() == this->n_components,
241  ExcDimensionMismatch (return_value.size(), this->n_components));
242 
243  std::fill(return_value.begin(), return_value.end(), function_value_);
244  }
245 
246  virtual void
247  value_list(const std::vector<dealii::Point<dim> > &/*points*/,
248  std::vector<double> &values,
249  const unsigned int /*component*/ = 0) const
250  {
251 // Assert(values.size() == points.size(),
252 // ExcDimensionMismatch(values.size(), points.size()));
253 
254  std::fill(values.begin(), values.end(), function_value_);
255  }
256 
257  virtual void
258  vector_value_list(const std::vector<dealii::Point<dim> > &points,
259  std::vector<dealii::Vector<double> > &values) const
260  {
261  Assert(values.size() == points.size(),
262  ExcDimensionMismatch(values.size(), points.size()));
263 
264  for (unsigned int i = 0; i < points.size(); ++i)
265  {
266  Assert(values[i].size() == this->n_components,
267  ExcDimensionMismatch(values[i].size(), this->n_components));
268  std::fill(values[i].begin(), values[i].end(), function_value_);
269  };
270  }
271 
272  private:
273  const double function_value_;
274  };
275 
276 } //end of namespace
277 
278 #endif
virtual void vector_value(const dealii::Point< dim > &, dealii::Vector< double > &return_value) const
Definition: function_wrapper.h:123
virtual void value_list(const std::vector< dealii::Point< dim > > &, std::vector< double > &values, const unsigned int=0) const
Definition: function_wrapper.h:133
virtual void vector_gradient_list(const std::vector< dealii::Point< dim > > &points, std::vector< std::vector< dealii::Tensor< 1, dim > > > &gradients) const
Definition: function_wrapper.h:189
virtual void SetTime(double) const
Definition: function_wrapper.h:74
double InitialTime() const
Definition: function_wrapper.h:83
virtual void value_list(const std::vector< dealii::Point< dim > > &, std::vector< double > &values, const unsigned int=0) const
Definition: function_wrapper.h:247
ZeroFunction(const unsigned int n_components=1)
Definition: function_wrapper.h:105
virtual void vector_value_list(const std::vector< dealii::Point< dim > > &points, std::vector< dealii::Vector< double > > &values) const
Definition: function_wrapper.h:258
ConstantFunction(const double value, const unsigned int n_components=1)
Definition: function_wrapper.h:216
virtual void gradient_list(const std::vector< dealii::Point< dim > > &points, std::vector< dealii::Tensor< 1, dim > > &gradients, const unsigned int=0) const
Definition: function_wrapper.h:177
virtual dealii::Tensor< 1, dim > gradient(const dealii::Point< dim > &, const unsigned int=0) const
Definition: function_wrapper.h:159
virtual double value(const dealii::Point< dim > &, const unsigned int) const
Definition: function_wrapper.h:230
virtual ~ConstantFunction()
Definition: function_wrapper.h:224
virtual double value(const dealii::Point< dim > &, const unsigned int) const
Definition: function_wrapper.h:116
Definition: function_wrapper.h:101
virtual void vector_value(const dealii::Point< dim > &, dealii::Vector< double > &return_value) const
Definition: function_wrapper.h:237
virtual void vector_value_list(const std::vector< dealii::Point< dim > > &points, std::vector< dealii::Vector< double > > &values) const
Definition: function_wrapper.h:144
Definition: function_wrapper.h:213
void vector_value(const dealii::Point< dim > &p, dealii::Vector< double > &return_value) const
Definition: function_wrapper.h:56
Function(const unsigned int n_components=1, const double initial_time=0.0)
Definition: function_wrapper.h:47
virtual ~ZeroFunction()
Definition: function_wrapper.h:111
Definition: function_wrapper.h:44
virtual void vector_gradient(const dealii::Point< dim > &, std::vector< dealii::Tensor< 1, dim > > &gradients) const
Definition: function_wrapper.h:166