6#include <dune/common/dynvector.hh>
7#include <dune/common/version.hh>
8#include <dune/localfunctions/lagrange.hh>
18 template <
class Gr
idType>
23 template <
class Gr
idType,
class FieldType,
class Context>
26 using Grid = GridType;
27 using Field = FieldType;
29 using Factory = GridFactory<Grid>;
36 using Element =
typename GridType::template Codim<0>::Entity;
42 using Range = DynamicVector<Field>;
47 class PointDataLocalFunction
49 using LFE = LagrangeLocalFiniteElement<LagrangePointSet, LC::dimension, FieldType, FieldType>;
50 using LB =
typename LFE::Traits::LocalBasisType;
53 using LocalContext = LC;
54 using Domain =
typename LC::Geometry::LocalCoordinate;
55 using Range = DynamicVector<Field>;
60 PointDataLocalFunction (
GridCreator const* creator, std::vector<Field>
const* values,
unsigned int comp,
61 std::vector<std::uint8_t>
const* types,
62 std::vector<std::int64_t>
const* offsets,
63 std::vector<std::int64_t>
const* connectivity)
69 , connectivity_(connectivity)
72 PointDataLocalFunction () =
default;
81 void bind (LocalContext
const& element)
83 unsigned int insertionIndex = creator_->factory().insertionIndex(element);
85 std::int64_t shift = (insertionIndex == 0 ? 0 : (*offsets_)[insertionIndex-1]);
86 std::int64_t numNodes = (*offsets_)[insertionIndex] - shift;
87 [[maybe_unused]] std::int64_t maxNumNodes = numLagrangePoints(element.type(), 20);
88 VTK_ASSERT(numNodes > 0 && numNodes < maxNumNodes);
90 int order = creator_->order(element.type(), numNodes);
95 lfe_.emplace(LFE{element.type(), (
unsigned int)(order)});
96 lgeo_.emplace(creator_->localGeometry(element));
99 localValues_.resize(numNodes);
100 for (std::int64_t i = shift, i0 = 0; i < (*offsets_)[insertionIndex]; ++i, ++i0) {
101 std::int64_t idx = (*connectivity_)[i];
102 DynamicVector<Field>& v = localValues_[i0];
104 for (
unsigned int j = 0; j < comp_; ++j)
105 v[j] = (*values_)[comp_*idx + j];
119 Range operator() (Domain
const& local)
const
122 auto const& lb = lfe_->localBasis();
123 lb.evaluateFunction(lgeo_->global(local), shapeValues_);
124 assert(shapeValues_.size() == localValues_.size());
126 Range y(comp_, Field(0));
127 for (std::size_t i = 0; i < shapeValues_.size(); ++i)
128 y.axpy(shapeValues_[i], localValues_[i]);
134 GridCreator
const* creator_ =
nullptr;
135 std::vector<Field>
const* values_ =
nullptr;
137 std::vector<std::uint8_t>
const* types_ =
nullptr;
138 std::vector<std::int64_t>
const* offsets_ =
nullptr;
139 std::vector<std::int64_t>
const* connectivity_ =
nullptr;
142 std::optional<LFE> lfe_ = std::nullopt;
143 std::optional<typename GridCreator::LocalGeometry> lgeo_ = std::nullopt;
146 std::vector<DynamicVector<Field>> localValues_;
147 mutable std::vector<typename LB::Traits::RangeType> shapeValues_;
152 class CellDataLocalFunction
155 using LocalContext = LC;
156 using Domain =
typename LC::Geometry::LocalCoordinate;
157 using Range = DynamicVector<Field>;
158 using Signature = Range(Domain);
162 CellDataLocalFunction (GridCreator
const* creator, std::vector<Field>
const* values,
unsigned int comp,
163 std::vector<std::uint8_t>
const* ,
164 std::vector<std::int64_t>
const* ,
165 std::vector<std::int64_t>
const* )
171 CellDataLocalFunction () =
default;
175 void bind (LocalContext
const& element)
177 unsigned int idx = creator_->factory().insertionIndex(element);
180 DynamicVector<Field>& v = localValue_;
183 for (
unsigned int j = 0; j < comp_; ++j)
184 v[j] = (*values_)[comp_*idx + j];
193 Range operator() (Domain
const& local)
const
199 GridCreator
const* creator_ =
nullptr;
200 std::vector<Field>
const* values_ =
nullptr;
204 DynamicVector<Field> localValue_;
209 using LocalFunction = std::conditional_t< std::is_same_v<Context,PointContext>,
210 PointDataLocalFunction<LC>,
211 CellDataLocalFunction<LC>>;
218 std::vector<std::uint8_t>
const& types,
219 std::vector<std::int64_t>
const& offsets,
220 std::vector<std::int64_t>
const& connectivity)
223 , name_(std::move(
name))
228 , connectivity_(&connectivity)
236 DUNE_THROW(Dune::NotImplemented,
"Evaluation in global coordinates not implemented.");
237 return Range(ncomps_, 0);
246 std::string
const&
name ()
const
265 return {gf.creator_, gf.values_, gf.ncomps_, gf.types_, gf.offsets_, gf.connectivity_};
269 GridCreator
const* creator_ =
nullptr;
270 std::vector<Field>
const* values_ =
nullptr;
271 std::string name_ =
"GridFunction";
272 unsigned int ncomps_ = 0;
274 std::vector<std::uint8_t>
const* types_ =
nullptr;
275 std::vector<std::int64_t>
const* offsets_ =
nullptr;
276 std::vector<std::int64_t>
const* connectivity_ =
nullptr;
278 EntitySet entitySet_;
Macro for wrapping error checks and throwing exceptions.
#define VTK_ASSERT(cond)
check if condition cond holds; otherwise, throw a VtkError.
Definition: errors.hh:29
LagrangeGridCreator(GridFactory< Grid > &) -> LagrangeGridCreator< Grid >
DataTypes
Definition: types.hh:52
Definition: lagrangegridcreator.hh:40
Grid-function representing values from a VTK file with local Lagrange interpolation of the values sto...
Definition: lagrangegridfunction.hh:25
DynamicVector< Field > Range
Definition: lagrangegridfunction.hh:42
EntitySet const & entitySet() const
Return a type that defines the element that can be iterated.
Definition: lagrangegridfunction.hh:241
Range(Domain) Signature
Definition: lagrangegridfunction.hh:43
int numComponents() const
Definition: lagrangegridfunction.hh:251
friend LocalFunction< typename EntitySet::Element > localFunction(LagrangeGridFunction const &gf)
Definition: lagrangegridfunction.hh:263
std::string const & name() const
Definition: lagrangegridfunction.hh:246
typename EntitySet::GlobalCoordinate Domain
Definition: lagrangegridfunction.hh:41
Range operator()(Domain const &global) const
Global evaluation. Not supported!
Definition: lagrangegridfunction.hh:234
LagrangeGridFunction()=default
LagrangeGridFunction(GridCreator const &creator, std::vector< Field > const &values, std::string name, unsigned int ncomps, Vtk::DataTypes dataType, std::vector< std::uint8_t > const &types, std::vector< std::int64_t > const &offsets, std::vector< std::int64_t > const &connectivity)
Definition: lagrangegridfunction.hh:216
Vtk::DataTypes dataType() const
Definition: lagrangegridfunction.hh:256
Definition: lagrangegridfunction.hh:34
typename Element::Geometry::GlobalCoordinate GlobalCoordinate
Definition: lagrangegridfunction.hh:38
typename Element::Geometry::LocalCoordinate LocalCoordinate
Definition: lagrangegridfunction.hh:37
GridType Grid
Definition: lagrangegridfunction.hh:35
typename GridType::template Codim< 0 >::Entity Element
Definition: lagrangegridfunction.hh:36