[dune-pdelab] Finite Volume Method with slope reconstruction
Marian Piatkowski
marian.piatkowski at iwr.uni-heidelberg.de
Tue May 2 10:20:55 CEST 2017
Hi Gregor
On 04/28/2017 03:13 PM, Gregor Corbin wrote:
> Hello dear Dune developers,
>
> I have a dune-pdelab code that implements a first-order finite volume
> method for a hyperbolic system. Currently I am trying to implement a
> slope reconstruction to achieve second order accuracy in space.
> Therefore, before each stage of the time-stepping scheme, I need to
> iterate over the grid and compute the slopes on each cell.
> My current approach is to write a limiter class and give it to the
> explicit one step method like this:
>
> oneStepMethod.apply(t,dt,x_old,x_new,LinearReconstruction);
That's how it is exactly done in one of our Dune modules for the
lecture, dune-funcep.
Maybe you could have a look at the code in our Git repository
- https://parcomp-git.iwr.uni-heidelberg.de/Teaching/dune-funcep
especially the file
-
https://parcomp-git.iwr.uni-heidelberg.de/Teaching/dune-funcep/blob/master/src/common/limiter.hh
I think the second class in this file is just what you are looking for.
Regards,
Marian
>
> In the prestage method of this class, which gets only the solution
> vector, i iterate over all the cells on the grid. For each cell I want
> to extract the solution on that cell and on it's neighbors.
> But I have no idea how to do this.
>
> I appreciate any help on this problem. Is there maybe even a better
> way to implement slope limiting in pdelab?
>
> Cheers and thanks in advance,
> Gregor Corbin
>
> Below is a sketch for the code of the limiter class:
>
> template <typename GridView, typename GFS, int n_components>
> class LinearReconstruction
> {
> enum {dim = GridView::dimension};
> enum {n_comp = n_components};
>
> public:
> LinearReconstruction(const GridView &grid_view, const GFS &gfs):
> grid_view_(grid_view),
> gfs_(gfs),
> mapper_(grid_view_),
> slopes_(mapper_.size(),0.0)
> {}
>
> template<typename X>
> void prestage(X& x)
> {
> // reconstruct slopes
> for (const auto& cell : elements(grid_view_) )
> {
> // I would like to do something like in the local operator
> methods,
> // but how do I get the lfsu_s ???
> // is there a method to get it from the cell and the grid
> function space?
>
> // lfsu_s = gfs_.localFunctionSpace(cell); <- does something
> similar exist?
> Dune::FieldVector<double,n_comp> u_s(0.0);
> for (int k = 0; k < n_comp; ++k)
> u_s[k] = x(lfsu_s.child(k),0);
>
> // get the solutions from all the neighbors
> std::vector<Dune::FieldVector<double,n_comp> >
> u_n(pow(2,dim),0.0); // only valid for structured cubic grids
> int i = 0;
> for (const auto& is : intersections(grid_view_,cell))
> {
> const auto &neighbor = is.outside();
> // lfsu_n = gfs_.localFunctionSpace(neighbor); <- does
> something similar exist?
>
> for (int k = 0; k < n_comp; ++k)
> u_n.at(i)[k] = x(lfsu_n.child(k),0);
> ++i;
> }
>
> // use the info to reconstruct slopes
> slopes_.at(mapper_.index(cell)) = // some function(u_s, u_n)
> }
> }
>
> template<typename V>
> void poststage(V& v)
> {}
> private:
> const GridView &grid_view_;
> const GFS &gfs_;
> using Mapper =
> Dune::MultipleCodimMultipleGeomTypeMapper<GridView,Dune::MCMGElementLayout>;
>
> const Mapper mapper_;
> std::vector<Dune::FieldMatrix<double,n_comp,dim> > slopes_;
> };
>
>
>
>
>
> _______________________________________________
> dune-pdelab mailing list
> dune-pdelab at dune-project.org
> http://lists.dune-project.org/mailman/listinfo/dune-pdelab
More information about the dune-pdelab
mailing list