dune-pdelab  2.0.0
convectiondiffusionparameter.hh
Go to the documentation of this file.
1 // -*- tab-width: 4; indent-tabs-mode: nil -*-
2 #ifndef DUNE_PDELAB_CONVECTIONDIFFUSIONPARAMETER_HH
3 #define DUNE_PDELAB_CONVECTIONDIFFUSIONPARAMETER_HH
4 
5 #include<vector>
6 
7 #include<dune/common/exceptions.hh>
8 #include<dune/common/fvector.hh>
9 #include<dune/common/static_assert.hh>
10 #include<dune/geometry/type.hh>
11 #include<dune/geometry/referenceelements.hh>
12 #include<dune/geometry/quadraturerules.hh>
17 
18 #include"diffusionparam.hh"
19 
20 namespace Dune {
21  namespace PDELab {
22 
29  template<typename GV, typename RF>
30  struct ConvectionDiffusionParameterTraits
31  {
33  typedef GV GridViewType;
34 
36  enum {
38  dimDomain = GV::dimension
39  };
40 
42  typedef typename GV::Grid::ctype DomainFieldType;
43 
45  typedef Dune::FieldVector<DomainFieldType,dimDomain> DomainType;
46 
48  typedef Dune::FieldVector<DomainFieldType,dimDomain-1> IntersectionDomainType;
49 
51  typedef RF RangeFieldType;
52 
54  typedef Dune::FieldVector<RF,GV::dimensionworld> RangeType;
55 
57  typedef Dune::FieldMatrix<RangeFieldType,dimDomain,dimDomain> PermTensorType;
58 
60  typedef typename GV::Traits::template Codim<0>::Entity ElementType;
61  typedef typename GV::Intersection IntersectionType;
62  };
63 
67  {
68  enum Type { Dirichlet=1, Neumann=-1, Outflow=-2, None=-3 }; // BC requiring constraints must be >0 if
69  // constraints assembler coming with PDELab is used
70  };
71 
87  template<typename GV, typename RF>
89  {
91 
92  public:
94 
96  typename Traits::PermTensorType
97  A (const typename Traits::ElementType& e, const typename Traits::DomainType& x) const
98  {
99  typename Traits::PermTensorType I;
100  for (std::size_t i=0; i<Traits::dimDomain; i++)
101  for (std::size_t j=0; j<Traits::dimDomain; j++)
102  I[i][j] = (i==j) ? 1 : 0;
103  return I;
104  }
105 
107  typename Traits::RangeType
108  b (const typename Traits::ElementType& e, const typename Traits::DomainType& x) const
109  {
110  typename Traits::RangeType v(0.0);
111  return v;
112  }
113 
115  typename Traits::RangeFieldType
116  c (const typename Traits::ElementType& e, const typename Traits::DomainType& x) const
117  {
118  return 0.0;
119  }
120 
122  typename Traits::RangeFieldType
123  f (const typename Traits::ElementType& e, const typename Traits::DomainType& x) const
124  {
125  return 0.0;
126  }
127 
129  BCType
130  bctype (const typename Traits::IntersectionType& is, const typename Traits::IntersectionDomainType& x) const
131  {
132  typename Traits::DomainType xglobal = is.geometry().global(x);
134  }
135 
137  typename Traits::RangeFieldType
138  g (const typename Traits::ElementType& e, const typename Traits::DomainType& x) const
139  {
140  typename Traits::DomainType xglobal = e.geometry().global(x);
141  return xglobal.two_norm();
142  }
143 
145  typename Traits::RangeFieldType
146  j (const typename Traits::IntersectionType& is, const typename Traits::IntersectionDomainType& x) const
147  {
148  return 0.0;
149  }
150 
152  typename Traits::RangeFieldType
153  o (const typename Traits::IntersectionType& is, const typename Traits::IntersectionDomainType& x) const
154  {
155  return 0.0;
156  }
157  };
158 
159 
164  template<typename T>
166  : public Dune::PDELab::DirichletConstraintsParameters /*@\label{bcp:base}@*/
167  {
168  const T& t;
169 
170  public:
171 
172  ConvectionDiffusionBoundaryConditionAdapter(const typename T::Traits::GridViewType& gv_,
173  const T& t_ )
174  : t( t_ )
175  {}
176 
178  : t( t_ )
179  {}
180 
181  template<typename I>
182  bool isDirichlet(const I & ig /*@\label{bcp:name}@*/
183  , const Dune::FieldVector<typename I::ctype, I::dimension-1> & coord
184  ) const
185  {
186  return( t.bctype( ig.intersection(), coord )
188  }
189 
190  };
191 
192 
197  template<typename T>
199  : public Dune::PDELab::GridFunctionBase<Dune::PDELab::GridFunctionTraits<typename T::Traits::GridViewType,
200  typename T::Traits::RangeFieldType,
201  1,Dune::FieldVector<typename T::Traits::RangeFieldType,1> >
202  ,ConvectionDiffusionDirichletExtensionAdapter<T> >
203  {
204  public:
205  typedef Dune::PDELab::GridFunctionTraits<typename T::Traits::GridViewType,
206  typename T::Traits::RangeFieldType,
207  1,Dune::FieldVector<typename T::Traits::RangeFieldType,1> > Traits;
208 
211  : g(g_), t(t_)
212  {}
213 
215  inline void evaluate (const typename Traits::ElementType& e,
216  const typename Traits::DomainType& x,
217  typename Traits::RangeType& y) const
218  {
219  y = t.g(e,x);
220  }
221 
222  inline const typename Traits::GridViewType& getGridView () const
223  {
224  return g;
225  }
226 
227  inline void setTime(double time_)
228  {
229  t.setTime(time_);
230  }
231 
232  private:
233  const typename Traits::GridViewType g;
234  T& t;
235  };
236 
237 
238 
243 template<typename T>
245  : public Dune::PDELab::GridFunctionBase<Dune::PDELab::GridFunctionTraits<typename T::Traits::GridViewType,
246  typename T::Traits::RangeFieldType,
247  T::Traits::GridViewType::dimension,Dune::FieldVector<typename T::Traits::RangeFieldType,T::Traits::GridViewType::dimension> >
248  ,ConvectionDiffusionExactGradientAdapter<T> >
249 {
250 public:
251  typedef Dune::PDELab::GridFunctionTraits<typename T::Traits::GridViewType,
252  typename T::Traits::RangeFieldType,
253  T::Traits::GridViewType::dimension,Dune::FieldVector<typename T::Traits::RangeFieldType,T::Traits::GridViewType::dimension> > Traits;
254 
256  ConvectionDiffusionExactGradientAdapter (const typename Traits::GridViewType& g_, const T& t_) : g(g_), t(t_) {}
257 
259  inline void evaluate (const typename Traits::ElementType& e,
260  const typename Traits::DomainType& x,
261  typename Traits::RangeType& y) const
262  {
263  y = t.gradient(e,x);
264  }
265 
266  inline const typename Traits::GridViewType& getGridView () const
267  {
268  return g;
269  }
270 
271 private:
272  const typename Traits::GridViewType g;
273  const T& t;
274 };
275 
279  template<typename K, typename A0, typename F, typename B, typename G, typename J>
281  {
282  typedef typename F::Traits::RangeFieldType RF;
283  typedef typename F::Traits::GridViewType GV;
284 
286 
287  public:
289 
291  ConvectionDiffusion_Diffusion_Adapter (const K& k_, const A0& a0_, const F& f_, const B& b_, const G& g_, const J& j_) :
292  k__(k_), a0__(a0_), f__(f_), b__(b_), g__(g_), j__(j_)
293  {}
294 
296  typename Traits::PermTensorType
297  A (const typename Traits::ElementType& e, const typename Traits::DomainType& x) const
298  {
299  typename K::Traits::RangeType tensor(0.0);
300  k__.evaluate(e,x,tensor);
301  return tensor;
302  }
303 
305  typename Traits::RangeType
306  b (const typename Traits::ElementType& e, const typename Traits::DomainType& x) const
307  {
308  typename Traits::RangeType v(0.0);
309  return v;
310  }
311 
313  typename Traits::RangeFieldType
314  c (const typename Traits::ElementType& e, const typename Traits::DomainType& x) const
315  {
316  typename A0::Traits::RangeType y;
317  a0__.evaluate(e,x,y);
318  return y;
319  }
320 
322  typename Traits::RangeFieldType
323  f (const typename Traits::ElementType& e, const typename Traits::DomainType& x) const
324  {
325  typename F::Traits::RangeType y;
326  f__.evaluate(e,x,y);
327  return y;
328  }
329 
331  BCType
332  bctype (const typename Traits::IntersectionType& is, const typename Traits::IntersectionDomainType& x) const
333  {
334  typename B::Traits::RangeType bctype;
338  }
339 
341  typename Traits::RangeFieldType
342  g (const typename Traits::ElementType& e, const typename Traits::DomainType& x) const
343  {
344  typename G::Traits::RangeType y;
345  g__.evaluate(e,x,y);
346  return y;
347  }
348 
350  typename Traits::RangeFieldType
351  j (const typename Traits::IntersectionType& is, const typename Traits::IntersectionDomainType& x) const
352  {
353  typename J::Traits::RangeType y;
354  j__.evaluate(*(is.inside()),is.geometryInInside().global(x),y);
355  return y;
356  }
357 
359  typename Traits::RangeFieldType
360  o (const typename Traits::IntersectionType& is, const typename Traits::IntersectionDomainType& x) const
361  {
362  return 0.0;
363  }
364 
365  private:
366  const K& k__;
367  const A0& a0__;
368  const F& f__;
369  const B& b__;
370  const G& g__;
371  const J& j__;
372  };
373  }
374 }
375 
376 
377 #endif
const Traits::GridViewType & getGridView() const
Definition: convectiondiffusionparameter.hh:222
Definition: convectiondiffusionparameter.hh:68
Dune::FieldVector< RF, GV::dimensionworld > RangeType
range type
Definition: convectiondiffusionparameter.hh:54
Traits::RangeType b(const typename Traits::ElementType &e, const typename Traits::DomainType &x) const
velocity field
Definition: convectiondiffusionparameter.hh:306
ConvectionDiffusionBoundaryConditionAdapter(const T &t_)
Definition: convectiondiffusionparameter.hh:177
traits class for two phase parameter class
Definition: convectiondiffusion.hh:41
bool isDirichlet(const I &ig, const Dune::FieldVector< typename I::ctype, I::dimension-1 > &coord) const
Definition: convectiondiffusionparameter.hh:182
Definition: convectiondiffusionparameter.hh:165
GV::Traits::template Codim< 0 >::Entity ElementType
grid types
Definition: convectiondiffusionparameter.hh:60
Traits::RangeFieldType o(const typename Traits::IntersectionType &is, const typename Traits::IntersectionDomainType &x) const
outflow boundary condition
Definition: convectiondiffusionparameter.hh:153
Dune::FieldVector< DomainFieldType, dimDomain > DomainType
domain type
Definition: convectiondiffusionparameter.hh:45
GV::Traits::template Codim< 0 >::Entity ElementType
codim 0 entity
Definition: function.hh:118
ConvectionDiffusionExactGradientAdapter(const typename Traits::GridViewType &g_, const T &t_)
constructor
Definition: convectiondiffusionparameter.hh:256
Traits::RangeFieldType g(const typename Traits::ElementType &e, const typename Traits::DomainType &x) const
Dirichlet boundary condition value.
Definition: convectiondiffusionparameter.hh:342
GV GridViewType
the grid view
Definition: convectiondiffusionparameter.hh:33
Traits::RangeFieldType c(const typename Traits::ElementType &e, const typename Traits::DomainType &x) const
sink term
Definition: convectiondiffusionparameter.hh:116
Traits::RangeFieldType g(const typename Traits::ElementType &e, const typename Traits::DomainType &x) const
Dirichlet boundary condition value.
Definition: convectiondiffusionparameter.hh:138
Definition: common/constraintsparameters.hh:24
ConvectionDiffusionDirichletExtensionAdapter(const typename Traits::GridViewType &g_, T &t_)
constructor
Definition: convectiondiffusionparameter.hh:210
Traits::RangeFieldType j(const typename Traits::IntersectionType &is, const typename Traits::IntersectionDomainType &x) const
Neumann boundary condition.
Definition: convectiondiffusionparameter.hh:146
dimension of the domain
Definition: convectiondiffusion.hh:49
Traits::PermTensorType A(const typename Traits::ElementType &e, const typename Traits::DomainType &x) const
tensor diffusion coefficient
Definition: convectiondiffusionparameter.hh:297
RF RangeFieldType
Export type for range field.
Definition: convectiondiffusionparameter.hh:51
BCType bctype(const typename Traits::IntersectionType &is, const typename Traits::IntersectionDomainType &x) const
boundary condition type function
Definition: convectiondiffusionparameter.hh:332
Dune::FieldVector< GV::Grid::ctype, GV::dimension > DomainType
domain type in dim-size coordinates
Definition: function.hh:49
Dune::FieldMatrix< RangeFieldType, dimDomain, dimDomain > PermTensorType
permeability tensor type
Definition: convectiondiffusionparameter.hh:57
static bool isDirichlet(Type i)
Test for Dirichlet boundary condition.
Definition: diffusionparam.hh:25
Adapter to get ConvectionDiffusion parameter object from the old style separate parameter grid functi...
Definition: convectiondiffusionparameter.hh:280
Dune::PDELab::GridFunctionTraits< typename T::Traits::GridViewType, typename T::Traits::RangeFieldType, T::Traits::GridViewType::dimension, Dune::FieldVector< typename T::Traits::RangeFieldType, T::Traits::GridViewType::dimension > > Traits
Definition: convectiondiffusionparameter.hh:253
GV::Grid::ctype DomainFieldType
Export type for domain field.
Definition: convectiondiffusionparameter.hh:42
Traits::RangeFieldType c(const typename Traits::ElementType &e, const typename Traits::DomainType &x) const
sink term
Definition: convectiondiffusionparameter.hh:314
Traits::RangeType b(const typename Traits::ElementType &e, const typename Traits::DomainType &x) const
velocity field
Definition: convectiondiffusionparameter.hh:108
GV::Intersection IntersectionType
Definition: convectiondiffusionparameter.hh:61
const IG & ig
Definition: common/constraints.hh:146
ConvectionDiffusionParameterTraits< GV, RF > Traits
Definition: convectiondiffusionparameter.hh:93
leaf of a function tree
Definition: function.hh:577
Definition: convectiondiffusionparameter.hh:244
Traits::RangeFieldType j(const typename Traits::IntersectionType &is, const typename Traits::IntersectionDomainType &x) const
Neumann boundary condition.
Definition: convectiondiffusionparameter.hh:351
Parameter class for solving the linear convection-diffusion equation.
Definition: convectiondiffusionparameter.hh:88
Traits::RangeFieldType f(const typename Traits::ElementType &e, const typename Traits::DomainType &x) const
source term
Definition: convectiondiffusionparameter.hh:323
void evaluate(const typename Traits::ElementType &e, const typename Traits::DomainType &x, typename Traits::RangeType &y) const
Evaluate the GridFunction at given position.
Definition: convectiondiffusionparameter.hh:215
void setTime(double time_)
Definition: convectiondiffusionparameter.hh:227
traits class holding the function signature, same as in local function
Definition: function.hh:176
Dune::FieldVector< DomainFieldType, dimDomain-1 > IntersectionDomainType
domain type
Definition: convectiondiffusionparameter.hh:48
ConvectionDiffusion_Diffusion_Adapter(const K &k_, const A0 &a0_, const F &f_, const B &b_, const G &g_, const J &j_)
constructor
Definition: convectiondiffusionparameter.hh:291
GV GridViewType
The type of the grid view the function lives on.
Definition: function.hh:115
Definition: convectiondiffusionparameter.hh:198
ConvectionDiffusionBoundaryConditionAdapter(const typename T::Traits::GridViewType &gv_, const T &t_)
Definition: convectiondiffusionparameter.hh:172
Traits::RangeFieldType f(const typename Traits::ElementType &e, const typename Traits::DomainType &x) const
source term
Definition: convectiondiffusionparameter.hh:123
Definition: convectiondiffusionparameter.hh:68
Definition: convectiondiffusionparameter.hh:68
Class to define the boundary condition types.
Definition: convectiondiffusionparameter.hh:66
BCType bctype(const typename Traits::IntersectionType &is, const typename Traits::IntersectionDomainType &x) const
boundary condition type function
Definition: convectiondiffusionparameter.hh:130
const E & e
Definition: interpolate.hh:172
ConvectionDiffusionParameterTraits< GV, RF > Traits
Definition: convectiondiffusionparameter.hh:288
Dune::PDELab::GridFunctionTraits< typename T::Traits::GridViewType, typename T::Traits::RangeFieldType, 1, Dune::FieldVector< typename T::Traits::RangeFieldType, 1 > > Traits
Definition: convectiondiffusionparameter.hh:207
Type
Definition: convectiondiffusionparameter.hh:68
Traits::RangeFieldType o(const typename Traits::IntersectionType &is, const typename Traits::IntersectionDomainType &x) const
outflow boundary condition
Definition: convectiondiffusionparameter.hh:360
Traits::PermTensorType A(const typename Traits::ElementType &e, const typename Traits::DomainType &x) const
tensor diffusion coefficient
Definition: convectiondiffusionparameter.hh:97
const Traits::GridViewType & getGridView() const
Definition: convectiondiffusionparameter.hh:266
Definition: convectiondiffusionparameter.hh:68
Wrap intersection.
Definition: geometrywrapper.hh:56
void evaluate(const typename Traits::ElementType &e, const typename Traits::DomainType &x, typename Traits::RangeType &y) const
Evaluate the GridFunction at given position.
Definition: convectiondiffusionparameter.hh:259