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