dune-pdelab  2.4.1
default/patternengine.hh
Go to the documentation of this file.
1 #ifndef DUNE_PDELAB_DEFAULT_PATTERNENGINE_HH
2 #define DUNE_PDELAB_DEFAULT_PATTERNENGINE_HH
3 
10 
11 namespace Dune{
12  namespace PDELab{
13 
21  template<typename LA>
24  {
25  public:
26 
27  template<typename TrialConstraintsContainer, typename TestConstraintsContainer>
28  bool needsConstraintsCaching(const TrialConstraintsContainer& cu, const TestConstraintsContainer& cv) const
29  {
30  return cu.containsNonDirichletConstraints() || cv.containsNonDirichletConstraints();
31  }
32 
34  typedef LA LocalAssembler;
35 
37  typedef typename LA::LocalOperator LOP;
38 
40  typedef typename LA::LFSU LFSU;
41  typedef typename LA::LFSUCache LFSUCache;
42  typedef typename LFSU::Traits::GridFunctionSpace GFSU;
43  typedef typename LA::LFSV LFSV;
44  typedef typename LA::LFSVCache LFSVCache;
45  typedef typename LFSV::Traits::GridFunctionSpace GFSV;
46 
48  typedef typename LA::Traits::BorderDOFExchanger BorderDOFExchanger;
49  typedef typename BorderDOFExchanger::BorderPattern BorderPattern;
50 
52  typedef typename LA::Traits::MatrixPattern Pattern;
53 
55 
56  typedef std::size_t size_type;
57 
64  DefaultLocalPatternAssemblerEngine(const LocalAssembler & local_assembler_,
65  shared_ptr<typename LA::Traits::BorderDOFExchanger> border_dof_exchanger)
66  : local_assembler(local_assembler_)
67  , lop(local_assembler.lop)
68  , pattern(nullptr)
69  , _border_dof_exchanger(border_dof_exchanger)
70  {}
71 
73  const LocalAssembler & localAssembler() const
74  {
75  return local_assembler;
76  }
77 
79  const typename LocalAssembler::Traits::TrialGridFunctionSpaceConstraints& trialConstraints() const
80  {
81  return localAssembler().trialConstraints();
82  }
83 
85  const typename LocalAssembler::Traits::TestGridFunctionSpaceConstraints& testConstraints() const
86  {
87  return localAssembler().testConstraints();
88  }
89 
92  void setPattern(Pattern & pattern_)
93  {
94  pattern = &pattern_;
95  }
96 
99 
100  bool requireSkeleton() const
101  {
102  return local_assembler.doPatternSkeleton();
103  }
104 
105  bool requireUVVolume() const
106  {
107  return local_assembler.doPatternVolume();
108  }
109 
110  bool requireUVSkeleton() const
111  {
112  return local_assembler.doPatternSkeleton();
113  }
114 
115  bool requireUVBoundary() const
116  {
117  return local_assembler.doPatternBoundary();
118  }
119 
121  {
122  return local_assembler.doPatternVolumePostSkeleton();
123  }
124 
126 
128 
129  template<typename LFSVC, typename LFSUC>
130  void add_border_pattern(true_type, const LFSVC& lfsv_cache, const LFSUC& lfsu_cache,
131  const LocalPattern& p)
132  {
133  if (local_assembler.reconstructBorderEntries() &&
134  !communicationCache().initialized())
135  {
136  communicationCache().addEntries(lfsv_cache,lfsu_cache,p);
137  }
138  }
139 
140  template<typename LFSVC, typename LFSUC>
141  void add_border_pattern(false_type, const LFSVC& lfsv_cache, const LFSUC& lfsu_cache,
142  const LocalPattern& p)
143  {}
144 
145  template<typename LFSVC, typename LFSUC>
146  void add_pattern(const LFSVC& lfsv_cache, const LFSUC& lfsu_cache, const LocalPattern& p)
147  {
148  for (size_type k=0; k<p.size(); ++k)
149  local_assembler.add_entry(*pattern,
150  lfsv_cache,p[k].i(),
151  lfsu_cache,p[k].j()
152  );
153 
154  add_border_pattern(integral_constant<bool,LocalAssembler::isNonOverlapping>(),
155  lfsv_cache,
156  lfsu_cache,
157  p);
158  }
159 
160 
164  template<typename EG, typename LFSUC, typename LFSVC>
165  void onUnbindLFSUV(const EG & eg, const LFSUC & lfsu_cache, const LFSVC & lfsv_cache)
166  {
167  add_pattern(lfsv_cache,lfsu_cache,localpattern);
168  localpattern.clear();
169  }
170 
171  template<typename IG, typename LFSUC, typename LFSVC>
172  void onUnbindLFSUVOutside(const IG& ig,
173  const LFSUC& lfsu_s_cache, const LFSVC& lfsv_s_cache,
174  const LFSUC& lfsu_n_cache, const LFSVC& lfsv_n_cache)
175  {
176  add_pattern(lfsv_s_cache,lfsu_n_cache,localpattern_sn);
177  localpattern_sn.clear();
178  add_pattern(lfsv_n_cache,lfsu_s_cache,localpattern_ns);
179  localpattern_ns.clear();
180  }
181 
183 
186 
187  template<typename EG, typename LFSUC, typename LFSVC>
188  void assembleUVVolume(const EG & eg, const LFSUC & lfsu_cache, const LFSVC & lfsv_cache)
189  {
191  pattern_volume(lop,lfsu_cache.localFunctionSpace(),lfsv_cache.localFunctionSpace(),localpattern);
192  }
193 
194  template<typename IG, typename LFSUC, typename LFSVC>
195  void assembleUVSkeleton(const IG & ig, const LFSUC & lfsu_s_cache, const LFSVC & lfsv_s_cache,
196  const LFSUC & lfsu_n_cache, const LFSVC & lfsv_n_cache)
197  {
200  lfsu_s_cache.localFunctionSpace(),lfsv_s_cache.localFunctionSpace(),
201  lfsu_n_cache.localFunctionSpace(),lfsv_n_cache.localFunctionSpace(),
202  localpattern_sn, localpattern_ns);
203  }
204 
205  template<typename IG, typename LFSUC, typename LFSVC>
206  void assembleUVBoundary(const IG & ig, const LFSUC & lfsu_s_cache, const LFSVC & lfsv_s_cache)
207  {
209  pattern_boundary(lop,lfsu_s_cache.localFunctionSpace(),lfsv_s_cache.localFunctionSpace(),localpattern);
210  }
211 
212  template<typename IG, typename LFSUC, typename LFSVC>
213  static void assembleUVEnrichedCoupling(const IG & ig,
214  const LFSUC & lfsu_s_cache, const LFSVC & lfsv_s_cache,
215  const LFSUC & lfsu_n_cache, const LFSVC & lfsv_n_cache,
216  const LFSUC & lfsu_coupling_cache, const LFSVC & lfsv_coupling_cache)
217  {
218  DUNE_THROW(Dune::NotImplemented,"Assembling of coupling spaces is not implemented for ");
219  }
220 
221  template<typename IG, typename LFSVC>
222  static void assembleVEnrichedCoupling(const IG & ig,
223  const LFSVC & lfsv_s_cache,
224  const LFSVC & lfsv_n_cache,
225  const LFSVC & lfsv_coupling_cache)
226  {
227  DUNE_THROW(Dune::NotImplemented,"Assembling of coupling spaces is not implemented for ");
228  }
229 
230  template<typename EG, typename LFSUC, typename LFSVC>
231  void assembleUVVolumePostSkeleton(const EG & eg, const LFSUC & lfsu_cache, const LFSVC & lfsv_cache)
232  {
234  pattern_volume_post_skeleton(lop,lfsu_cache.localFunctionSpace(),lfsv_cache.localFunctionSpace(),localpattern);
235  }
236 
237 
238  void postAssembly(const GFSU& gfsu, const GFSV& gfsv){
239  post_border_pattern_assembly(integral_constant<bool,LocalAssembler::isNonOverlapping>(),
240  gfsu,
241  gfsv);
242  }
243 
244  void post_border_pattern_assembly(true_type, const GFSU& gfsu, const GFSV& gfsv)
245  {
246  if(local_assembler.doPostProcessing &&
247  local_assembler.reconstructBorderEntries())
248  {
249  communicationCache().finishInitialization();
250 
251  typename LA::Traits::BorderDOFExchanger::template PatternExtender<Pattern>
252  data_handle(*_border_dof_exchanger,gfsu,gfsv,*pattern);
253  gfsv.gridView().communicate(data_handle,
254  InteriorBorder_InteriorBorder_Interface,
255  ForwardCommunication);
256  }
257  }
258 
259  void post_border_pattern_assembly(false_type, const GFSU& gfsu, const GFSV& gfsv)
260  {}
261 
263 
264 
265  private:
266 
267  typename LA::Traits::BorderDOFExchanger::CommunicationCache&
268  communicationCache()
269  {
270  return _border_dof_exchanger->communicationCache();
271  }
272 
273  const typename LA::Traits::BorderDOFExchanger::CommunicationCache&
274  communicationCache() const
275  {
276  return _border_dof_exchanger->communicationCache();
277  }
278 
280  const LocalAssembler & local_assembler;
281 
283  const LOP & lop;
284 
286  Pattern * pattern;
287 
289  LocalPattern localpattern;
290  LocalPattern localpattern_sn, localpattern_ns;
291 
292  BorderPattern _border_pattern;
293 
294  shared_ptr<BorderDOFExchanger> _border_dof_exchanger;
295 
296  }; // End of class DefaultLocalPatternAssemblerEngine
297 
298  }
299 }
300 #endif
BorderDOFExchanger::BorderPattern BorderPattern
Definition: default/patternengine.hh:49
void assembleUVVolumePostSkeleton(const EG &eg, const LFSUC &lfsu_cache, const LFSVC &lfsv_cache)
Definition: default/patternengine.hh:231
static void assembleUVEnrichedCoupling(const IG &ig, const LFSUC &lfsu_s_cache, const LFSVC &lfsv_s_cache, const LFSUC &lfsu_n_cache, const LFSVC &lfsv_n_cache, const LFSUC &lfsu_coupling_cache, const LFSVC &lfsv_coupling_cache)
Definition: default/patternengine.hh:213
LFSV::Traits::GridFunctionSpace GFSV
Definition: default/patternengine.hh:45
void postAssembly(const GFSU &gfsu, const GFSV &gfsv)
Definition: default/patternengine.hh:238
LA::LFSU LFSU
The local function spaces.
Definition: default/patternengine.hh:40
const LocalAssembler::Traits::TestGridFunctionSpaceConstraints & testConstraints() const
Test space constraints.
Definition: default/patternengine.hh:85
void add_border_pattern(false_type, const LFSVC &lfsv_cache, const LFSUC &lfsu_cache, const LocalPattern &p)
Definition: default/patternengine.hh:141
void assembleUVVolume(const EG &eg, const LFSUC &lfsu_cache, const LFSVC &lfsv_cache)
Definition: default/patternengine.hh:188
LA::LFSUCache LFSUCache
Definition: default/patternengine.hh:41
bool requireUVVolume() const
Definition: default/patternengine.hh:105
const LocalAssembler::Traits::TrialGridFunctionSpaceConstraints & trialConstraints() const
Trial space constraints.
Definition: default/patternengine.hh:79
const IG & ig
Definition: constraints.hh:148
static void pattern_boundary(const LA &la, const LFSU &lfsu_s, const LFSV &lfsv_s, LocalPattern &pattern_ss)
Definition: callswitch.hh:84
bool needsConstraintsCaching(const TrialConstraintsContainer &cu, const TestConstraintsContainer &cv) const
Definition: default/patternengine.hh:28
Definition: adaptivity.hh:27
static void pattern_skeleton(const LA &la, const LFSU &lfsu_s, const LFSV &lfsv_s, const LFSU &lfsu_n, const LFSV &lfsv_n, LocalPattern &pattern_sn, LocalPattern &pattern_ns)
Definition: callswitch.hh:77
void assembleUVSkeleton(const IG &ig, const LFSUC &lfsu_s_cache, const LFSVC &lfsv_s_cache, const LFSUC &lfsu_n_cache, const LFSVC &lfsv_n_cache)
Definition: default/patternengine.hh:195
bool requireSkeleton() const
Definition: default/patternengine.hh:100
const LocalAssembler & localAssembler() const
Public access to the wrapping local assembler.
Definition: default/patternengine.hh:73
void post_border_pattern_assembly(true_type, const GFSU &gfsu, const GFSV &gfsv)
Definition: default/patternengine.hh:244
static void pattern_volume(const LA &la, const LFSU &lfsu, const LFSV &lfsv, LocalPattern &pattern)
Definition: callswitch.hh:66
void add_pattern(const LFSVC &lfsv_cache, const LFSUC &lfsu_cache, const LocalPattern &p)
Definition: default/patternengine.hh:146
void onUnbindLFSUVOutside(const IG &ig, const LFSUC &lfsu_s_cache, const LFSVC &lfsv_s_cache, const LFSUC &lfsu_n_cache, const LFSVC &lfsv_n_cache)
Definition: default/patternengine.hh:172
void post_border_pattern_assembly(false_type, const GFSU &gfsu, const GFSV &gfsv)
Definition: default/patternengine.hh:259
LA::LocalOperator LOP
The type of the local operator.
Definition: default/patternengine.hh:37
bool requireUVSkeleton() const
Definition: default/patternengine.hh:110
void onUnbindLFSUV(const EG &eg, const LFSUC &lfsu_cache, const LFSVC &lfsv_cache)
Definition: default/patternengine.hh:165
LA::LFSVCache LFSVCache
Definition: default/patternengine.hh:44
DefaultLocalPatternAssemblerEngine(const LocalAssembler &local_assembler_, shared_ptr< typename LA::Traits::BorderDOFExchanger > border_dof_exchanger)
Constructor.
Definition: default/patternengine.hh:64
LA::Traits::MatrixPattern Pattern
The type of the solution vector.
Definition: default/patternengine.hh:52
void assembleUVBoundary(const IG &ig, const LFSUC &lfsu_s_cache, const LFSVC &lfsv_s_cache)
Definition: default/patternengine.hh:206
LA::LFSV LFSV
Definition: default/patternengine.hh:43
bool requireUVVolumePostSkeleton() const
Definition: default/patternengine.hh:120
const P & p
Definition: constraints.hh:147
LA::Traits::BorderDOFExchanger BorderDOFExchanger
helper classes
Definition: default/patternengine.hh:48
LA LocalAssembler
The type of the wrapping local assembler.
Definition: default/patternengine.hh:34
Base class for LocalAssemblerEngine implementations to avoid boilerplate code.
Definition: localassemblerenginebase.hh:21
void setPattern(Pattern &pattern_)
Definition: default/patternengine.hh:92
static void pattern_volume_post_skeleton(const LA &la, const LFSU &lfsu, const LFSV &lfsv, LocalPattern &pattern)
Definition: callswitch.hh:71
The local assembler engine for DUNE grids which creates the matrix pattern.
Definition: default/patternengine.hh:22
LFSU::Traits::GridFunctionSpace GFSU
Definition: default/patternengine.hh:42
std::size_t size_type
Definition: default/patternengine.hh:56
bool requireUVBoundary() const
Definition: default/patternengine.hh:115
Layout description for a sparse linear operator.
Definition: assemblerutilities.hh:129
void add_border_pattern(true_type, const LFSVC &lfsv_cache, const LFSUC &lfsu_cache, const LocalPattern &p)
Definition: default/patternengine.hh:130
static void assembleVEnrichedCoupling(const IG &ig, const LFSVC &lfsv_s_cache, const LFSVC &lfsv_n_cache, const LFSVC &lfsv_coupling_cache)
Definition: default/patternengine.hh:222
Dune::PDELab::LocalSparsityPattern LocalPattern
Definition: default/patternengine.hh:54