Dune Core Modules (2.9.0)

Modules

 Refinement implementation for hypercubes
 
 Refinement implementation for triangulating hypercubes
 
 Refinement implementation for simplices
 
 Virtual Refinement
 

Classes

class  Dune::RefinementIntervals
 Holds the number of refined intervals per axis needed for virtual and static refinement. More...
 
class  Dune::StaticRefinement< topologyId, CoordType, coerceToId, dimension_ >
 Wrap each Refinement implementation to get a consistent interface. More...
 

Functions

RefinementIntervals Dune::refinementIntervals (int intervals)
 Creates a RefinementIntervals object. More...
 
RefinementIntervals Dune::refinementLevels (int levels)
 Creates a RefinementIntervals object. More...
 

Detailed Description

General

The Refinement system allows to temporarily refine a grid or single entities without changing the grid itself. You may want to do this because you want to write your data to a file and have to do subsampling, but want to continue the calculation with the unmodified grid afterwards.

What Refinement can do for you

template<unsigned topologyId, class CoordType,
unsigned coerceToId, int dimension_>
class StaticRefinement
{
public:
constexpr static int dimension = dimension_;
template<int codimension>
struct codim
{
class SubEntityIterator;
};
typedef ImplementationDefined VertexIterator; // These are aliases for codim<codim>::SubEntityIterator
typedef ImplementationDefined ElementIterator;
typedef ImplementationDefined IndexVector; // These are FieldVectors
typedef ImplementationDefined CoordVector;
static int nVertices(Dune::RefinementIntervals intervals);
static int nElements(Dune::RefinementIntervals intervals);
}
Holds the number of refined intervals per axis needed for virtual and static refinement.
Definition: base.cc:94
static ElementIterator eEnd(Dune::RefinementIntervals tag)
Get an ElementIterator.
Definition: base.cc:247
static ElementIterator eBegin(Dune::RefinementIntervals tag)
Get an ElementIterator.
Definition: base.cc:237
static int nElements(Dune::RefinementIntervals tag)
Get the number of Elements.
Definition: base.cc:227
Codim< 0 >::SubEntityIterator ElementIterator
The ElementIterator of the Refinement.
Definition: base.cc:163
static int nVertices(Dune::RefinementIntervals tag)
Get the number of Vertices.
Definition: base.cc:197
static VertexIterator vBegin(Dune::RefinementIntervals tag)
Get a VertexIterator.
Definition: base.cc:207
Codim< dimension >::SubEntityIterator VertexIterator
The VertexIterator of the Refinement.
Definition: base.cc:161
typedef CoordVector
The CoordVector of the Refinement.
Definition: base.cc:170
typedef IndexVector
The IndexVector of the Refinement.
Definition: base.cc:177
static VertexIterator vEnd(Dune::RefinementIntervals tag)
Get a VertexIterator.
Definition: base.cc:217

The Iterators can do all the usual things that Iterators can do, except dereferencing. In addition, to do something useful, they support some additional methods:

template<unsigned topologyId, class CoordType, unsigned coerceToId, int dimension>
class VertexIterator
{
public:
typedef ImplementationDefined Refinement;
int index() const;
Refinement::CoordVector coords() const;
}
template<unsigned topologyId, class CoordType, unsigned coerceToId, int dimension>
class ElementIterator
{
public:
typedef ImplementationDefined Refinement;
int index() const;
// Coords of the center of mass of the element
Refinement::CoordVector coords() const;
Refinement::IndexVector vertexIndices() const;
}

How to use it

If you want to write a Refinement implementation for a particular geometry type, e.g. SquaringTheCircle (or a particular set of geometry types) here is how:

  • create a file refinement/squaringthecircle.cc and #include "base.cc". Your file will be included by others, so don't forget to protect against double inclusion.
  • implement a class (or template class) RefinementImp conforming exactly to the user interface above.
  • put it (and it's helper stuff as appropriate) into it's own namespace Dune::RefinementImp::SquaringTheCircle.
  • define the mapping of topologyId, CoordType and coerceToId to your implementation by specialising template struct RefinementImp::Traits. It should look like this:
    // we're only implementing this for dim=2
    template<class CoordType>
    struct Traits<sphereTopologyId, CoordType,
    GeometryTypes::cube(2), 2>
    {
    typedef SquaringTheCircle::RefinementImp<CoordType> Imp;
    };
    }
    This namespace contains the implementation of Refinement.
    Definition: base.cc:29
    @ cube
    use only cube elements (i.e., quadrilaterals or hexahedra)
    Definition: declaration.hh:19
    If you implement a template class, you have to specialise struct RefinementImp::Traits for every possible combination of topologyId and coerceToId that your implementation supports.
  • #include "refinement/squaringthecircle.cc" from refinement.hh.

This is enough to integrate your implementation into the Refinement system. You probably want to include it into VirtualRefinement also.

Namespaces

Function Documentation

◆ refinementIntervals()

RefinementIntervals Dune::refinementIntervals ( int  intervals)
inline

Creates a RefinementIntervals object.

Parameters
intervalsNumber of refined intervals per axis

◆ refinementLevels()

RefinementIntervals Dune::refinementLevels ( int  levels)
inline

Creates a RefinementIntervals object.

Parameters
levelsNumber of refinement levels, translates to \(2^{levels}\) intervals per axis
Creative Commons License   |  Legal Statements / Impressum  |  Hosted by TU Dresden  |  generated with Hugo v0.80.0 (Apr 18, 22:30, 2024)