dune-pdelab  2.7-git
common/assembler.hh
Go to the documentation of this file.
1 #ifndef DUNE_PDELAB_GRIDOPERATOR_COMMON_ASSEMBLER_HH
2 #define DUNE_PDELAB_GRIDOPERATOR_COMMON_ASSEMBLER_HH
3 
5 #include <assemblerutilties.hh>
6 
7 namespace Dune {
8  namespace PDELab {
9 
13 
24  public:
25  template<class LocalAssemblerEngine>
26  void assemble(LocalAssemblerEngine & local_assembler_engine);
27  };
28 
29 
35  public:
38 
41 
49  bool requireSkeleton() const;
51  bool requireUVVolume() const;
52  bool requireVVolume() const;
53  bool requireUVSkeleton() const;
54  bool requireVSkeleton() const;
55  bool requireUVBoundary() const;
56  bool requireVBoundary() const;
57  bool requireUVProcessor() const;
58  bool requireVProcessor() const;
64 
76  template<typename EG>
77  [[deprecated]] bool assembleCell(const EG & eg)
78  {
79  return false;
80  }
81 
91  template<typename EG>
92  bool skipEntity(const EG & eg);
93 
103  template<typename IG>
104  bool skipIntersection(const IG & ig);
105 
109  template<typename EG, typename LFSU, typename LFSV>
110  void assembleUVVolume(const EG & eg, const LFSU & lfsu, const LFSV & lfsv);
111 
115  template<typename EG, typename LFSV>
116  void assembleVVolume(const EG & eg, const LFSV & lfsv);
117 
121  template<typename IG, typename LFSU_S, typename LFSV_S, typename LFSU_N, typename LFSV_N>
122  void assembleUVSkeleton(const IG & ig, const LFSU_S & lfsu_s, const LFSV_S & lfsv_s,
123  const LFSU_N & lfsu_n, const LFSV_N & lfsv_n);
124 
128  template<typename IG, typename LFSV_S, typename LFSV_N>
129  void assembleVSkeleton(const IG & ig, const LFSV_S & lfsv_s, const LFSV_N & lfsv_n);
130 
134  template<typename IG, typename LFSU_S, typename LFSV_S>
135  void assembleUVBoundary(const IG & ig, const LFSU_S & lfsu_s, const LFSV_S & lfsv_s);
136 
140  template<typename IG, typename LFSV_S>
141  void assembleVBoundary(const IG & ig, const LFSV_S & lfsv_s);
142 
148  template<typename IG, typename LFSU_S, typename LFSV_S>
149  void assembleUVProcessor(const IG & ig, const LFSU_S & lfsu_s, const LFSV_S & lfsv_s);
150 
156  template<typename IG, typename LFSV_S>
157  void assembleVProcessor(const IG & ig, const LFSV_S & lfsv_s);
158 
159  template<typename IG, typename LFSU_S, typename LFSV_S, typename LFSU_N, typename LFSV_N,
160  typename LFSU_C, typename LFSV_C>
162  const LFSU_S & lfsu_s, const LFSV_S & lfsv_s,
163  const LFSU_N & lfsu_n, const LFSV_N & lfsv_n,
164  const LFSU_C & lfsu_c, const LFSV_C & lfsv_c);
165 
166  template<typename IG, typename LFSV_S, typename LFSV_N, typename LFSV_C>
167  void assembleVEnrichedCoupling(const IG & ig,
168  const LFSV_S & lfsv_s,
169  const LFSV_N & lfsv_n,
170  const LFSV_C & lfsv_c);
171 
176  template<typename EG, typename LFSU, typename LFSV>
177  void assembleUVVolumePostSkeleton(const EG & eg, const LFSU & lfsu, const LFSV & lfsv);
178 
183  template<typename EG, typename LFSV>
184  void assembleVVolumePostSkeleton(const EG & eg, const LFSV & lfsv);
185 
187  void preAssembly();
188 
190  void postAssembly();
191 
204  void onBindLFSUV(const EG & eg,
205  const LFSU_S & lfsu_s, const LFSV_S & lfsv_s);
206  void onBindLFSV(const EG & eg,
207  const LFSV_S & lfsv_s);
208  void onBindLFSUVInside(const IG & ig,
209  const LFSU_S & lfsu_s, const LFSV_S & lfsv_s);
210  void onBindLFSVInside(const IG & ig,
211  const LFSV_S & lfsv_s);
212  void onBindLFSUVOutside(const IG & ig,
213  const LFSU_S & lfsu_s, const LFSV_S & lfsv_s,
214  const LFSU_N & lfsu_n, const LFSV_N & lfsv_n);
215  void onBindLFSVOutside(const IG & ig,
216  const LFSV_S & lfsv_s,
217  const LFSV_N & lfsv_n);
218  void onBindLFSUVCoupling(const IG & ig,
219  const LFSU_S & lfsu_s, const LFSV_S & lfsv_s,
220  const LFSU_N & lfsu_n, const LFSV_N & lfsv_n
221  const LFSU_Coupling & lfsu_coupling, const LFSV_Coupling & lfsv_coupling);
222  void onBindLFSVCoupling(const IG & ig,
223  const LFSV_S & lfsv_s,
224  const LFSV_N & lfsv_n,
225  const LFSV_Coupling & lfsv_coupling);
226 
227  void onUnbindLFSUV(const EG & eg,
228  const LFSU_S & lfsu_s, const LFSV_S & lfsv_s);
229  void onUnbindLFSV(const EG & eg,
230  const LFSV_S & lfsv_s);
231  void onUnbindLFSUVInside(const IG & ig,
232  const LFSU_S & lfsu_s, const LFSV_S & lfsv_s);
233  void onUnbindLFSVInside(const IG & ig,
234  const LFSV_S & lfsv_s);
235  void onUnbindLFSUVOutside(const IG & ig,
236  const LFSU_S & lfsu_s, const LFSV_S & lfsv_s,
237  const LFSU_N & lfsu_n, const LFSV_N & lfsv_n);
238  void onUnbindLFSVOutside(const IG & ig,
239  const LFSV_S & lfsv_s,
240  const LFSV_N & lfsv_n);
241  void onUnbindLFSUVCoupling(const IG & ig,
242  const LFSU_S & lfsu_s, const LFSV_S & lfsv_s,
243  const LFSU_N & lfsu_n, const LFSV_N & lfsv_n,
244  const LFSU_Coupling & lfsu_coupling, const LFSV_Coupling & lfsv_coupling);
245  void onUnbindLFSVCoupling(const IG & ig,
246  const LFSV_S & lfsv_s,
247  const LFSV_N & lfsv_n,
248  const LFSV_Coupling & lfsv_coupling);
249 
260  void loadCoefficientsLFSUInside(const LFSU_S & lfsu_s);
261  void loadCoefficientsLFSUOutside(const LFSU_N & lfsu_n);
262  void loadCoefficientsLFSUCoupling(const LFSU_Coupling & lfsu_coupling);
275  void setSolution(const X& x);
276  void setPattern(const P& p);
277  void setJacobian(const J & j);
278  void setResidual(const R& r);
281  };
282 
294  template<typename B, typename CU, typename CV>
296  {
297  public:
298 
304  template<class TT>
305  void setTime(TT time);
306 
308  template<typename TT>
309  void preStep (TT time, TT dt, std::size_t stages);
310 
312  void postStep ();
313 
315  template<typename TT>
316  void preStage (TT time, std::size_t stage);
317 
319  void postStage ();
320 
322  template<typename TT>
323  TT suggestTimestep (TT dt) const;
324 
328  template<class RF>
329  void setWeight(RF weight);
330 
349  };
350 
364  template<typename GFSU, typename GFSV,
365  typename MB, typename DF, typename RF, typename JF>
367  public:
368 
370  typedef GridOperatorTraits
371  <GFSU,GFSV,MB,DF,RF,JF,CU,CV,AssemblerInterface,LocalAssemblerInterface> Traits;
372 
374  template<typename P>
375  void fill_pattern (P& globalpattern) const;
376 
379  template<typename X, typename R>
380  void residual (const X& x, R& r) const;
381 
384  template<typename X, typename A>
385  void jacobian (const X& x, A& a) const;
386 
389  Assembler & assembler();
392 
395  const GFSU& trialGridFunctionSpace() const;
396  const GFSV& testGridFunctionSpace() const;
397  typename GFSU::Traits::SizeType globalSizeU () const;
398  typename GFSV::Traits::SizeType globalSizeV () const;
400 
402 
408  template<typename F>
409  void interpolate(const typename Traits::Domain& xold,
410  const F& f,
411  typename Traits::Domain& xnew);
412 
417 
432  template<typename GridOperatorTuple>
433  static void setupGridOperators(GridOperatorTuple& tuple);
434 
435  };
437  };
438 };
439 
542 #endif // DUNE_PDELAB_GRIDOPERATOR_COMMON_ASSEMBLER_HH
const P & p
Definition: constraints.hh:148
const IG & ig
Definition: constraints.hh:149
For backward compatibility – Do not use this!
Definition: adaptivity.hh:28
The global assembler which performs the traversing of the integration parts.
Definition: common/assembler.hh:23
void assemble(LocalAssemblerEngine &local_assembler_engine)
The local assembler engine which handles the integration parts as provided by the global assemblers.
Definition: common/assembler.hh:34
void onUnbindLFSV(const EG &eg, const LFSV_S &lfsv_s)
void assembleUVVolume(const EG &eg, const LFSU &lfsu, const LFSV &lfsv)
void onBindLFSUV(const EG &eg, const LFSU_S &lfsu_s, const LFSV_S &lfsv_s)
void assembleVSkeleton(const IG &ig, const LFSV_S &lfsv_s, const LFSV_N &lfsv_n)
void onBindLFSUVCoupling(const IG &ig, const LFSU_S &lfsu_s, const LFSV_S &lfsv_s, const LFSU_N &lfsu_n, const LFSV_N &lfsv_n const LFSU_Coupling &lfsu_coupling, const LFSV_Coupling &lfsv_coupling)
void assembleUVProcessor(const IG &ig, const LFSU_S &lfsu_s, const LFSV_S &lfsv_s)
bool skipIntersection(const IG &ig)
void assembleUVSkeleton(const IG &ig, const LFSU_S &lfsu_s, const LFSV_S &lfsv_s, const LFSU_N &lfsu_n, const LFSV_N &lfsv_n)
void loadCoefficientsLFSUCoupling(const LFSU_Coupling &lfsu_coupling)
void loadCoefficientsLFSUInside(const LFSU_S &lfsu_s)
void assembleVProcessor(const IG &ig, const LFSV_S &lfsv_s)
void assembleVEnrichedCoupling(const IG &ig, const LFSV_S &lfsv_s, const LFSV_N &lfsv_n, const LFSV_C &lfsv_c)
void onUnbindLFSUVInside(const IG &ig, const LFSU_S &lfsu_s, const LFSV_S &lfsv_s)
void onUnbindLFSVInside(const IG &ig, const LFSV_S &lfsv_s)
void onBindLFSVCoupling(const IG &ig, const LFSV_S &lfsv_s, const LFSV_N &lfsv_n, const LFSV_Coupling &lfsv_coupling)
void preAssembly()
Called directly before assembling.
void assembleVVolumePostSkeleton(const EG &eg, const LFSV &lfsv)
void onUnbindLFSVCoupling(const IG &ig, const LFSV_S &lfsv_s, const LFSV_N &lfsv_n, const LFSV_Coupling &lfsv_coupling)
bool assembleCell(const EG &eg)
Deprecated. Use skipEntity instead.
Definition: common/assembler.hh:77
void assembleUVVolumePostSkeleton(const EG &eg, const LFSU &lfsu, const LFSV &lfsv)
void onUnbindLFSUVOutside(const IG &ig, const LFSU_S &lfsu_s, const LFSV_S &lfsv_s, const LFSU_N &lfsu_n, const LFSV_N &lfsv_n)
void assembleVBoundary(const IG &ig, const LFSV_S &lfsv_s)
void onBindLFSV(const EG &eg, const LFSV_S &lfsv_s)
void onBindLFSVOutside(const IG &ig, const LFSV_S &lfsv_s, const LFSV_N &lfsv_n)
LocalAssemblerInterface LocalAssembler
The type of the local assembler.
Definition: common/assembler.hh:37
void onUnbindLFSUV(const EG &eg, const LFSU_S &lfsu_s, const LFSV_S &lfsv_s)
void assembleVVolume(const EG &eg, const LFSV &lfsv)
void onBindLFSVInside(const IG &ig, const LFSV_S &lfsv_s)
void assembleUVEnrichedCoupling(const IG &ig, const LFSU_S &lfsu_s, const LFSV_S &lfsv_s, const LFSU_N &lfsu_n, const LFSV_N &lfsv_n, const LFSU_C &lfsu_c, const LFSV_C &lfsv_c)
void onUnbindLFSVOutside(const IG &ig, const LFSV_S &lfsv_s, const LFSV_N &lfsv_n)
void postAssembly()
Called last thing after assembling.
const LocalAssembler & localAssembler()
Access to the superior local assembler object.
void assembleUVBoundary(const IG &ig, const LFSU_S &lfsu_s, const LFSV_S &lfsv_s)
void onBindLFSUVOutside(const IG &ig, const LFSU_S &lfsu_s, const LFSV_S &lfsv_s, const LFSU_N &lfsu_n, const LFSV_N &lfsv_n)
void loadCoefficientsLFSUOutside(const LFSU_N &lfsu_n)
void onBindLFSUVInside(const IG &ig, const LFSU_S &lfsu_s, const LFSV_S &lfsv_s)
void onUnbindLFSUVCoupling(const IG &ig, const LFSU_S &lfsu_s, const LFSV_S &lfsv_s, const LFSU_N &lfsu_n, const LFSV_N &lfsv_n, const LFSU_Coupling &lfsu_coupling, const LFSV_Coupling &lfsv_coupling)
The local assembler which provides the engines that drive the global assembler.
Definition: common/assembler.hh:296
void preStep(TT time, TT dt, std::size_t stages)
Notify local assembler about upcoming time step.
void setWeight(RF weight)
Set current weight of assembling.
LocalResidualAssemblerEngine & localResidualAssemblerEngine(R &r, const X &x)
LocalJacobianAssemblerEngine & localJacobianAssemblerEngine(A &a, const X &x)
LocalResidualJacobianAssemblerEngine & localResidualJacobianAssemblerEngine(R &r, A &a, const X &x)
LocalPatternAssemblerEngine & localPatternAssemblerEngine(P &p)
void postStage()
Notify local assembler about completion of time step stage.
void postStep()
Notify local assembler about completion of time step.
void preStage(TT time, std::size_t stage)
Notify local assembler about upcoming time step stage.
void setTime(TT time)
Set current time of assembling.
TT suggestTimestep(TT dt) const
Suggest a valid time step size.
The grid operator represents an operator mapping which corresponds to the (possibly nonlinear) algebr...
Definition: common/assembler.hh:366
const GFSU & trialGridFunctionSpace() const
GridOperatorTraits< GFSU, GFSV, MB, DF, RF, JF, CU, CV, AssemblerInterface, LocalAssemblerInterface > Traits
The traits class.
Definition: common/assembler.hh:371
void interpolate(const typename Traits::Domain &xold, const F &f, typename Traits::Domain &xnew)
Interpolate xnew from f, taking unconstrained values from xold.
GFSV::Traits::SizeType globalSizeV() const
GFSU::Traits::SizeType globalSizeU() const
void residual(const X &x, R &r) const
const GFSV & testGridFunctionSpace() const
static void setupGridOperators(GridOperatorTuple &tuple)
LocalAssemblerInterface & localAssembler()
void jacobian(const X &x, A &a) const
void fill_pattern(P &globalpattern) const
Determines the sparsity pattern of the jacobian matrix.
Base class for local assembler.
Definition: assemblerutilities.hh:217
Traits class for the grid operator.
Definition: gridoperatorutilities.hh:34
Dune::PDELab::Backend::Vector< GFSU, DF > Domain
The type of the domain (solution).
Definition: gridoperatorutilities.hh:58