dune-pdelab  2.5-dev
constraintstransformation.hh
Go to the documentation of this file.
1 // -*- tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*-
2 // vi: set et ts=8 sw=2 sts=2:
3 #ifndef DUNE_PDELAB_CONSTRAINTS_COMMON_CONSTRAINTSTRANSFORMATION_HH
4 #define DUNE_PDELAB_CONSTRAINTS_COMMON_CONSTRAINTSTRANSFORMATION_HH
5 
6 #include <algorithm>
7 #include <unordered_map>
8 
9 namespace Dune {
10  namespace PDELab {
11 
15 
17  template<typename DI, typename CI, typename F>
19  : public std::unordered_map<CI,std::unordered_map<CI,F> >
20  {
21 
22  typedef std::unordered_map<CI,std::unordered_map<CI,F> > BaseT;
23 
24  public:
26  typedef F ElementType;
27  typedef F Field;
28 
30  : public std::unordered_map<DI,std::unordered_map<DI,F> >
31  {
32 
33  public:
34 
35  typedef F ElementType;
36  typedef F Field;
37 
38  typedef std::unordered_map<DI,F> RowType;
39 
41  {
42  return std::any_of(
43  this->begin(), this->end(),
44  [] (const std::pair<DI,RowType> & c)
45  -> bool { return (!c.second.empty()); });
46  }
47 
48  };
49 
51  typedef typename ConstraintsTransformation::mapped_type RowType;
52 
54  : _contains_non_dirichlet_constraints(false)
55  {}
56 
57  void clear()
58  {
59  BaseT::clear();
60  _contains_non_dirichlet_constraints = false;
61  }
62 
63  template<typename IndexCache>
64  void import_local_transformation(const LocalTransformation& local_transformation, const IndexCache& index_cache)
65  {
66  typedef typename IndexCache::ContainerIndex ContainerIndex;
67  typedef typename ConstraintsTransformation::iterator GlobalConstraintIterator;
68  typedef typename ConstraintsTransformation::mapped_type GlobalConstraint;
69 
70  for (const auto& local_constraint : local_transformation)
71  {
72  const ContainerIndex& ci = index_cache.containerIndex(local_constraint.first);
73 
74  std::pair<GlobalConstraintIterator,bool> r =
75  this->insert(make_pair(ci,GlobalConstraint()));
76 
77  GlobalConstraint& global_constraint = r.first->second;
78 
79  // Don't modify an existing Dirichlet constraint
80  if (!r.second && global_constraint.empty())
81  continue;
82 
83  // The new constraint is a Dirichlet constraint
84  // Clear out any existing entries in the global constraint and stop
85  if (local_constraint.second.empty())
86  {
87  global_constraint.clear();
88  continue;
89  }
90 
91  // We have a non-Dirichlet constraint
92  _contains_non_dirichlet_constraints = true;
93 
94  // Accumulate new entries into global constraint
95  for (const auto& local_entry : local_constraint.second)
96  global_constraint[index_cache.containerIndex(local_entry.first)] = local_entry.second;
97  }
98  }
99 
101  {
102  return _contains_non_dirichlet_constraints;
103  }
104 
105  private:
106 
107  bool _contains_non_dirichlet_constraints;
108 
109  };
110 
111  class EmptyTransformation : public ConstraintsTransformation<char,char,char>
112  {
113 
114  public:
115 
117  {
118  return false;
119  }
120 
121  };
122 
124  } // namespace PDELab
125 } // namespace Dune
126 
127 #endif // DUNE_PDELAB_CONSTRAINTS_COMMON_CONSTRAINTSTRANSFORMATION_HH
bool containsNonDirichletConstraints() const
Definition: constraintstransformation.hh:100
bool containsNonDirichletConstraints() const
Definition: constraintstransformation.hh:116
ConstraintsTransformation()
Definition: constraintstransformation.hh:53
F Field
Definition: constraintstransformation.hh:36
bool containsNonDirichletConstraints() const
Definition: constraintstransformation.hh:40
F Field
Definition: constraintstransformation.hh:27
For backward compatibility – Do not use this!
Definition: adaptivity.hh:27
F ElementType
export ElementType
Definition: constraintstransformation.hh:26
void clear()
Definition: constraintstransformation.hh:57
void import_local_transformation(const LocalTransformation &local_transformation, const IndexCache &index_cache)
Definition: constraintstransformation.hh:64
Definition: constraintstransformation.hh:29
F ElementType
Definition: constraintstransformation.hh:35
a class holding transformation for constrained spaces
Definition: constraintstransformation.hh:18
std::unordered_map< DI, F > RowType
Definition: constraintstransformation.hh:38
ConstraintsTransformation::mapped_type RowType
export RowType
Definition: constraintstransformation.hh:51
Definition: constraintstransformation.hh:111