dune-pdelab  2.7-git
convectiondiffusionparameter.hh
Go to the documentation of this file.
1 // -*- tab-width: 4; indent-tabs-mode: nil -*-
2 #ifndef DUNE_PDELAB_LOCALOPERATOR_CONVECTIONDIFFUSIONPARAMETER_HH
3 #define DUNE_PDELAB_LOCALOPERATOR_CONVECTIONDIFFUSIONPARAMETER_HH
4 
5 #include<vector>
6 #include<type_traits>
7 
8 #include<dune/common/deprecated.hh>
9 #include<dune/common/exceptions.hh>
10 #include<dune/common/fvector.hh>
11 #include<dune/geometry/type.hh>
12 #include<dune/geometry/referenceelements.hh>
13 #include<dune/geometry/quadraturerules.hh>
18 
19 namespace Dune {
20  namespace PDELab {
21 
22  #ifndef DOXYGEN
23 
24  // helper construct for backwards-compatible addition of hasPermeabilityIsConstantPerCell()
25 
26  namespace Impl {
27 
28  template<typename T, typename = void>
29  struct hasPermeabilityIsConstantPerCell
30  : public std::false_type
31  {};
32 
33  template<typename T>
34  struct hasPermeabilityIsConstantPerCell<
35  T,
36  void_t<decltype(std::declval<T>().permeabilityIsConstantPerCell())>
37  >
38  : public std::true_type
39  {};
40 
41  template<typename T>
42  DUNE_DEPRECATED_MSG("Starting from PDELab 2.6, parameter classes must have a method `bool permeabilityIsConstantPerCell()`. For now, we assume a default value of true.")
43  constexpr
44  std::enable_if_t<
45  not hasPermeabilityIsConstantPerCell<T>::value,
46  bool
47  >
48  permeabilityIsConstantPerCell(const T& param)
49  {
50  return true;
51  }
52 
53  template<typename T>
54  constexpr
55  std::enable_if_t<
57  bool
58  >
59  permeabilityIsConstantPerCell(const T& param)
60  {
61  return param.permeabilityIsConstantPerCell();
62  }
63 
64  } // namespace Impl
65 
66  #endif // DOXYGEN
67 
74  template<typename GV, typename RF>
76  {
78  typedef GV GridViewType;
79 
81  enum {
83  dimDomain = GV::dimension
84  };
85 
87  typedef typename GV::Grid::ctype DomainFieldType;
88 
90  typedef Dune::FieldVector<DomainFieldType,dimDomain> DomainType;
91 
93  typedef Dune::FieldVector<DomainFieldType,dimDomain-1> IntersectionDomainType;
94 
96  typedef RF RangeFieldType;
97 
99  typedef Dune::FieldVector<RF,GV::dimensionworld> RangeType;
100 
102  typedef Dune::FieldMatrix<RangeFieldType,dimDomain,dimDomain> PermTensorType;
103 
105  typedef typename GV::Traits::template Codim<0>::Entity ElementType;
106  typedef typename GV::Intersection IntersectionType;
107  };
108 
112  {
113  enum Type { Dirichlet=1, Neumann=-1, Outflow=-2, None=-3 }; // BC requiring constraints must be >0 if
114  // constraints assembler coming with PDELab is used
115  };
116 
134  template<typename GV, typename RF>
136  {
138 
139  public:
141 
143  static constexpr bool permeabilityIsConstantPerCell()
144  {
145  return true;
146  }
147 
149  typename Traits::PermTensorType
150  A (const typename Traits::ElementType& e, const typename Traits::DomainType& x) const
151  {
152  typename Traits::PermTensorType I;
153  for (std::size_t i=0; i<Traits::dimDomain; i++)
154  for (std::size_t j=0; j<Traits::dimDomain; j++)
155  I[i][j] = (i==j) ? 1 : 0;
156  return I;
157  }
158 
160  typename Traits::RangeType
161  b (const typename Traits::ElementType& e, const typename Traits::DomainType& x) const
162  {
163  typename Traits::RangeType v(0.0);
164  return v;
165  }
166 
168  typename Traits::RangeFieldType
169  c (const typename Traits::ElementType& e, const typename Traits::DomainType& x) const
170  {
171  return 0.0;
172  }
173 
175  typename Traits::RangeFieldType
176  f (const typename Traits::ElementType& e, const typename Traits::DomainType& x) const
177  {
178  return 0.0;
179  }
180 
182  BCType
183  bctype (const typename Traits::IntersectionType& is, const typename Traits::IntersectionDomainType& x) const
184  {
186  }
187 
189  typename Traits::RangeFieldType
190  g (const typename Traits::ElementType& e, const typename Traits::DomainType& x) const
191  {
192  typename Traits::DomainType xglobal = e.geometry().global(x);
193  return xglobal.two_norm();
194  }
195 
197  typename Traits::RangeFieldType
198  j (const typename Traits::IntersectionType& is, const typename Traits::IntersectionDomainType& x) const
199  {
200  return 0.0;
201  }
202 
204  typename Traits::RangeFieldType
205  o (const typename Traits::IntersectionType& is, const typename Traits::IntersectionDomainType& x) const
206  {
207  return 0.0;
208  }
209  };
210 
211 
216  template<typename T>
218  :
220  public Dune::PDELab::DirichletConstraintsParameters /*@\label{bcp:base}@*/
221  {
222  const T& t;
223 
224  public:
225 
226  ConvectionDiffusionBoundaryConditionAdapter(const typename T::Traits::GridViewType& gv_,
227  const T& t_ )
228  : t( t_ )
229  {}
230 
232  : t( t_ )
233  {}
234 
235  template<typename I>
236  bool isDirichlet(const I & ig /*@\label{bcp:name}@*/
237  , const Dune::FieldVector<typename I::ctype, I::mydimension> & coord
238  ) const
239  {
240  return( t.bctype( ig.intersection(), coord )
242  }
243 
244  template<typename I>
245  bool isNeumann(const I & ig, /*@\label{bcp:name}@*/
246  const Dune::FieldVector<typename I::ctype, I::mydimension> & coord
247  ) const
248  {
249  return !isDirichlet( ig, coord );
250  }
251 
252  };
253 
254 
255 
256 
257 
262  template<typename T>
264  : public Dune::PDELab::AnalyticGridFunctionBase<Dune::PDELab::AnalyticGridFunctionTraits
265  <typename T::Traits::GridViewType,
266  typename T::Traits::RangeFieldType,
267  T::Traits::GridViewType::dimension>,
268  ConvectionDiffusionVelocityExtensionAdapter<T> >
269  {
270  public:
271  typedef Dune::PDELab::AnalyticGridFunctionTraits<typename T::Traits::GridViewType,
272  typename T::Traits::RangeFieldType,
273  T::Traits::GridViewType::dimension> Traits;
275 
276 
279  : BaseT(gv_), gv(gv_), t(t_)
280  {}
281 
282  inline void evaluateGlobal (const typename Traits::DomainType& x,
283  typename Traits::RangeType& y) const
284  {
285  y = t.b(x);
286  }
287 
289  inline void evaluate (const typename Traits::ElementType& e,
290  const typename Traits::DomainType& x,
291  typename Traits::RangeType& y) const
292  {
293  y = t.b(e,x);
294  }
295 
296  inline const typename Traits::GridViewType& getGridView () const
297  {
298  return gv;
299  }
300 
301  inline void setTime(double time_)
302  {
303  t.setTime(time_);
304  }
305 
306  private:
307  const typename Traits::GridViewType gv;
308  T& t;
309  };
310 
311 
312 
313 
314 
319  template<typename T>
321  : public Dune::PDELab::GridFunctionBase<Dune::PDELab::GridFunctionTraits<typename T::Traits::GridViewType,
322  typename T::Traits::RangeFieldType,
323  1,Dune::FieldVector<typename T::Traits::RangeFieldType,1> >
324  ,ConvectionDiffusionDirichletExtensionAdapter<T> >
325  {
326  public:
327  typedef Dune::PDELab::GridFunctionTraits<typename T::Traits::GridViewType,
328  typename T::Traits::RangeFieldType,
329  1,Dune::FieldVector<typename T::Traits::RangeFieldType,1> > Traits;
330 
333  : g(g_), t(t_)
334  {}
335 
337  inline void evaluate (const typename Traits::ElementType& e,
338  const typename Traits::DomainType& x,
339  typename Traits::RangeType& y) const
340  {
341  y = t.g(e,x);
342  }
343 
344  inline const typename Traits::GridViewType& getGridView () const
345  {
346  return g;
347  }
348 
349  inline void setTime(double time_)
350  {
351  t.setTime(time_);
352  }
353 
354  private:
355  const typename Traits::GridViewType g;
356  T& t;
357  };
358 
359 
364 template<typename T>
366  : public Dune::PDELab::GridFunctionBase<Dune::PDELab::GridFunctionTraits<typename T::Traits::GridViewType,
367  typename T::Traits::RangeFieldType,
368  T::Traits::GridViewType::dimension,Dune::FieldVector<typename T::Traits::RangeFieldType,T::Traits::GridViewType::dimension> >
369  ,ConvectionDiffusionExactGradientAdapter<T> >
370 {
371 public:
372  typedef Dune::PDELab::GridFunctionTraits<typename T::Traits::GridViewType,
373  typename T::Traits::RangeFieldType,
374  T::Traits::GridViewType::dimension,Dune::FieldVector<typename T::Traits::RangeFieldType,T::Traits::GridViewType::dimension> > Traits;
375 
377  ConvectionDiffusionExactGradientAdapter (const typename Traits::GridViewType& g_, const T& t_) : g(g_), t(t_) {}
378 
380  inline void evaluate (const typename Traits::ElementType& e,
381  const typename Traits::DomainType& x,
382  typename Traits::RangeType& y) const
383  {
384  y = t.gradient(e,x);
385  }
386 
387  inline const typename Traits::GridViewType& getGridView () const
388  {
389  return g;
390  }
391 
392 private:
393  const typename Traits::GridViewType g;
394  const T& t;
395 };
396  }
397 }
398 
399 
400 #endif // DUNE_PDELAB_LOCALOPERATOR_CONVECTIONDIFFUSIONPARAMETER_HH
Dune::PDELab::ConvectionDiffusionExactGradientAdapter
Definition: convectiondiffusionparameter.hh:365
Dune::PDELab::ConvectionDiffusionExactGradientAdapter::Traits
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:374
function.hh
Dune::PDELab::ConvectionDiffusionBoundaryConditionAdapter
Definition: convectiondiffusionparameter.hh:217
Dune::PDELab::ConvectionDiffusionModelProblem::f
Traits::RangeFieldType f(const typename Traits::ElementType &e, const typename Traits::DomainType &x) const
source term
Definition: convectiondiffusionparameter.hh:176
Dune::PDELab::ConvectionDiffusionVelocityExtensionAdapter::setTime
void setTime(double time_)
Definition: convectiondiffusionparameter.hh:301
Dune::PDELab::ConvectionDiffusionDirichletExtensionAdapter::evaluate
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:337
constraintsparameters.hh
Dune::PDELab::ConvectionDiffusionBoundaryConditions
Class to define the boundary condition types.
Definition: convectiondiffusionparameter.hh:111
Dune::PDELab::ConvectionDiffusionDirichletExtensionAdapter
Definition: convectiondiffusionparameter.hh:320
Dune::PDELab::GridFunctionBase
leaf of a function tree
Definition: function.hh:299
Dune::PDELab::AnalyticGridFunctionBase
an analytic grid function
Definition: function.hh:658
Dune::PDELab::PowerCompositeGridFunctionTraits::GridViewType
GV GridViewType
The type of the grid view the function lives on.
Definition: function.hh:116
Dune::PDELab::ConvectionDiffusionVelocityExtensionAdapter::evaluate
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:289
Dune::PDELab::ConvectionDiffusionBoundaryConditions::Type
Type
Definition: convectiondiffusionparameter.hh:113
Dune::PDELab::ConvectionDiffusionBoundaryConditions::Dirichlet
@ Dirichlet
Definition: convectiondiffusionparameter.hh:113
Dune::PDELab::PowerCompositeGridFunctionTraits::ElementType
GV::Traits::template Codim< 0 >::Entity ElementType
codim 0 entity
Definition: function.hh:119
Dune::PDELab::ConvectionDiffusionParameterTraits
Traits class for convection diffusion parameters.
Definition: convectiondiffusionparameter.hh:75
Dune::PDELab::GridFunctionTraits
traits class holding the function signature, same as in local function
Definition: function.hh:177
Dune
For backward compatibility – Do not use this!
Definition: adaptivity.hh:28
Dune::PDELab::ConvectionDiffusionParameterTraits::RangeType
Dune::FieldVector< RF, GV::dimensionworld > RangeType
range type
Definition: convectiondiffusionparameter.hh:99
Dune::PDELab::ConvectionDiffusionParameterTraits::PermTensorType
Dune::FieldMatrix< RangeFieldType, dimDomain, dimDomain > PermTensorType
permeability tensor type
Definition: convectiondiffusionparameter.hh:102
Dune::PDELab::AnalyticGridFunctionTraits
function signature for analytic functions on a grid
Definition: function.hh:640
Dune::PDELab::ConvectionDiffusionBoundaryConditionAdapter::ConvectionDiffusionBoundaryConditionAdapter
ConvectionDiffusionBoundaryConditionAdapter(const typename T::Traits::GridViewType &gv_, const T &t_)
Definition: convectiondiffusionparameter.hh:226
Dune::PDELab::ConvectionDiffusionParameterTraits::DomainType
Dune::FieldVector< DomainFieldType, dimDomain > DomainType
domain type
Definition: convectiondiffusionparameter.hh:90
e
const Entity & e
Definition: localfunctionspace.hh:121
Dune::PDELab::ConvectionDiffusionParameterTraits::RangeFieldType
RF RangeFieldType
Export type for range field.
Definition: convectiondiffusionparameter.hh:96
Dune::PDELab::ConvectionDiffusionModelProblem::A
Traits::PermTensorType A(const typename Traits::ElementType &e, const typename Traits::DomainType &x) const
tensor diffusion coefficient
Definition: convectiondiffusionparameter.hh:150
value
static const unsigned int value
Definition: gridfunctionspace/tags.hh:139
Dune::PDELab::ConvectionDiffusionExactGradientAdapter::getGridView
const Traits::GridViewType & getGridView() const
Definition: convectiondiffusionparameter.hh:387
Dune::PDELab::ConvectionDiffusionDirichletExtensionAdapter::getGridView
const Traits::GridViewType & getGridView() const
Definition: convectiondiffusionparameter.hh:344
Dune::PDELab::ConvectionDiffusionVelocityExtensionAdapter::Traits
Dune::PDELab::AnalyticGridFunctionTraits< typename T::Traits::GridViewType, typename T::Traits::RangeFieldType, T::Traits::GridViewType::dimension > Traits
Definition: convectiondiffusionparameter.hh:273
Dune::PDELab::ConvectionDiffusionExactGradientAdapter::evaluate
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:380
Dune::PDELab::ConvectionDiffusionParameterTraits::IntersectionType
GV::Intersection IntersectionType
Definition: convectiondiffusionparameter.hh:106
Dune::PDELab::ConvectionDiffusionModelProblem::b
Traits::RangeType b(const typename Traits::ElementType &e, const typename Traits::DomainType &x) const
velocity field
Definition: convectiondiffusionparameter.hh:161
Dune::PDELab::ConvectionDiffusionModelProblem::Traits
ConvectionDiffusionParameterTraits< GV, RF > Traits
Definition: convectiondiffusionparameter.hh:140
Dune::PDELab::ConvectionDiffusionParameterTraits::dimDomain
@ dimDomain
dimension of the domain
Definition: convectiondiffusionparameter.hh:83
Dune::PDELab::ConvectionDiffusionVelocityExtensionAdapter::BaseT
Dune::PDELab::AnalyticGridFunctionBase< Traits, ConvectionDiffusionVelocityExtensionAdapter< T > > BaseT
Definition: convectiondiffusionparameter.hh:274
Dune::PDELab::ConvectionDiffusionModelProblem::c
Traits::RangeFieldType c(const typename Traits::ElementType &e, const typename Traits::DomainType &x) const
sink term
Definition: convectiondiffusionparameter.hh:169
Dune::PDELab::FunctionTraits< GV::Grid::ctype, GV::dimension, Dune::FieldVector< GV::Grid::ctype, GV::dimension >, RF, m, Dune::FieldVector< RF, m > >::RangeType
Dune::FieldVector< RF, m > RangeType
range type
Definition: function.hh:62
geometrywrapper.hh
Dune::PDELab::ConvectionDiffusionDirichletExtensionAdapter::ConvectionDiffusionDirichletExtensionAdapter
ConvectionDiffusionDirichletExtensionAdapter(const typename Traits::GridViewType &g_, T &t_)
constructor
Definition: convectiondiffusionparameter.hh:332
Dune::PDELab::ConvectionDiffusionModelProblem
Parameter class for solving the linear convection-diffusion equation.
Definition: convectiondiffusionparameter.hh:135
Dune::PDELab::ConvectionDiffusionModelProblem::g
Traits::RangeFieldType g(const typename Traits::ElementType &e, const typename Traits::DomainType &x) const
Dirichlet boundary condition value.
Definition: convectiondiffusionparameter.hh:190
Dune::PDELab::ConvectionDiffusionVelocityExtensionAdapter::evaluateGlobal
void evaluateGlobal(const typename Traits::DomainType &x, typename Traits::RangeType &y) const
Definition: convectiondiffusionparameter.hh:282
Dune::PDELab::ConvectionDiffusionBoundaryConditions::Neumann
@ Neumann
Definition: convectiondiffusionparameter.hh:113
Dune::PDELab::ConvectionDiffusionVelocityExtensionAdapter::getGridView
const Traits::GridViewType & getGridView() const
Definition: convectiondiffusionparameter.hh:296
Dune::PDELab::ConvectionDiffusionVelocityExtensionAdapter::ConvectionDiffusionVelocityExtensionAdapter
ConvectionDiffusionVelocityExtensionAdapter(const typename Traits::GridViewType &gv_, T &t_)
constructor
Definition: convectiondiffusionparameter.hh:278
Dune::PDELab::ConvectionDiffusionParameterTraits::DomainFieldType
GV::Grid::ctype DomainFieldType
Export type for domain field.
Definition: convectiondiffusionparameter.hh:87
functionutilities.hh
Dune::PDELab::DirichletConstraintsParameters
Definition: constraintsparameters.hh:24
Dune::PDELab::ConvectionDiffusionModelProblem::bctype
BCType bctype(const typename Traits::IntersectionType &is, const typename Traits::IntersectionDomainType &x) const
boundary condition type function
Definition: convectiondiffusionparameter.hh:183
Dune::PDELab::ConvectionDiffusionBoundaryConditions::Outflow
@ Outflow
Definition: convectiondiffusionparameter.hh:113
Dune::PDELab::ConvectionDiffusionExactGradientAdapter::ConvectionDiffusionExactGradientAdapter
ConvectionDiffusionExactGradientAdapter(const typename Traits::GridViewType &g_, const T &t_)
constructor
Definition: convectiondiffusionparameter.hh:377
Dune::PDELab::ConvectionDiffusionBoundaryConditionAdapter::isNeumann
bool isNeumann(const I &ig, const Dune::FieldVector< typename I::ctype, I::mydimension > &coord) const
Definition: convectiondiffusionparameter.hh:245
Dune::PDELab::ConvectionDiffusionModelProblem::j
Traits::RangeFieldType j(const typename Traits::IntersectionType &is, const typename Traits::IntersectionDomainType &x) const
Neumann boundary condition.
Definition: convectiondiffusionparameter.hh:198
Dune::PDELab::ConvectionDiffusionVelocityExtensionAdapter
Definition: convectiondiffusionparameter.hh:263
Dune::PDELab::FluxConstraintsParameters
Definition: constraintsparameters.hh:120
Dune::PDELab::FunctionTraits< GV::Grid::ctype, GV::dimension, Dune::FieldVector< GV::Grid::ctype, GV::dimension >, RF, m, Dune::FieldVector< RF, m > >::DomainType
Dune::FieldVector< GV::Grid::ctype, GV::dimension > DomainType
domain type in dim-size coordinates
Definition: function.hh:50
Dune::PDELab::ConvectionDiffusionParameterTraits::IntersectionDomainType
Dune::FieldVector< DomainFieldType, dimDomain-1 > IntersectionDomainType
domain type
Definition: convectiondiffusionparameter.hh:93
Dune::PDELab::ConvectionDiffusionModelProblem::o
Traits::RangeFieldType o(const typename Traits::IntersectionType &is, const typename Traits::IntersectionDomainType &x) const
outflow boundary condition
Definition: convectiondiffusionparameter.hh:205
Dune::PDELab::ConvectionDiffusionBoundaryConditionAdapter::ConvectionDiffusionBoundaryConditionAdapter
ConvectionDiffusionBoundaryConditionAdapter(const T &t_)
Definition: convectiondiffusionparameter.hh:231
Dune::PDELab::ConvectionDiffusionBoundaryConditionAdapter::isDirichlet
bool isDirichlet(const I &ig, const Dune::FieldVector< typename I::ctype, I::mydimension > &coord) const
Definition: convectiondiffusionparameter.hh:236
ig
const IG & ig
Definition: constraints.hh:149
Dune::PDELab::ConvectionDiffusionDirichletExtensionAdapter::Traits
Dune::PDELab::GridFunctionTraits< typename T::Traits::GridViewType, typename T::Traits::RangeFieldType, 1, Dune::FieldVector< typename T::Traits::RangeFieldType, 1 > > Traits
Definition: convectiondiffusionparameter.hh:329
Dune::PDELab::ConvectionDiffusionParameterTraits::ElementType
GV::Traits::template Codim< 0 >::Entity ElementType
grid types
Definition: convectiondiffusionparameter.hh:105
Dune::PDELab::ConvectionDiffusionBoundaryConditions::None
@ None
Definition: convectiondiffusionparameter.hh:113
Dune::PDELab::ConvectionDiffusionParameterTraits::GridViewType
GV GridViewType
the grid view
Definition: convectiondiffusionparameter.hh:78
Dune::PDELab::ConvectionDiffusionDirichletExtensionAdapter::setTime
void setTime(double time_)
Definition: convectiondiffusionparameter.hh:349
Dune::PDELab::ConvectionDiffusionModelProblem::permeabilityIsConstantPerCell
static constexpr bool permeabilityIsConstantPerCell()
tensor diffusion constant per cell? return false if you want more than one evaluation of A per cell.
Definition: convectiondiffusionparameter.hh:143