DUNE-ACFEM (2.5.1)

dirichletconstraints.hh
1 #ifndef DUNE_ACFEM_DIRICHLETCONSTRAINTS_HH
2 #define DUNE_ACFEM_DIRICHLETCONSTRAINTS_HH
3 
4 #include <dune/fem/function/common/scalarproducts.hh>
5 
6 #include "../../models/boundaryindicator.hh"
7 #include "../../functions/boundarysupportedfunction.hh"
8 #include "../../functions/gridfunctionexpression.hh"
9 #include "bulkblockconstraints.hh"
10 
11 namespace Dune {
12 
13  namespace ACFem {
14 
23  template<class JacobianOperator, class BoundaryValues, class Indicator = EntireBoundaryIndicatorType >
24  class DirichletConstraints;
25 
26  template<class JacobianOperator, class BoundaryValues, class Indicator>
27  class LocalDirichletConstraints;
28 
29  template<class JacobianOperator, class BoundaryValues, class Indicator>
30  struct DirichletBlockConstraintsTraits
31  : public
32  BlockConstraintsDefaultStorageTraits<
33  DirichletConstraints<JacobianOperator, BoundaryValues, Indicator>,
34  LocalDirichletConstraints<JacobianOperator, BoundaryValues, Indicator> >
35  {};
36 
39  template<class JacobianOperator, class BoundaryValues>
40  struct DirichletBlockConstraintsTraits<JacobianOperator, BoundaryValues, EmptyBoundaryIndicatorType>
41  : public BlockConstraintsDefaultTraits<DirichletConstraints<JacobianOperator, BoundaryValues, EmptyBoundaryIndicatorType>,
42  LocalDirichletConstraints<JacobianOperator, BoundaryValues, EmptyBoundaryIndicatorType> >
43  {};
44 
45  template<class JacobianOperator, class BoundaryValues>
46  class DirichletConstraints<JacobianOperator, BoundaryValues, EmptyBoundaryIndicatorType>
47  : public DifferentiableBlockConstraintsOperatorInterface<JacobianOperator,
48  DirichletBlockConstraintsTraits<JacobianOperator, BoundaryValues, EmptyBoundaryIndicatorType> >
49  {
50  public:
52  typedef typename TraitsType::LocalOperatorType LocalOperatorType;
53  typedef JacobianOperator JacobianOperatorType;
54  typedef typename JacobianOperatorType::DomainFunctionType DiscreteFunctionType;
55  typedef typename DiscreteFunctionType::DiscreteFunctionSpaceType DiscreteFunctionSpaceType;
56  typedef typename DiscreteFunctionSpaceType::GridPartType GridPartType;
57  typedef typename DiscreteFunctionSpaceType::EntityType EntityType;
58  typedef BoundaryValues BoundaryValuesFunctionType;
59  typedef EmptyBoundaryIndicatorType IndicatorType;
60 
61  DirichletConstraints(const DiscreteFunctionSpaceType& space,
62  const BoundaryValuesFunctionType& boundaryValues,
63  const IndicatorType& indicator)
64  {}
65 
66  void operator()(const DiscreteFunctionType& arg, DiscreteFunctionType& result) const {}
67  void jacobian(const DiscreteFunctionType& u, JacobianOperatorType& jOp) const {}
68 
69  LocalOperatorType localOperator(const EntityType& entity) const
70  {
71  return LocalOperatorType();
72  }
73 
74  LocalOperatorType localOperator() const
75  {
76  return LocalOperatorType();
77  }
78 
79  void rebuild() const {}
80  void constrain(DiscreteFunctionType& w) const {}
81  void zeroConstrain(DiscreteFunctionType& w) const {}
82  size_t size() const { return 0; }
83  };
84 
85 
86  template<class JacobianOperator, class BoundaryValues>
87  class LocalDirichletConstraints<JacobianOperator, BoundaryValues, EmptyBoundaryIndicatorType>
88  {
89  protected:
90  typedef DirichletConstraints<JacobianOperator, BoundaryValues, EmptyBoundaryIndicatorType> OperatorType;
91  friend OperatorType;
92 
93  LocalDirichletConstraints(const OperatorType& op) {}
94  LocalDirichletConstraints() {}
95  public:
96  typedef typename OperatorType::EntityType EntityType;
97  typedef typename OperatorType::DiscreteFunctionType::LocalFunctionType LocalFunctionType;
98  typedef JacobianOperator JacobianOperatorType;
99 
100  void init(const EntityType& entity) {}
101  void operator()(const LocalFunctionType& u, LocalFunctionType& w) const {}
102  template<class LocalMatrix>
103  void jacobian(const LocalFunctionType& u /* unused */, LocalMatrix& jOpLocal) const {}
104  void constrain(LocalFunctionType& u) const {}
105  void zeroConstrain(LocalFunctionType& u) const {}
106  size_t numConstrained() { return 0; }
107  bool unconstrained() { return true; }
108  bool totallyConstrained() const { return false; }
109  };
110 
113  template<class JacobianOperator, class BoundaryValues, class Indicator>
115  : public BulkBlockConstraints<JacobianOperator,
116  DirichletBlockConstraintsTraits<JacobianOperator, BoundaryValues, Indicator> >
117  {
119  public:
120  typedef DirichletBlockConstraintsTraits<JacobianOperator, BoundaryValues, Indicator> TraitsType;
121  private:
124  public:
125  typedef typename BaseType::DiscreteFunctionType DiscreteFunctionType;
126  typedef typename BaseType::JacobianOperatorType JacobianOperatorType;
127  typedef typename BaseType::LocalOperatorType LocalOperatorType;
128  typedef typename BaseType::DiscreteFunctionSpaceType DiscreteFunctionSpaceType;
129  typedef typename BaseType::GridPartType GridPartType;
130  typedef typename BaseType::EntityType EntityType;
131 
132  typedef BoundaryValues BoundaryValuesFunctionType;
133  typedef decltype(*std::declval<Indicator>()) IndicatorType;
134 
136  typedef typename DiscreteFunctionSpaceType::GridType GridType;
137 
138  // types for boundary treatment
139  // ----------------------------
140  typedef typename DiscreteFunctionSpaceType::BlockMapperType BlockMapperType;
141  typedef Dune::Fem::SlaveDofs<DiscreteFunctionSpaceType, BlockMapperType> SlaveDofsType;
142  typedef typename SlaveDofsType::SingletonKey SlaveDofsKeyType;
143  typedef Dune::Fem::SingletonList<SlaveDofsKeyType, SlaveDofsType>
144  SlaveDofsProviderType;
145  //typedef typename BlockMapperType::GlobalKeyType GlobalKeyType;
146  typedef std::size_t GlobalKeyType;
147 
148  DirichletConstraints(const DiscreteFunctionSpaceType& space,
149  const BoundaryValuesFunctionType& boundaryValues,
150  const IndicatorType& indicator)
151  : BaseType(space),
152  boundaryValues_(boundaryValues),
153  indicator_(indicator)
154  {}
155 
156  using BaseType::size;
157  using BaseType::jacobian;
158  using BaseType::constrain;
160  using BaseType::localOperator;
161 
162  //using BaseType::operator();
163  void operator()(const DiscreteFunctionType& arg, DiscreteFunctionType& result) const {
164  BaseType::operator()(arg, result);
165  }
166 
170  void rebuild() const
171  {
172  // std::cerr << "rebuild called "
173  // << sequence_
174  // << " "
175  // << space_.sequence()
176  // << std::endl;
177  if (sequence_ != space_.sequence()) {
178 
179  BaseType::rebuildSlaveDofs();
180 
181  updateBoundaryValues(boundaryValues_(), affineOffset_);
182 
183  sequence_ = space_.sequence();
184  }
185  }
186 
191  {
192  if (sequence_ != space_.sequence()) {
193  BaseType::rebuildSlaveDofs();
194  }
195 
196  updateBoundaryValues(boundaryValues_(), affineOffset_);
197 
198  sequence_ = space_.sequence();
199  }
200 
201  protected:
202  enum { localBlockSize = DiscreteFunctionSpaceType::localBlockSize };
203 
205  void updateBoundaryValues(const BoundaryValuesFunctionType& u, DiscreteFunctionType& w) const
206  {
207  const auto& mapper = space_.blockMapper();
208  const int maxNumDofs = mapper.maxNumDofs();
209 
210  // resize flag vector with number of blocks and reset flags
211  constrainedDofsMask_.resize(mapper.size());
212  std::fill(constrainedDofsMask_.begin(), constrainedDofsMask_.end(), 0U);
213 
214  // only start search if Dirichlet boundary is present
216  numConstrained_ = 0;
217  return;
218  }
219 
220  // pre-allocate local objects
221  std::vector<GlobalKeyType> blockDofIndices;
222  std::vector<bool> blockDofFaceMask;
223  blockDofIndices.reserve(maxNumDofs);
224  blockDofFaceMask.reserve(maxNumDofs);
225  auto uValues = temporaryLocalFunction(space_);
226  auto uLocal = localFunction(u);
227  auto wLocal = localFunction(w);
228 
229  numConstrained_ = 0;
230  for (const auto& entity : space_) {
231  for (const auto& intersection : intersections(space_.gridPart(), entity)) {
232 
233  // if intersection is with boundary, adjust data
234  if (intersection.neighbor() || !intersection.boundary()) {
235  continue;
236  }
237 
238  // Check whether this segment belongs to a Dirichlet boundary ...
239  if (!indicator_().applies(intersection)) {
240  continue; // Nope
241  }
242 
243  // actual number of DoFs
244  const int numDofs = mapper.numDofs(entity);
245 
246  // init local stuff
247  blockDofIndices.resize(numDofs, GlobalKeyType(-1));
248  blockDofFaceMask.resize(numDofs, false);
249  uValues.init(entity);
250  uLocal.init(entity, intersection);
251  wLocal.init(entity);
252 
253  // get local -> global mapping
254  space_.blockMapper().map(entity, blockDofIndices);
255 
256  // get mask of affected (block)-DoFs
257  // get face number of boundary intersection
258  const int face = intersection.indexInInside();
259  mapper.onSubEntity(entity, face, 1 /* codim */, blockDofFaceMask);
260 
261  // call "natural" interpolation for _ALL_ DoFs
262  space_.interpolation(entity)(uLocal, uValues);
263 
264  for(int localBlock = 0; localBlock < numDofs; ++localBlock) {
265  if (!blockDofFaceMask[localBlock]) {
266  continue;
267  }
268  ++constrainedDofsMask_[blockDofIndices[localBlock]];
269  ++numConstrained_;
270 
271  int localDof = localBlock * localBlockSize;
272  for(int l = 0; l < localBlockSize; ++l, ++localDof) {
273  wLocal[localDof] = uValues[localDof];
274  }
275  }
276  }
277  }
278  }
279 
280  protected:
282  using BaseType::space_;
283  using BaseType::affineOffset_;
284  using BaseType::constrainedDofsMask_;
285  using BaseType::sequence_;
286  using BaseType::numConstrained_;
287 
288  const ExpressionStorage<BoundaryValuesFunctionType> boundaryValues_;
289  const ExpressionStorage<IndicatorType> indicator_;
290  };
291 
292  template<class JacobianOperator, class BoundaryValues, class Indicator>
293  class LocalDirichletConstraints
294  : public LocalBulkBlockConstraints<JacobianOperator,
295  DirichletBlockConstraintsTraits<JacobianOperator, BoundaryValues, Indicator> >
296  {
297  typedef DirichletBlockConstraintsTraits<JacobianOperator, BoundaryValues, Indicator> TraitsType;
298  typedef LocalBulkBlockConstraints<JacobianOperator, TraitsType> BaseType;
299  protected:
300  typedef typename TraitsType::GlobalOperatorType OperatorType;
301  typedef typename OperatorType::LocalObjectFactoryType LocalObjectFactoryType;
302  friend LocalObjectFactoryType;
303 
304  LocalDirichletConstraints(const OperatorType& op)
305  : BaseType(op)
306  {}
307  public:
310  bool totallyConstrained() const
311  {
312  return false;
313  }
314  };
315 
317 
319 
320  } // ACFem::
321 
322 } // Dune::
323 #endif
Interface class for a block-constraints-operator.
Definition: blockconstraintsoperator.hh:75
A default implementation for bulk block constraints.
Definition: bulkblockconstraints.hh:51
void operator()(const DiscreteFunctionType &u, DiscreteFunctionType &w) const
Apply the operator to the given argument.
Definition: bulkblockconstraints.hh:163
void jacobian(const DiscreteFunctionType &u, JacobianOperatorType &jOp) const
The Jacobian of the operator.
Definition: bulkblockconstraints.hh:194
Interface class for a differentiable block-constraints-operator.
Definition: blockconstraintsoperator.hh:182
void zeroConstrain(DiscreteFunctionType &w) const
Unconditionally set the values of all masked DoFs to zero.
Definition: blockconstraintsoperator.hh:135
void constrain(DiscreteFunctionType &w) const
The solution operator; unconditionally install the given constraints into the argument.
Definition: blockconstraintsoperator.hh:129
Implementation of Dirichlet constraints.
Definition: dirichletconstraints.hh:117
LocalOperatorType localOperator(const EntityType &entity) const
Generate the local version of this operator from the given entitiy.
Definition: blockconstraintsoperator.hh:150
size_t size() const
Return the number of constrainted block-DoFs.
Definition: blockconstraintsoperator.hh:142
void updateBoundaryValues(const BoundaryValuesFunctionType &u, DiscreteFunctionType &w) const
Update the flag vector and interpolate the boundary values.
Definition: dirichletconstraints.hh:205
void zeroConstrain(DiscreteFunctionType &w) const
Unconditionally set the values of all masked DoFs to zero.
Definition: blockconstraintsoperator.hh:135
void rebuildValues()
Interpolate the Dirichlet values in any case, but leave slave-DoFs as is if nothing changed.
Definition: dirichletconstraints.hh:190
void rebuild() const
Rebuild everything in case the sequence number of the underlying space has changed,...
Definition: dirichletconstraints.hh:170
void constrain(DiscreteFunctionType &w) const
The solution operator; unconditionally install the given constraints into the argument.
Definition: blockconstraintsoperator.hh:129
DiscreteFunctionSpaceType::GridType GridType
type of grid
Definition: dirichletconstraints.hh:136
We need the type of the implementation and the local operator type.
Definition: blockconstraintsoperator.hh:37
Spezialization of Dirichlet constraints for emptyboundaryindicator.
Definition: dirichletconstraints.hh:43
A traits class in order to collect properties of expressions.
Definition: expressionoperations.hh:465
Creative Commons License   |  Legal Statements / Impressum  |  Hosted by TU Dresden  |  generated with Hugo v0.80.0 (May 16, 22:29, 2024)