dune-pdelab  2.5-dev
fastdg/patternengine.hh
Go to the documentation of this file.
1 #ifndef DUNE_PDELAB_GRIDOPERATOR_FASTDG_PATTERNENGINE_HH
2 #define DUNE_PDELAB_GRIDOPERATOR_FASTDG_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  FastDGLocalPatternAssemblerEngine(const LocalAssembler & local_assembler_,
65  shared_ptr<typename LA::Traits::BorderDOFExchanger> border_dof_exchanger)
66  : local_assembler(local_assembler_)
67  , lop(local_assembler.localOperator())
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 
125  auto partition() const
126  {
127  return Partitions::all;
128  }
129 
131 
133 
134  template<typename LFSVC, typename LFSUC>
135  void add_border_pattern(std::true_type, const LFSVC& lfsv_cache, const LFSUC& lfsu_cache,
136  const LocalPattern& p)
137  {
138  if (local_assembler.reconstructBorderEntries() &&
139  !communicationCache().initialized())
140  {
141  communicationCache().addEntries(lfsv_cache,lfsu_cache,p);
142  }
143  }
144 
145  template<typename LFSVC, typename LFSUC>
146  void add_border_pattern(std::false_type, const LFSVC& lfsv_cache, const LFSUC& lfsu_cache,
147  const LocalPattern& p)
148  {}
149 
150  template<typename LFSVC, typename LFSUC>
151  void add_pattern(const LFSVC& lfsv_cache, const LFSUC& lfsu_cache, const LocalPattern& p)
152  {
153  for (size_type k=0; k<p.size(); ++k)
154  local_assembler.add_entry(*pattern,
155  lfsv_cache,p[k].i(),
156  lfsu_cache,p[k].j()
157  );
158 
159  add_border_pattern(std::integral_constant<bool,LocalAssembler::isNonOverlapping>(),
160  lfsv_cache,
161  lfsu_cache,
162  p);
163  }
164 
165 
169  template<typename EG, typename LFSUC, typename LFSVC>
170  void onUnbindLFSUV(const EG & eg, const LFSUC & lfsu_cache, const LFSVC & lfsv_cache)
171  {
172  add_pattern(lfsv_cache,lfsu_cache,localpattern);
173  localpattern.clear();
174  }
175 
176  template<typename IG, typename LFSUC, typename LFSVC>
177  void onUnbindLFSUVOutside(const IG& ig,
178  const LFSUC& lfsu_s_cache, const LFSVC& lfsv_s_cache,
179  const LFSUC& lfsu_n_cache, const LFSVC& lfsv_n_cache)
180  {
181  add_pattern(lfsv_s_cache,lfsu_n_cache,localpattern_sn);
182  localpattern_sn.clear();
183  add_pattern(lfsv_n_cache,lfsu_s_cache,localpattern_ns);
184  localpattern_ns.clear();
185  }
186 
188 
191 
192  template<typename EG, typename LFSUC, typename LFSVC>
193  void assembleUVVolume(const EG & eg, const LFSUC & lfsu_cache, const LFSVC & lfsv_cache)
194  {
196  pattern_volume(lop,lfsu_cache.localFunctionSpace(),lfsv_cache.localFunctionSpace(),localpattern);
197  }
198 
199  template<typename IG, typename LFSUC, typename LFSVC>
200  void assembleUVSkeleton(const IG & ig, const LFSUC & lfsu_s_cache, const LFSVC & lfsv_s_cache,
201  const LFSUC & lfsu_n_cache, const LFSVC & lfsv_n_cache)
202  {
205  lfsu_s_cache.localFunctionSpace(),lfsv_s_cache.localFunctionSpace(),
206  lfsu_n_cache.localFunctionSpace(),lfsv_n_cache.localFunctionSpace(),
207  localpattern_sn, localpattern_ns);
208  }
209 
210  template<typename IG, typename LFSUC, typename LFSVC>
211  void assembleUVBoundary(const IG & ig, const LFSUC & lfsu_s_cache, const LFSVC & lfsv_s_cache)
212  {
214  pattern_boundary(lop,lfsu_s_cache.localFunctionSpace(),lfsv_s_cache.localFunctionSpace(),localpattern);
215  }
216 
217  template<typename IG, typename LFSUC, typename LFSVC>
218  static void assembleUVEnrichedCoupling(const IG & ig,
219  const LFSUC & lfsu_s_cache, const LFSVC & lfsv_s_cache,
220  const LFSUC & lfsu_n_cache, const LFSVC & lfsv_n_cache,
221  const LFSUC & lfsu_coupling_cache, const LFSVC & lfsv_coupling_cache)
222  {
223  DUNE_THROW(Dune::NotImplemented,"Assembling of coupling spaces is not implemented for ");
224  }
225 
226  template<typename IG, typename LFSVC>
227  static void assembleVEnrichedCoupling(const IG & ig,
228  const LFSVC & lfsv_s_cache,
229  const LFSVC & lfsv_n_cache,
230  const LFSVC & lfsv_coupling_cache)
231  {
232  DUNE_THROW(Dune::NotImplemented,"Assembling of coupling spaces is not implemented for ");
233  }
234 
235  template<typename EG, typename LFSUC, typename LFSVC>
236  void assembleUVVolumePostSkeleton(const EG & eg, const LFSUC & lfsu_cache, const LFSVC & lfsv_cache)
237  {
239  pattern_volume_post_skeleton(lop,lfsu_cache.localFunctionSpace(),lfsv_cache.localFunctionSpace(),localpattern);
240  }
241 
242 
243  void postAssembly(const GFSU& gfsu, const GFSV& gfsv){
244  post_border_pattern_assembly(std::integral_constant<bool,LocalAssembler::isNonOverlapping>(),
245  gfsu,
246  gfsv);
247  }
248 
249  void post_border_pattern_assembly(std::true_type, const GFSU& gfsu, const GFSV& gfsv)
250  {
251  if(local_assembler.doPostProcessing() &&
252  local_assembler.reconstructBorderEntries())
253  {
254  communicationCache().finishInitialization();
255 
256  typename LA::Traits::BorderDOFExchanger::template PatternExtender<Pattern>
257  data_handle(*_border_dof_exchanger,gfsu,gfsv,*pattern);
258  gfsv.gridView().communicate(data_handle,
259  InteriorBorder_InteriorBorder_Interface,
260  ForwardCommunication);
261  }
262  }
263 
264  void post_border_pattern_assembly(std::false_type, const GFSU& gfsu, const GFSV& gfsv)
265  {}
266 
268 
269 
270  private:
271 
272  typename LA::Traits::BorderDOFExchanger::CommunicationCache&
273  communicationCache()
274  {
275  return _border_dof_exchanger->communicationCache();
276  }
277 
278  const typename LA::Traits::BorderDOFExchanger::CommunicationCache&
279  communicationCache() const
280  {
281  return _border_dof_exchanger->communicationCache();
282  }
283 
285  const LocalAssembler & local_assembler;
286 
288  const LOP & lop;
289 
291  Pattern * pattern;
292 
294  LocalPattern localpattern;
295  LocalPattern localpattern_sn, localpattern_ns;
296 
297  BorderPattern _border_pattern;
298 
299  shared_ptr<BorderDOFExchanger> _border_dof_exchanger;
300 
301  }; // End of class FastDGLocalPatternAssemblerEngine
302 
303  }
304 }
305 #endif
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: fastdg/patternengine.hh:218
bool requireUVVolumePostSkeleton() const
Definition: fastdg/patternengine.hh:120
LA::Traits::MatrixPattern Pattern
The type of the solution vector.
Definition: fastdg/patternengine.hh:52
void assembleUVBoundary(const IG &ig, const LFSUC &lfsu_s_cache, const LFSVC &lfsv_s_cache)
Definition: fastdg/patternengine.hh:211
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: fastdg/patternengine.hh:177
void onUnbindLFSUV(const EG &eg, const LFSUC &lfsu_cache, const LFSVC &lfsv_cache)
Definition: fastdg/patternengine.hh:170
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: fastdg/patternengine.hh:200
const LocalAssembler & localAssembler() const
Public access to the wrapping local assembler.
Definition: fastdg/patternengine.hh:73
void add_border_pattern(std::false_type, const LFSVC &lfsv_cache, const LFSUC &lfsu_cache, const LocalPattern &p)
Definition: fastdg/patternengine.hh:146
LFSU::Traits::GridFunctionSpace GFSU
Definition: fastdg/patternengine.hh:42
The fast DG local assembler engine for DUNE grids which creates the matrix pattern.
Definition: fastdg/patternengine.hh:22
static void pattern_volume(const LA &la, const LFSU &lfsu, const LFSV &lfsv, LocalPattern &pattern)
Definition: callswitch.hh:67
void assembleUVVolume(const EG &eg, const LFSUC &lfsu_cache, const LFSVC &lfsv_cache)
Definition: fastdg/patternengine.hh:193
Base class for LocalAssemblerEngine implementations to avoid boilerplate code.
Definition: localassemblerenginebase.hh:21
BorderDOFExchanger::BorderPattern BorderPattern
Definition: fastdg/patternengine.hh:49
LA::LFSVCache LFSVCache
Definition: fastdg/patternengine.hh:44
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:78
Dune::PDELab::LocalSparsityPattern LocalPattern
Definition: fastdg/patternengine.hh:54
static void assembleVEnrichedCoupling(const IG &ig, const LFSVC &lfsv_s_cache, const LFSVC &lfsv_n_cache, const LFSVC &lfsv_coupling_cache)
Definition: fastdg/patternengine.hh:227
LA LocalAssembler
The type of the wrapping local assembler.
Definition: fastdg/patternengine.hh:34
bool requireSkeleton() const
Definition: fastdg/patternengine.hh:100
For backward compatibility – Do not use this!
Definition: adaptivity.hh:28
LA::Traits::BorderDOFExchanger BorderDOFExchanger
helper classes
Definition: fastdg/patternengine.hh:48
const LocalAssembler::Traits::TrialGridFunctionSpaceConstraints & trialConstraints() const
Trial space constraints.
Definition: fastdg/patternengine.hh:79
bool requireUVBoundary() const
Definition: fastdg/patternengine.hh:115
static void pattern_volume_post_skeleton(const LA &la, const LFSU &lfsu, const LFSV &lfsv, LocalPattern &pattern)
Definition: callswitch.hh:72
void postAssembly(const GFSU &gfsu, const GFSV &gfsv)
Definition: fastdg/patternengine.hh:243
LA::LFSV LFSV
Definition: fastdg/patternengine.hh:43
std::size_t size_type
Definition: fastdg/patternengine.hh:56
bool requireUVSkeleton() const
Definition: fastdg/patternengine.hh:110
const IG & ig
Definition: constraints.hh:148
auto partition() const
Definition: fastdg/patternengine.hh:125
FastDGLocalPatternAssemblerEngine(const LocalAssembler &local_assembler_, shared_ptr< typename LA::Traits::BorderDOFExchanger > border_dof_exchanger)
Constructor.
Definition: fastdg/patternengine.hh:64
LFSV::Traits::GridFunctionSpace GFSV
Definition: fastdg/patternengine.hh:45
static void pattern_boundary(const LA &la, const LFSU &lfsu_s, const LFSV &lfsv_s, LocalPattern &pattern_ss)
Definition: callswitch.hh:85
LA::LFSUCache LFSUCache
Definition: fastdg/patternengine.hh:41
void add_border_pattern(std::true_type, const LFSVC &lfsv_cache, const LFSUC &lfsu_cache, const LocalPattern &p)
Definition: fastdg/patternengine.hh:135
void add_pattern(const LFSVC &lfsv_cache, const LFSUC &lfsu_cache, const LocalPattern &p)
Definition: fastdg/patternengine.hh:151
LA::LocalOperator LOP
The type of the local operator.
Definition: fastdg/patternengine.hh:37
Layout description for a sparse linear operator.
Definition: assemblerutilities.hh:129
void assembleUVVolumePostSkeleton(const EG &eg, const LFSUC &lfsu_cache, const LFSVC &lfsv_cache)
Definition: fastdg/patternengine.hh:236
const LocalAssembler::Traits::TestGridFunctionSpaceConstraints & testConstraints() const
Test space constraints.
Definition: fastdg/patternengine.hh:85
void post_border_pattern_assembly(std::true_type, const GFSU &gfsu, const GFSV &gfsv)
Definition: fastdg/patternengine.hh:249
bool needsConstraintsCaching(const TrialConstraintsContainer &cu, const TestConstraintsContainer &cv) const
Definition: fastdg/patternengine.hh:28
const P & p
Definition: constraints.hh:147
void post_border_pattern_assembly(std::false_type, const GFSU &gfsu, const GFSV &gfsv)
Definition: fastdg/patternengine.hh:264
LA::LFSU LFSU
The local function spaces.
Definition: fastdg/patternengine.hh:40
void setPattern(Pattern &pattern_)
Definition: fastdg/patternengine.hh:92
bool requireUVVolume() const
Definition: fastdg/patternengine.hh:105