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:138
 
double b(const Dune::FieldVector< ct, dimworld > &, double)
Definition: transportproblem2.hh:25
 
Dune::FieldVector< double, dimworld > u(const Dune::FieldVector< ct, dimworld > &, double)
Definition: transportproblem2.hh:36