19#include <dune/functions/backends/istlvectorbackend.hh>
20#include <dune/functions/functionspacebases/boundarydofs.hh>
24#include <autodiff/forward/real/real.hpp>
29template <
class K,
int N>
45template <
typename B,
typename FC = std::vector<
bool>>
49 using Basis = std::remove_cvref_t<B>;
52 using BackendType =
decltype(Dune::Functions::istlVectorBackend(std::declval<FlagsType&>()));
55 dirichletFlagsBackend_{dirichletFlags_} {
56 dirichletFlagsBackend_.resize(basis_);
57 std::fill(dirichletFlags_.begin(), dirichletFlags_.end(),
false);
58 inhomogeneousBoundaryVectorDummy_.setZero(
static_cast<Eigen::Index
>(basis_.size()));
72 auto lambda = [&](
auto&& indexGlobal) { f(dirichletFlagsBackend_, indexGlobal); };
73 Dune::Functions::forEachBoundaryDOF(basis_, lambda);
75 auto lambda = [&](
auto&& localIndex,
auto&& localView) { f(dirichletFlagsBackend_, localIndex, localView); };
76 Dune::Functions::forEachBoundaryDOF(basis_, lambda);
78 typename Basis::GridView::Intersection>) {
79 auto lambda = [&](
auto&& localIndex,
auto&& localView,
auto&& intersection) {
80 f(dirichletFlagsBackend_, localIndex, localView, intersection);
82 Dune::Functions::forEachBoundaryDOF(basis_, lambda);
96 f(basis_, dirichletFlagsBackend_);
104 void fixIthDOF(
typename Basis::MultiIndex i) { dirichletFlagsBackend_[i] =
true; }
107 const auto&
basis()
const {
return basis_; }
110 template <
typename MultiIndex>
111 requires(not std::integral<MultiIndex>)
113 return dirichletFlagsBackend_[multiIndex];
117 [[nodiscard]]
bool isConstrained(std::size_t i)
const {
return dirichletFlags_[i]; }
120 auto fixedDOFsize()
const {
return std::ranges::count(dirichletFlags_,
true); }
123 auto size()
const {
return dirichletFlags_.size(); }
137 template <
typename F>
139 auto derivativeLambda = [&](
const auto& globalCoord,
const double& lambda) {
140 autodiff::real lambdaDual = lambda;
142 return derivative(f(globalCoord, lambdaDual));
144 dirichletFunctions_.push_back({f, derivativeLambda});
157 inhomogeneousBoundaryVectorDummy_.setZero();
158 xIh.resizeLike(inhomogeneousBoundaryVectorDummy_);
160 for (
auto& f : dirichletFunctions_) {
162 basis_, inhomogeneousBoundaryVectorDummy_,
163 [&](
const auto& globalCoord) {
return f.value(globalCoord, lambda); }, dirichletFlagsBackend_);
164 xIh += inhomogeneousBoundaryVectorDummy_;
178 inhomogeneousBoundaryVectorDummy_.setZero();
179 xIh.resizeLike(inhomogeneousBoundaryVectorDummy_);
181 for (
auto& f : dirichletFunctions_) {
183 basis_, inhomogeneousBoundaryVectorDummy_,
184 [&](
const auto& globalCoord) {
return f.derivative(globalCoord, lambda); }, dirichletFlagsBackend_);
185 xIh += inhomogeneousBoundaryVectorDummy_;
190 Eigen::VectorXd inhomogeneousBoundaryVectorDummy_;
194 struct DirichletFunctions
196 using Signature = std::function<Eigen::Vector<double, worldDimension>(
199 Signature derivative;
201 std::vector<DirichletFunctions> dirichletFunctions_;
Definition: simpleassemblers.hh:22
Definition: utils/dirichletvalues.hh:28
Definition: utils/dirichletvalues.hh:30
Class for handling Dirichlet boundary conditions in Ikarus.
Definition: utils/dirichletvalues.hh:47
auto size() const
Definition: utils/dirichletvalues.hh:123
bool isConstrained(const MultiIndex &multiIndex) const
Definition: utils/dirichletvalues.hh:112
std::remove_cvref_t< B > Basis
Definition: utils/dirichletvalues.hh:49
void fixIthDOF(typename Basis::MultiIndex i)
Function to fix (set boolean values to true or false) of degrees of freedom.
Definition: utils/dirichletvalues.hh:104
decltype(Dune::Functions::istlVectorBackend(std::declval< FlagsType & >())) BackendType
Definition: utils/dirichletvalues.hh:52
void fixBoundaryDOFs(F &&f)
Function to fix (set boolean values to true or false) degrees of freedom on the boundary.
Definition: utils/dirichletvalues.hh:70
void evaluateInhomogeneousBoundaryConditionDerivative(Eigen::VectorXd &xIh, const double &lambda)
Function to evaluate all stored inhomogeneous Dirichlet boundary derivative functions.
Definition: utils/dirichletvalues.hh:177
static constexpr int worldDimension
Definition: utils/dirichletvalues.hh:51
bool isConstrained(std::size_t i) const
Definition: utils/dirichletvalues.hh:117
void fixDOFs(F &&f)
Function to fix (set boolean values to true or false) degrees of freedom.
Definition: utils/dirichletvalues.hh:95
FC FlagsType
Definition: utils/dirichletvalues.hh:50
void storeInhomogeneousBoundaryCondition(F &&f)
Function to insert a function for inhomogeneous Dirichlet boundary conditions.
Definition: utils/dirichletvalues.hh:138
void evaluateInhomogeneousBoundaryCondition(Eigen::VectorXd &xIh, const double &lambda)
Function to evaluate all stored inhomogeneous Dirichlet boundary functions.
Definition: utils/dirichletvalues.hh:156
const auto & basis() const
Definition: utils/dirichletvalues.hh:107
auto fixedDOFsize() const
Definition: utils/dirichletvalues.hh:120
DirichletValues(const B &basis)
Definition: utils/dirichletvalues.hh:53
auto & container() const
Definition: utils/dirichletvalues.hh:126
Concept defining the requirements for functors with arguments.
Definition: concepts.hh:343