version 0.4.4
resultfunction.hh
Go to the documentation of this file.
1// SPDX-FileCopyrightText: 2021-2025 The Ikarus Developers ikarus@ibb.uni-stuttgart.de
2// SPDX-License-Identifier: LGPL-3.0-or-later
3
11#pragma once
12
13#include <type_traits>
14
15#include <dune/vtk/gridfunctions/vtkfunctionwrapper.hh>
16#include <dune/vtk/vtkwriter.hh>
17
20
21namespace Ikarus {
22namespace Impl {
23 struct DefaultUserFunction
24 {
32 template <typename R, typename FiniteElement, int dim>
33 double operator()(const R& resultArray, const Dune::FieldVector<double, dim>& pos, const FiniteElement& fe,
34 const int comp) const {
35 return resultArray[comp];
36 };
37 };
38} // namespace Impl
39
55template <typename AS, template <typename, int, int> class RT, typename UserFunction = Impl::DefaultUserFunction>
56requires(Concepts::FlatAssembler<AS> and Concepts::ResultType<RT>)
57class ResultFunction : public Dune::VTKFunction<typename AS::GridView>
58{
59public:
60 using Assembler = AS;
61 using GridView = typename Assembler::GridView;
62 using FERequirementType = typename Assembler::FERequirement;
63 using FEContainer = typename Assembler::FEContainer;
64 using FiniteElement = typename std::remove_cvref_t<FEContainer>::value_type;
65
66 using ctype = typename GridView::ctype;
67 constexpr static int griddim = GridView::dimension;
68 using Entity = typename GridView::template Codim<0>::Entity;
69
80 double evaluate(int comp, const Entity& e, const Dune::FieldVector<ctype, griddim>& local) const override {
81 const auto index = gridView().indexSet().index(e);
82 return evaluateComponent(index, local, comp);
83 }
84
92 [[nodiscard]] int ncomps() const override {
93 if constexpr (std::is_same_v<UserFunction, Impl::DefaultUserFunction>) {
95 auto sigma = finiteElements().at(0).template calculateAt<RT>(requirement(), val).asVec();
96 return static_cast<int>(sigma.size());
97 } else
98 return userFunction_.ncomps();
99 }
100
108 [[nodiscard]] constexpr std::string name() const override {
109 if constexpr (requires { userFunction_.name(); })
110 return userFunction_.name();
111 else
112 return toString<RT>();
113 }
114
123 Dune::VTK::Precision precision() const override { return prec_; }
124
135 template <typename UF = UserFunction>
136 ResultFunction(std::shared_ptr<Assembler> assembler, Dune::VTK::Precision prec = Dune::VTK::Precision::float64,
137 UF&& userFunction = {})
138 : assembler_(assembler),
139 prec_{prec},
140 userFunction_{std::forward<UF>(userFunction)} {}
141
142private:
143 double evaluateComponent(int eleID, const Dune::FieldVector<ctype, griddim>& local, int comp) const {
144 const auto& fe = finiteElements().at(eleID);
145 auto result = fe.template calculateAt<RT>(requirement(), local).asVec();
146
147 return userFunction_(result, local, fe, comp);
148 }
149
150 const FEContainer& finiteElements() const { return assembler_->finiteElements(); }
151 const FERequirementType& requirement() const { return assembler_->requirement(); }
152 const GridView& gridView() const { return assembler_->gridView(); }
153
154 std::shared_ptr<Assembler> assembler_;
155
156 Dune::VTK::Precision prec_;
157 UserFunction userFunction_;
158};
159
173template <template <typename, int, int> class RT, typename UserFunction = Impl::DefaultUserFunction,
174 Concepts::FlatAssembler AS>
175auto makeResultFunction(std::shared_ptr<AS> assembler, Dune::VTK::Precision prec = Dune::VTK::Precision::float64,
176 UserFunction&& userFunction = {}) {
177 return std::make_shared<ResultFunction<AS, RT, UserFunction>>(assembler, prec,
178 std::forward<UserFunction>(userFunction));
179}
180
191template <template <typename, int, int> class RT, typename UserFunction, Concepts::FlatAssembler AS>
192auto makeResultFunction(std::shared_ptr<AS> assembler, UserFunction&& userFunction) {
193 return makeResultFunction<RT>(assembler, Dune::VTK::Precision::float64, std::forward<UserFunction>(userFunction));
194}
195
212template <template <typename, int, int> class RT, typename UserFunction = Impl::DefaultUserFunction,
213 Concepts::FlatAssembler AS>
214auto makeResultVtkFunction(std::shared_ptr<AS> assembler, UserFunction&& userFunction = {}) {
215 return Dune::Vtk::VTKFunctionWrapper<typename AS::GridView>(std::make_shared<ResultFunction<AS, RT, UserFunction>>(
216 assembler, Dune::VTK::Precision::float64, std::forward<UserFunction>(userFunction)));
217}
218
219} // namespace Ikarus
Definition of the LinearElastic class for finite element mechanics computations.
Definition: assemblermanipulatorbuildingblocks.hh:22
auto makeResultFunction(std::shared_ptr< AS > assembler, Dune::VTK::Precision prec=Dune::VTK::Precision::float64, UserFunction &&userFunction={})
Function to create a ResultFunction as a shared_ptr.
Definition: resultfunction.hh:175
auto makeResultVtkFunction(std::shared_ptr< AS > assembler, UserFunction &&userFunction={})
Function to create a ResultFunction as a gridfunction that can be used with dune-vtk.
Definition: resultfunction.hh:214
Wrapper to evaluate results for a vtkwriter. Works both out-of-the-box with Dune::VTK and Dune::Vtk.
Definition: resultfunction.hh:58
typename Assembler::FERequirement FERequirementType
Definition: resultfunction.hh:62
int ncomps() const override
Get the number of components.
Definition: resultfunction.hh:92
typename Assembler::FEContainer FEContainer
Definition: resultfunction.hh:63
typename GridView::template Codim< 0 >::Entity Entity
Definition: resultfunction.hh:68
typename std::remove_cvref_t< FEContainer >::value_type FiniteElement
Definition: resultfunction.hh:64
typename GridView::ctype ctype
Definition: resultfunction.hh:66
Dune::VTK::Precision precision() const override
Get the precision used for this result.
Definition: resultfunction.hh:123
ResultFunction(std::shared_ptr< Assembler > assembler, Dune::VTK::Precision prec=Dune::VTK::Precision::float64, UF &&userFunction={})
Construct a new Result Function object.
Definition: resultfunction.hh:136
constexpr std::string name() const override
Get the name of the result type.
Definition: resultfunction.hh:108
AS Assembler
Definition: resultfunction.hh:60
double evaluate(int comp, const Entity &e, const Dune::FieldVector< ctype, griddim > &local) const override
Evaluate the component at a given entity and local coordinates.
Definition: resultfunction.hh:80
typename Assembler::GridView GridView
Definition: resultfunction.hh:61
Definition: utils/dirichletvalues.hh:34
Several concepts.