1#include <dune/common/version.hh>
2#include<dune/geometry/referenceelements.hh>
4template<
class G,
class M,
class V>
5void evolve(
const G& grid,
const M& mapper, V& c,
double t,
double& dt)
8 const int dim = G::dimension;
9 const int dimworld = G::dimensionworld;
12 typedef typename G::ctype ct;
15 typedef typename G::LeafGridView GridView;
18 typedef typename GridView::template Codim<0>::Iterator LeafIterator;
21 typedef typename GridView::IntersectionIterator IntersectionIterator;
25 GridView gridView = grid.leafGridView();
29 for (
typename V::size_type i=0; i<c.size(); i++) update[i] = 0;
35 LeafIterator endit = gridView.template end<0>();
36 for (LeafIterator it = gridView.template begin<0>(); it!=endit; ++it) {
38 Dune::GeometryType gt = it->type();
41 const Dune::FieldVector<ct,dim>&
42 local = Dune::ReferenceElements<ct,dim>::general(gt).position(0,0);
49 double volume = it->geometry().integrationElement(local)
50 *Dune::ReferenceElements<ct,dim>::general(gt).volume();
54 int indexi = mapper.index(*it);
57 double sumfactor = 0.0;
59 IntersectionIterator isend = gridView.iend(*it);
60 for (IntersectionIterator is = gridView.ibegin(*it); is!=isend; ++is) {
64 Dune::GeometryType gtf = is->type();
67 const Dune::FieldVector<ct,dim-1>&
68 facelocal = Dune::ReferenceElements<ct,dim-1>::general(gtf).position(0,0);
71 Dune::FieldVector<ct,dimworld> integrationOuterNormal
72 = is->integrationOuterNormal(facelocal);
73 integrationOuterNormal
74 *= Dune::ReferenceElements<ct,dim-1>::general(gtf).volume();
77 Dune::FieldVector<ct,dimworld>
78 faceglobal = is->geometry().center();
82 Dune::FieldVector<double,dim> velocity =
u(faceglobal,t);
85 double factor = velocity*integrationOuterNormal/
volume;
88 if (factor>=0) sumfactor += factor;
94 const auto& outside = is->outside();
95 int indexj = mapper.index(outside);
99 if (it->level()>outside.level() ||
100 (it->level()==outside.level() && indexi<indexj))
103 Dune::GeometryType nbgt = outside.type();
104 const Dune::FieldVector<ct,dim>&
105 nblocal = Dune::ReferenceElements<ct,dim>::general(nbgt).position(0,0);
106 double nbvolume = outside.geometry().integrationElement(nblocal)
107 *Dune::ReferenceElements<ct,dim>::general(nbgt).volume();
109 double nbfactor = velocity*integrationOuterNormal/nbvolume;
113 update[indexi] -= c[indexj]*factor;
114 update[indexj] += c[indexj]*nbfactor;
117 update[indexi] -= c[indexi]*factor;
118 update[indexj] += c[indexi]*nbfactor;
127 update[indexi] -=
b(faceglobal,t)*factor;
129 update[indexi] -= c[indexi]*factor;
133 dt = std::min(dt,1.0/sumfactor);
141 for (
unsigned int i=0; i<c.size(); ++i)
142 c[i] += dt*update[i];
void evolve(const G &grid, const M &mapper, V &c, double t, double &dt)
Definition: evolve.hh:5
T volume(const Point< T, 3 > *c)
Computes the volume of a 3D simplex (embedded i 3D space).
Definition: Volumes.hpp:137
double b(const Dune::FieldVector< ct, dimworld > &x, double t)
Definition: transportproblem2.hh:25
Dune::FieldVector< double, dimworld > u(const Dune::FieldVector< ct, dimworld > &, double)
Definition: transportproblem2.hh:36