Dune-Fufem 2.11-git
Loading...
Searching...
No Matches
elementdata.hh
Go to the documentation of this file.
1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
2// vi: set et ts=4 sw=2 sts=2:
3
4// SPDX-FileCopyrightText: Copyright © DUNE-FUFEM Project contributors, see file AUTHORS.md
5// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception OR LGPL-3.0-or-later
6
7#ifndef DUNE_FUFEM_GRID_ELEMENTDATA_HH
8#define DUNE_FUFEM_GRID_ELEMENTDATA_HH
9
10
11#include <cstddef>
12#include <type_traits>
13#include <utility>
14#include <vector>
15
17
18#include <dune/grid/common/gridfactory.hh>
21
22
23namespace Dune::Fufem {
24
25
26
45template<class GV, class T=int>
47{
48public:
49
50 using GridView = GV;
51 using Grid = typename GridView::Grid;
53 using Element = typename GridView::template Codim<0>::Entity;
54
67 : coarseData_(coarseData)
68 , mapper_(gridView, Dune::mcmgElementLayout())
69 {
70 updateData();
71 }
72
85 ElementData(const Dune::GmshReader<Grid>& reader, const Dune::GridFactory<Grid>& factory, const GridView& gridView)
86 : coarseData_()
87 , mapper_(gridView, Dune::mcmgElementLayout())
88 {
89 if (not reader.hasElementData())
90 DUNE_THROW(Dune::InvalidStateException, "The GmshReader passed to ElementData has no stored element data.");
91 const auto& rawElementData = reader.elementData();
92 const auto& grid = mapper_.gridView().grid();
93 auto coarseGridView = grid.levelGridView(0);
94 auto coarseMapper = Dune::MultipleCodimMultipleGeomTypeMapper(coarseGridView, Dune::mcmgElementLayout());
95 coarseData_.resize(coarseMapper.size());
96 for(const auto& coarseElement : elements(coarseGridView))
97 coarseData_[coarseMapper.index(coarseElement)] = rawElementData[factory.insertionIndex(coarseElement)];
98 updateData();
99 }
100
115 ElementData(const Dune::GmshReader<Grid>& reader, const Dune::GridFactory<Grid>& factory, const Grid& grid)
117 : ElementData(reader, factory, grid.leafGridView())
118 {}
119
132 : coarseData_(std::move(coarseData))
133 , mapper_(gridView, Dune::mcmgElementLayout())
134 {
135 updateData();
136 }
137
145 void update(const GridView& gridView)
146 {
147 mapper_.update(gridView);
148 updateData();
149 }
150
154 const T& operator()(const Element& element) const
155 {
156 return data_[mapper_.index(element)];
157 }
158
162 const T& operator[](std::size_t elementIndex) const
163 {
164 return data_[elementIndex];
165 }
166
171 {
172 return data_.size();
173 }
174
178 const std::vector<T>& data() const
179 {
180 return data_;
181 }
182
187 {
188 return coarseData_;
189 }
190
191private:
192
193 template<class F>
194 static void forEachDescendent(const Element& element, const GridView& gridView, F&& f)
195 {
196 if (gridView.contains(element))
197 f(element);
198 else
199 for(const auto& childElement : descendantElements(element, element.level()+1))
200 forEachDescendent(childElement, gridView, f);
201 }
202
203 void updateData()
204 {
205 data_.resize(mapper_.size());
206 const auto& grid = mapper_.gridView().grid();
207 auto coarseGridView = grid.levelGridView(0);
208 auto coarseMapper = Dune::MultipleCodimMultipleGeomTypeMapper(coarseGridView, Dune::mcmgElementLayout());
209 for(const auto& coarseElement : elements(coarseGridView))
210 {
211 auto coarseValue = coarseData_[coarseMapper.index(coarseElement)];
212 forEachDescendent(coarseElement, mapper_.gridView(), [&](const auto& fineElement){
213 data_[mapper_.index(fineElement)] = coarseValue;
214 });
215 }
216 }
217
218 std::vector<T> coarseData_;
219 std::vector<T> data_;
220 Mapper mapper_;
221};
222
223template<class GridView>
226
227template<class Grid>
230
231
232
233} // namespace Dune::Fufem
234
235
236#endif // DUNE_FUFEM_GRID_ELEMENTDATA_HH
#define DUNE_THROW(E,...)
STL namespace.
Definition dunefunctionsboundaryfunctionalassembler.hh:29
Grid< dim, dimworld, ct, GridFamily >::LeafGridView leafGridView(const Grid< dim, dimworld, ct, GridFamily > &grid)
bool contains(const EntityType &e) const
MCMGLayout mcmgElementLayout()
LevelGridView levelGridView(int level) const
virtual unsigned int insertionIndex(const typename Codim< 0 >::Entity &entity) const
Index index(const EntityType &e) const
const std::vector< int > & elementData() const
bool hasElementData() const
Class for storing data associated to elements.
Definition elementdata.hh:47
std::size_t size() const
Size of the container (number of elements in grid view)
Definition elementdata.hh:170
GV GridView
Definition elementdata.hh:50
const std::vector< T > & coarseData() const
Access raw container with stored level-0 coarse data.
Definition elementdata.hh:186
ElementData(std::vector< T > &&coarseData, const GridView &gridView)
Create ElementData.
Definition elementdata.hh:131
const T & operator[](std::size_t elementIndex) const
Access data by consecutive element index.
Definition elementdata.hh:162
typename GridView::template Codim< 0 >::Entity Element
Definition elementdata.hh:53
typename GridView::Grid Grid
Definition elementdata.hh:51
ElementData(const Dune::GmshReader< Grid > &reader, const Dune::GridFactory< Grid > &factory, const GridView &gridView)
Create ElementData.
Definition elementdata.hh:85
void update(const GridView &gridView)
Update after changes to the grid or GridView.
Definition elementdata.hh:145
Dune::MultipleCodimMultipleGeomTypeMapper< GridView > Mapper
Definition elementdata.hh:52
ElementData(const std::vector< T > &coarseData, const GridView &gridView)
Create ElementData.
Definition elementdata.hh:66
const T & operator()(const Element &element) const
Map element to associated data.
Definition elementdata.hh:154
const std::vector< T > & data() const
Access raw container with stored data.
Definition elementdata.hh:178
ElementData(const Dune::GmshReader< Grid > &reader, const Dune::GridFactory< Grid > &factory, const Grid &grid)
Create ElementData.
Definition elementdata.hh:115
T forward(T... args)