00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #ifndef __deal2__fe_function_h
00013 #define __deal2__fe_function_h
00014
00015 #include <deal.II/base/function.h>
00016 #include <deal.II/dofs/dof_handler.h>
00017 #include <deal.II/dofs/dof_accessor.h>
00018 #include <deal.II/fe/mapping_q1.h>
00019 #include <deal.II/base/function.h>
00020 #include <deal.II/base/point.h>
00021 #include <deal.II/base/tensor.h>
00022 #include <deal.II/base/thread_local_storage.h>
00023
00024 #include <deal.II/lac/vector.h>
00025
00026 DEAL_II_NAMESPACE_OPEN
00027
00028 namespace Functions
00029 {
00030
00120 template <int dim,
00121 typename DH=DoFHandler<dim>,
00122 typename VECTOR=Vector<double> >
00123 class FEFieldFunction : public Function<dim>
00124 {
00125 public:
00144 FEFieldFunction (const DH &dh,
00145 const VECTOR &data_vector,
00146 const Mapping<dim> &mapping = StaticMappingQ1<dim>::mapping);
00147
00156 void set_active_cell(typename DH::active_cell_iterator &newcell);
00157
00172 virtual void vector_value (const Point<dim> &p,
00173 Vector<double> &values) const;
00174
00196 virtual double value (const Point< dim > & p,
00197 const unsigned int component = 0) const;
00198
00213 virtual void value_list (const std::vector<Point< dim > > & points,
00214 std::vector< double > &values,
00215 const unsigned int component = 0) const;
00216
00217
00231 virtual void vector_value_list (const std::vector<Point< dim > > & points,
00232 std::vector< Vector<double> > &values) const;
00233
00249 virtual void
00250 vector_gradient (const Point< dim > &p,
00251 std::vector< Tensor< 1, dim > > &gradients) const;
00252
00268 virtual Tensor<1,dim> gradient(const Point< dim > &p,
00269 const unsigned int component = 0)const;
00270
00281 virtual void
00282 vector_gradient_list (const std::vector< Point< dim > > &p,
00283 std::vector<
00284 std::vector< Tensor< 1, dim > > > &gradients) const;
00285
00296 virtual void
00297 gradient_list (const std::vector< Point< dim > > &p,
00298 std::vector< Tensor< 1, dim > > &gradients,
00299 const unsigned int component=0) const;
00300
00301
00306 virtual double
00307 laplacian (const Point<dim> &p,
00308 const unsigned int component = 0) const;
00309
00315 virtual void
00316 vector_laplacian (const Point<dim> &p,
00317 Vector<double> &values) const;
00318
00323 virtual void
00324 laplacian_list (const std::vector<Point<dim> > &points,
00325 std::vector<double> &values,
00326 const unsigned int component = 0) const;
00327
00332 virtual void
00333 vector_laplacian_list (const std::vector<Point<dim> > &points,
00334 std::vector<Vector<double> > &values) const;
00335
00361 unsigned int
00362 compute_point_locations(const std::vector<Point<dim> > &points,
00363 std::vector<typename DH::active_cell_iterator > &cells,
00364 std::vector<std::vector<Point<dim> > > &qpoints,
00365 std::vector<std::vector<unsigned int> > &maps) const;
00366
00367 private:
00371 typedef Threads::ThreadLocalStorage <
00372 typename DH::active_cell_iterator > cell_hint_t;
00373
00377 SmartPointer<const DH,FEFieldFunction<dim, DH, VECTOR> > dh;
00378
00383 const VECTOR & data_vector;
00384
00389 const Mapping<dim> & mapping;
00390
00394 mutable cell_hint_t cell_hint;
00395
00400 const unsigned int n_components;
00401 };
00402 }
00403
00404 DEAL_II_NAMESPACE_CLOSE
00405
00406 #endif
00407