dune-pdelab  2.0.0
onestep/residualengine.hh
Go to the documentation of this file.
1 #ifndef DUNE_ONE_STEP_RESIDUALENGINE_HH
2 #define DUNE_ONE_STEP_RESIDUALENGINE_HH
3 
5 
6 #include <cmath>
7 
8 namespace Dune{
9  namespace PDELab{
10 
18  template<typename OSLA>
20  : public OneStepLocalAssemblerEngineBase<OSLA,
21  typename OSLA::LocalAssemblerDT0::LocalResidualAssemblerEngine,
22  typename OSLA::LocalAssemblerDT1::LocalResidualAssemblerEngine
23  >
24  {
25 
27  typename OSLA::LocalAssemblerDT0::LocalResidualAssemblerEngine,
28  typename OSLA::LocalAssemblerDT1::LocalResidualAssemblerEngine
29  > BaseT;
30 
31  using BaseT::la;
32  using BaseT::lae0;
33  using BaseT::lae1;
34  using BaseT::implicit;
37 
38  public:
40  typedef OSLA OneStepLocalAssembler;
41 
44  typedef typename OSLA::LocalAssemblerDT0 LocalAssemblerDT0;
45  typedef typename OSLA::LocalAssemblerDT1 LocalAssemblerDT1;
46 
47  typedef typename LocalAssemblerDT0::LocalResidualAssemblerEngine ResidualEngineDT0;
48  typedef typename LocalAssemblerDT1::LocalResidualAssemblerEngine ResidualEngineDT1;
50 
52  typedef typename OSLA::Traits::Residual Residual;
53 
55  typedef typename OSLA::Traits::Solution Solution;
56 
58  typedef typename OSLA::Real Real;
59 
60  typedef OSLA LocalAssembler;
61 
69  : BaseT(local_assembler_),
70  invalid_residual(static_cast<Residual*>(0)),
71  invalid_solution(static_cast<Solution*>(0)),
72  residual_0(invalid_residual),
73  residual_1(invalid_residual),
74  const_residual_0(invalid_residual),
75  const_residual_1(invalid_residual),
76  solution(invalid_solution)
77  {}
78 
81  void setSolution(const Solution & solution_){
82  solution = &solution_;
83  }
84 
87  void setConstResidual(const Residual &const_residual_){
88  const_residual_0 = &const_residual_;
89  const_residual_1 = &const_residual_;
90  }
91 
94  void setResidual(Residual & residual_){
95  residual_0 = &residual_;
96  residual_1 = &residual_;
97 
98  // Initialize the engines of the two wrapped local assemblers
99  assert(solution != invalid_solution);
100  setLocalAssemblerEngineDT0(la.la0.localResidualAssemblerEngine(*residual_0,*solution));
101  setLocalAssemblerEngineDT1(la.la1.localResidualAssemblerEngine(*residual_1,*solution));
102  }
103 
108  void setConstResiduals(const Residual &const_residual_0_, const Residual &const_residual_1_){
109  const_residual_0 = &const_residual_0_;
110  const_residual_1 = &const_residual_1_;
111  }
112 
117  void setResiduals(Residual & residual_0_, Residual & residual_1_){
118  residual_0 = &residual_0_;
119  residual_1 = &residual_1_;
120 
121  // Initialize the engines of the two wrapped local assemblers
122  assert(solution != invalid_solution);
123  setLocalAssemblerEngineDT0(la.la0.localResidualAssemblerEngine(*residual_0,*solution));
124  setLocalAssemblerEngineDT1(la.la1.localResidualAssemblerEngine(*residual_1,*solution));
125  }
126 
130  void setWeights(){
131  la.la0.setWeight(b_rr * la.dt_factor0);
132  la.la1.setWeight(la.dt_factor1);
133  }
134 
137  void preAssembly()
138  {
139  lae0->preAssembly();
140  lae1->preAssembly();
141 
142  // Extract the coefficients of the time step scheme
143  b_rr = la.osp_method->b(la.stage,la.stage);
144  d_r = la.osp_method->d(la.stage);
145  implicit = std::abs(b_rr) > 1e-6;
146 
147  // prepare local operators for stage
148  la.la0.setTime(la.time + d_r * la.dt);
149  la.la1.setTime(la.time + d_r * la.dt);
150 
151  setWeights();
152  }
153 
154  template<typename GFSU, typename GFSV>
155  void postAssembly(const GFSU& gfsu, const GFSV& gfsv){
156 
157  // Update residual vectors with constant part
158  assert(const_residual_0 != invalid_residual);
159  assert(const_residual_1 != invalid_residual);
160  *residual_0 += *const_residual_0;
161  if(residual_0 != residual_1){
162  assert(const_residual_0 != const_residual_1);
163  *residual_1 += *const_residual_1;
164  }
165 
166  lae0->postAssembly(gfsu,gfsv);
167  lae1->postAssembly(gfsu,gfsv);
168  }
170 
171 
172  private:
173 
175  Residual * const invalid_residual;
176 
178  Solution * const invalid_solution;
179 
184  Residual * residual_0;
185  Residual * residual_1;
187 
192  const Residual * const_residual_0;
193  const Residual * const_residual_1;
195 
197  const Solution * solution;
198 
200  Real b_rr, d_r;
201 
202  }; // End of class OneStepLocalResidualAssemblerEngine
203 
204  }
205 }
206 
207 #endif
void setLocalAssemblerEngineDT1(LocalAssemblerEngineDT1 &lae1_)
Definition: enginebase.hh:121
LocalAssemblerDT1::LocalResidualAssemblerEngine ResidualEngineDT1
Definition: onestep/residualengine.hh:48
LocalAssemblerDT0::LocalResidualAssemblerEngine ResidualEngineDT0
Definition: onestep/residualengine.hh:47
OSLA LocalAssembler
Definition: onestep/residualengine.hh:60
LocalAssemblerEngineDT0 * lae0
Definition: enginebase.hh:439
OSLA OneStepLocalAssembler
The type of the wrapping local assembler.
Definition: onestep/residualengine.hh:40
const LocalAssembler & la
Definition: enginebase.hh:437
void setConstResidual(const Residual &const_residual_)
Definition: onestep/residualengine.hh:87
void setResidual(Residual &residual_)
Definition: onestep/residualengine.hh:94
OSLA::Traits::Residual Residual
The type of the residual vector.
Definition: onestep/residualengine.hh:52
void setWeights()
Definition: onestep/residualengine.hh:130
The local assembler engine for UDG sub triangulations which assembles the residual vector...
Definition: enginebase.hh:15
void preAssembly()
Definition: onestep/residualengine.hh:137
LocalAssemblerEngineDT1 * lae1
Definition: enginebase.hh:440
OSLA::LocalAssemblerDT1 LocalAssemblerDT1
Definition: onestep/residualengine.hh:45
void postAssembly(const GFSU &gfsu, const GFSV &gfsv)
Definition: onestep/residualengine.hh:155
OSLA::Real Real
The type for real numbers.
Definition: onestep/residualengine.hh:58
OneStepLocalResidualAssemblerEngine(const LocalAssembler &local_assembler_)
Constructor.
Definition: onestep/residualengine.hh:68
void setResiduals(Residual &residual_0_, Residual &residual_1_)
Definition: onestep/residualengine.hh:117
OSLA::Traits::Solution Solution
The type of the solution vector.
Definition: onestep/residualengine.hh:55
bool implicit
Definition: enginebase.hh:442
void setSolution(const Solution &solution_)
Definition: onestep/residualengine.hh:81
const E & e
Definition: interpolate.hh:172
OSLA::LocalAssemblerDT0 LocalAssemblerDT0
Definition: onestep/residualengine.hh:44
void setLocalAssemblerEngineDT0(LocalAssemblerEngineDT0 &lae0_)
Definition: enginebase.hh:116
void setConstResiduals(const Residual &const_residual_0_, const Residual &const_residual_1_)
Definition: onestep/residualengine.hh:108
The local assembler engine for one step methods which assembles the residual vector.
Definition: onestep/residualengine.hh:19