dune-pdelab  2.4-dev
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/geometry/type.hh>
10 #include<dune/geometry/referenceelements.hh>
11 #include<dune/geometry/quadraturerules.hh>
16 
17 #include"diffusionparam.hh"
18 
19 namespace Dune {
20  namespace PDELab {
21 
28  template<typename GV, typename RF>
29  struct ConvectionDiffusionParameterTraits
30  {
32  typedef GV GridViewType;
33 
35  enum {
37  dimDomain = GV::dimension
38  };
39 
41  typedef typename GV::Grid::ctype DomainFieldType;
42 
44  typedef Dune::FieldVector<DomainFieldType,dimDomain> DomainType;
45 
47  typedef Dune::FieldVector<DomainFieldType,dimDomain-1> IntersectionDomainType;
48 
50  typedef RF RangeFieldType;
51 
53  typedef Dune::FieldVector<RF,GV::dimensionworld> RangeType;
54 
56  typedef Dune::FieldMatrix<RangeFieldType,dimDomain,dimDomain> PermTensorType;
57 
59  typedef typename GV::Traits::template Codim<0>::Entity ElementType;
60  typedef typename GV::Intersection IntersectionType;
61  };
62 
66  {
67  enum Type { Dirichlet=1, Neumann=-1, Outflow=-2, None=-3 }; // BC requiring constraints must be >0 if
68  // constraints assembler coming with PDELab is used
69  };
70 
86  template<typename GV, typename RF>
88  {
90 
91  public:
93 
95  typename Traits::PermTensorType
96  A (const typename Traits::ElementType& e, const typename Traits::DomainType& x) const
97  {
98  typename Traits::PermTensorType I;
99  for (std::size_t i=0; i<Traits::dimDomain; i++)
100  for (std::size_t j=0; j<Traits::dimDomain; j++)
101  I[i][j] = (i==j) ? 1 : 0;
102  return I;
103  }
104 
106  typename Traits::RangeType
107  b (const typename Traits::ElementType& e, const typename Traits::DomainType& x) const
108  {
109  typename Traits::RangeType v(0.0);
110  return v;
111  }
112 
114  typename Traits::RangeFieldType
115  c (const typename Traits::ElementType& e, const typename Traits::DomainType& x) const
116  {
117  return 0.0;
118  }
119 
121  typename Traits::RangeFieldType
122  f (const typename Traits::ElementType& e, const typename Traits::DomainType& x) const
123  {
124  return 0.0;
125  }
126 
128  BCType
129  bctype (const typename Traits::IntersectionType& is, const typename Traits::IntersectionDomainType& x) const
130  {
131  typename Traits::DomainType xglobal = is.geometry().global(x);
133  }
134 
136  typename Traits::RangeFieldType
137  g (const typename Traits::ElementType& e, const typename Traits::DomainType& x) const
138  {
139  typename Traits::DomainType xglobal = e.geometry().global(x);
140  return xglobal.two_norm();
141  }
142 
144  typename Traits::RangeFieldType
145  j (const typename Traits::IntersectionType& is, const typename Traits::IntersectionDomainType& x) const
146  {
147  return 0.0;
148  }
149 
151  typename Traits::RangeFieldType
152  o (const typename Traits::IntersectionType& is, const typename Traits::IntersectionDomainType& x) const
153  {
154  return 0.0;
155  }
156  };
157 
158 
163  template<typename T>
165  :
167  public Dune::PDELab::DirichletConstraintsParameters /*@\label{bcp:base}@*/
168  {
169  const T& t;
170 
171  public:
172 
173  ConvectionDiffusionBoundaryConditionAdapter(const typename T::Traits::GridViewType& gv_,
174  const T& t_ )
175  : t( t_ )
176  {}
177 
179  : t( t_ )
180  {}
181 
182  template<typename I>
183  bool isDirichlet(const I & ig /*@\label{bcp:name}@*/
184  , const Dune::FieldVector<typename I::ctype, I::dimension-1> & coord
185  ) const
186  {
187  return( t.bctype( ig.intersection(), coord )
189  }
190 
191  template<typename I>
192  bool isNeumann(const I & ig, /*@\label{bcp:name}@*/
193  const Dune::FieldVector<typename I::ctype, I::dimension-1> & coord
194  ) const
195  {
196  return !isDirichlet( ig, coord );
197  }
198 
199  };
200 
201 
202 
203 
204 
209  template<typename T>
211  : public Dune::PDELab::AnalyticGridFunctionBase<Dune::PDELab::AnalyticGridFunctionTraits
212  <typename T::Traits::GridViewType,
213  typename T::Traits::RangeFieldType,
214  T::Traits::GridViewType::dimension>,
215  ConvectionDiffusionVelocityExtensionAdapter<T> >
216  {
217  public:
218  typedef Dune::PDELab::AnalyticGridFunctionTraits<typename T::Traits::GridViewType,
219  typename T::Traits::RangeFieldType,
220  T::Traits::GridViewType::dimension> Traits;
222 
223 
226  : BaseT(gv_), gv(gv_), t(t_)
227  {}
228 
229  inline void evaluateGlobal (const typename Traits::DomainType& x,
230  typename Traits::RangeType& y) const
231  {
232  y = t.b(x);
233  }
234 
236  inline void evaluate (const typename Traits::ElementType& e,
237  const typename Traits::DomainType& x,
238  typename Traits::RangeType& y) const
239  {
240  y = t.b(e,x);
241  }
242 
243  inline const typename Traits::GridViewType& getGridView () const
244  {
245  return gv;
246  }
247 
248  inline void setTime(double time_)
249  {
250  t.setTime(time_);
251  }
252 
253  private:
254  const typename Traits::GridViewType gv;
255  T& t;
256  };
257 
258 
259 
260 
261 
266  template<typename T>
268  : public Dune::PDELab::GridFunctionBase<Dune::PDELab::GridFunctionTraits<typename T::Traits::GridViewType,
269  typename T::Traits::RangeFieldType,
270  1,Dune::FieldVector<typename T::Traits::RangeFieldType,1> >
271  ,ConvectionDiffusionDirichletExtensionAdapter<T> >
272  {
273  public:
274  typedef Dune::PDELab::GridFunctionTraits<typename T::Traits::GridViewType,
275  typename T::Traits::RangeFieldType,
276  1,Dune::FieldVector<typename T::Traits::RangeFieldType,1> > Traits;
277 
280  : g(g_), t(t_)
281  {}
282 
284  inline void evaluate (const typename Traits::ElementType& e,
285  const typename Traits::DomainType& x,
286  typename Traits::RangeType& y) const
287  {
288  y = t.g(e,x);
289  }
290 
291  inline const typename Traits::GridViewType& getGridView () const
292  {
293  return g;
294  }
295 
296  inline void setTime(double time_)
297  {
298  t.setTime(time_);
299  }
300 
301  private:
302  const typename Traits::GridViewType g;
303  T& t;
304  };
305 
306 
311 template<typename T>
313  : public Dune::PDELab::GridFunctionBase<Dune::PDELab::GridFunctionTraits<typename T::Traits::GridViewType,
314  typename T::Traits::RangeFieldType,
315  T::Traits::GridViewType::dimension,Dune::FieldVector<typename T::Traits::RangeFieldType,T::Traits::GridViewType::dimension> >
316  ,ConvectionDiffusionExactGradientAdapter<T> >
317 {
318 public:
319  typedef Dune::PDELab::GridFunctionTraits<typename T::Traits::GridViewType,
320  typename T::Traits::RangeFieldType,
321  T::Traits::GridViewType::dimension,Dune::FieldVector<typename T::Traits::RangeFieldType,T::Traits::GridViewType::dimension> > Traits;
322 
324  ConvectionDiffusionExactGradientAdapter (const typename Traits::GridViewType& g_, const T& t_) : g(g_), t(t_) {}
325 
327  inline void evaluate (const typename Traits::ElementType& e,
328  const typename Traits::DomainType& x,
329  typename Traits::RangeType& y) const
330  {
331  y = t.gradient(e,x);
332  }
333 
334  inline const typename Traits::GridViewType& getGridView () const
335  {
336  return g;
337  }
338 
339 private:
340  const typename Traits::GridViewType g;
341  const T& t;
342 };
343 
347  template<typename K, typename A0, typename F, typename B, typename G, typename J>
349  {
350  typedef typename F::Traits::RangeFieldType RF;
351  typedef typename F::Traits::GridViewType GV;
352 
354 
355  public:
357 
359  ConvectionDiffusion_Diffusion_Adapter (const K& k_, const A0& a0_, const F& f_, const B& b_, const G& g_, const J& j_) :
360  k__(k_), a0__(a0_), f__(f_), b__(b_), g__(g_), j__(j_)
361  {}
362 
364  typename Traits::PermTensorType
365  A (const typename Traits::ElementType& e, const typename Traits::DomainType& x) const
366  {
367  typename K::Traits::RangeType tensor(0.0);
368  k__.evaluate(e,x,tensor);
369  return tensor;
370  }
371 
373  typename Traits::RangeType
374  b (const typename Traits::ElementType& e, const typename Traits::DomainType& x) const
375  {
376  typename Traits::RangeType v(0.0);
377  return v;
378  }
379 
381  typename Traits::RangeFieldType
382  c (const typename Traits::ElementType& e, const typename Traits::DomainType& x) const
383  {
384  typename A0::Traits::RangeType y;
385  a0__.evaluate(e,x,y);
386  return y;
387  }
388 
390  typename Traits::RangeFieldType
391  f (const typename Traits::ElementType& e, const typename Traits::DomainType& x) const
392  {
393  typename F::Traits::RangeType y;
394  f__.evaluate(e,x,y);
395  return y;
396  }
397 
399  BCType
400  bctype (const typename Traits::IntersectionType& is, const typename Traits::IntersectionDomainType& x) const
401  {
402  typename B::Traits::RangeType bctype;
406  }
407 
409  typename Traits::RangeFieldType
410  g (const typename Traits::ElementType& e, const typename Traits::DomainType& x) const
411  {
412  typename G::Traits::RangeType y;
413  g__.evaluate(e,x,y);
414  return y;
415  }
416 
418  typename Traits::RangeFieldType
419  j (const typename Traits::IntersectionType& is, const typename Traits::IntersectionDomainType& x) const
420  {
421  typename J::Traits::RangeType y;
422  j__.evaluate(*(is.inside()),is.geometryInInside().global(x),y);
423  return y;
424  }
425 
427  typename Traits::RangeFieldType
428  o (const typename Traits::IntersectionType& is, const typename Traits::IntersectionDomainType& x) const
429  {
430  return 0.0;
431  }
432 
433  private:
434  const K& k__;
435  const A0& a0__;
436  const F& f__;
437  const B& b__;
438  const G& g__;
439  const J& j__;
440  };
441  }
442 }
443 
444 
445 #endif
Definition: convectiondiffusionparameter.hh:164
Traits::RangeFieldType c(const typename Traits::ElementType &e, const typename Traits::DomainType &x) const
sink term
Definition: convectiondiffusionparameter.hh:115
GV::Traits::template Codim< 0 >::Entity ElementType
grid types
Definition: convectiondiffusionparameter.hh:59
Dune::FieldVector< RF, GV::dimensionworld > RangeType
range type
Definition: convectiondiffusionparameter.hh:53
Traits::RangeFieldType j(const typename Traits::IntersectionType &is, const typename Traits::IntersectionDomainType &x) const
Neumann boundary condition.
Definition: convectiondiffusionparameter.hh:145
Definition: convectiondiffusionparameter.hh:210
GV GridViewType
the grid view
Definition: convectiondiffusionparameter.hh:32
Definition: constraintsparameters.hh:120
Traits::RangeFieldType j(const typename Traits::IntersectionType &is, const typename Traits::IntersectionDomainType &x) const
Neumann boundary condition.
Definition: convectiondiffusionparameter.hh:419
Traits::PermTensorType A(const typename Traits::ElementType &e, const typename Traits::DomainType &x) const
tensor diffusion coefficient
Definition: convectiondiffusionparameter.hh:365
GV::Intersection IntersectionType
Definition: convectiondiffusionparameter.hh:60
Definition: convectiondiffusionparameter.hh:267
ConvectionDiffusionParameterTraits< GV, RF > Traits
Definition: convectiondiffusionparameter.hh:92
ConvectionDiffusionDirichletExtensionAdapter(const typename Traits::GridViewType &g_, T &t_)
constructor
Definition: convectiondiffusionparameter.hh:279
void evaluateGlobal(const typename Traits::DomainType &x, typename Traits::RangeType &y) const
Definition: convectiondiffusionparameter.hh:229
Traits::RangeFieldType o(const typename Traits::IntersectionType &is, const typename Traits::IntersectionDomainType &x) const
outflow boundary condition
Definition: convectiondiffusionparameter.hh:152
Traits::RangeType b(const typename Traits::ElementType &e, const typename Traits::DomainType &x) const
velocity field
Definition: convectiondiffusionparameter.hh:374
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:284
dimension of the domain
Definition: convectiondiffusion.hh:48
const Traits::GridViewType & getGridView() const
Definition: convectiondiffusionparameter.hh:243
void setTime(double time_)
Definition: convectiondiffusionparameter.hh:296
RF RangeFieldType
Export type for range field.
Definition: convectiondiffusionparameter.hh:50
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:321
Class to define the boundary condition types.
Definition: convectiondiffusionparameter.hh:65
Dune::PDELab::GridFunctionTraits< typename T::Traits::GridViewType, typename T::Traits::RangeFieldType, 1, Dune::FieldVector< typename T::Traits::RangeFieldType, 1 > > Traits
Definition: convectiondiffusionparameter.hh:276
const E & e
Definition: interpolate.hh:172
Adapter to get ConvectionDiffusion parameter object from the old style separate parameter grid functi...
Definition: convectiondiffusionparameter.hh:348
Traits::RangeFieldType o(const typename Traits::IntersectionType &is, const typename Traits::IntersectionDomainType &x) const
outflow boundary condition
Definition: convectiondiffusionparameter.hh:428
Dune::FieldMatrix< RangeFieldType, dimDomain, dimDomain > PermTensorType
permeability tensor type
Definition: convectiondiffusionparameter.hh:56
Definition: convectiondiffusionparameter.hh:67
Dune::FieldVector< DomainFieldType, dimDomain-1 > IntersectionDomainType
domain type
Definition: convectiondiffusionparameter.hh:47
GV GridViewType
The type of the grid view the function lives on.
Definition: function.hh:114
ConvectionDiffusionVelocityExtensionAdapter(const typename Traits::GridViewType &gv_, T &t_)
constructor
Definition: convectiondiffusionparameter.hh:225
BCType bctype(const typename Traits::IntersectionType &is, const typename Traits::IntersectionDomainType &x) const
boundary condition type function
Definition: convectiondiffusionparameter.hh:129
ConvectionDiffusionBoundaryConditionAdapter(const T &t_)
Definition: convectiondiffusionparameter.hh:178
const IG & ig
Definition: constraints.hh:147
Traits::RangeFieldType f(const typename Traits::ElementType &e, const typename Traits::DomainType &x) const
source term
Definition: convectiondiffusionparameter.hh:391
Definition: constraintsparameters.hh:24
Type
Definition: convectiondiffusionparameter.hh:67
GV::Grid::ctype DomainFieldType
Export type for domain field.
Definition: convectiondiffusionparameter.hh:41
leaf of a function tree
Definition: function.hh:576
Dune::PDELab::AnalyticGridFunctionBase< Traits, ConvectionDiffusionVelocityExtensionAdapter< T > > BaseT
Definition: convectiondiffusionparameter.hh:221
Definition: convectiondiffusionparameter.hh:67
function signature for analytic functions on a grid
Definition: function.hh:898
Definition: convectiondiffusionparameter.hh:67
const Traits::GridViewType & getGridView() const
Definition: convectiondiffusionparameter.hh:291
Dune::FieldVector< GV::Grid::ctype, GV::dimension > DomainType
domain type in dim-size coordinates
Definition: function.hh:48
Traits::RangeFieldType g(const typename Traits::ElementType &e, const typename Traits::DomainType &x) const
Dirichlet boundary condition value.
Definition: convectiondiffusionparameter.hh:137
Definition: convectiondiffusionparameter.hh:67
Traits::RangeFieldType g(const typename Traits::ElementType &e, const typename Traits::DomainType &x) const
Dirichlet boundary condition value.
Definition: convectiondiffusionparameter.hh:410
static bool isDirichlet(Type i)
Test for Dirichlet boundary condition.
Definition: diffusionparam.hh:25
traits class holding the function signature, same as in local function
Definition: function.hh:175
Parameter class for solving the linear convection-diffusion equation.
Definition: convectiondiffusionparameter.hh:87
Traits::PermTensorType A(const typename Traits::ElementType &e, const typename Traits::DomainType &x) const
tensor diffusion coefficient
Definition: convectiondiffusionparameter.hh:96
Definition: adaptivity.hh:27
Traits::RangeFieldType c(const typename Traits::ElementType &e, const typename Traits::DomainType &x) const
sink term
Definition: convectiondiffusionparameter.hh:382
Traits::RangeFieldType f(const typename Traits::ElementType &e, const typename Traits::DomainType &x) const
source term
Definition: convectiondiffusionparameter.hh:122
an analytic grid function
Definition: function.hh:916
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:236
void setTime(double time_)
Definition: convectiondiffusionparameter.hh:248
GV::Traits::template Codim< 0 >::Entity ElementType
codim 0 entity
Definition: function.hh:117
const Traits::GridViewType & getGridView() const
Definition: convectiondiffusionparameter.hh:334
ConvectionDiffusionParameterTraits< GV, RF > Traits
Definition: convectiondiffusionparameter.hh:356
Definition: convectiondiffusionparameter.hh:312
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:327
BCType bctype(const typename Traits::IntersectionType &is, const typename Traits::IntersectionDomainType &x) const
boundary condition type function
Definition: convectiondiffusionparameter.hh:400
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:359
Traits::RangeType b(const typename Traits::ElementType &e, const typename Traits::DomainType &x) const
velocity field
Definition: convectiondiffusionparameter.hh:107
ConvectionDiffusionBoundaryConditionAdapter(const typename T::Traits::GridViewType &gv_, const T &t_)
Definition: convectiondiffusionparameter.hh:173
bool isDirichlet(const I &ig, const Dune::FieldVector< typename I::ctype, I::dimension-1 > &coord) const
Definition: convectiondiffusionparameter.hh:183
Dune::FieldVector< DomainFieldType, dimDomain > DomainType
domain type
Definition: convectiondiffusionparameter.hh:44
Dune::PDELab::AnalyticGridFunctionTraits< typename T::Traits::GridViewType, typename T::Traits::RangeFieldType, T::Traits::GridViewType::dimension > Traits
Definition: convectiondiffusionparameter.hh:220
bool isNeumann(const I &ig, const Dune::FieldVector< typename I::ctype, I::dimension-1 > &coord) const
Definition: convectiondiffusionparameter.hh:192
ConvectionDiffusionExactGradientAdapter(const typename Traits::GridViewType &g_, const T &t_)
constructor
Definition: convectiondiffusionparameter.hh:324
traits class for two phase parameter class
Definition: convectiondiffusion.hh:40