dune-pdelab  2.5-dev
onestep/residualengine.hh
Go to the documentation of this file.
1 #ifndef DUNE_PDELAB_GRIDOPERATOR_ONESTEP_RESIDUALENGINE_HH
2 #define DUNE_PDELAB_GRIDOPERATOR_ONESTEP_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 
68  OneStepLocalResidualAssemblerEngine(const LocalAssembler & local_assembler_)
69  : BaseT(local_assembler_)
70  , invalid_residual(nullptr)
71  , invalid_solution(nullptr)
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  {
83  solution = &solution_;
84  }
85 
88  void setConstResidual(const Residual &const_residual_)
89  {
90  const_residual_0 = &const_residual_;
91  const_residual_1 = &const_residual_;
92  }
93 
96  void setResidual(Residual & residual_)
97  {
98  residual_0 = &residual_;
99  residual_1 = &residual_;
100 
101  // Initialize the engines of the two wrapped local assemblers
102  assert(solution != invalid_solution);
103  setLocalAssemblerEngineDT0(la.la0.localResidualAssemblerEngine(*residual_0,*solution));
104  setLocalAssemblerEngineDT1(la.la1.localResidualAssemblerEngine(*residual_1,*solution));
105  }
106 
111  void setConstResiduals(const Residual &const_residual_0_, const Residual &const_residual_1_)
112  {
113  const_residual_0 = &const_residual_0_;
114  const_residual_1 = &const_residual_1_;
115  }
116 
121  void setResiduals(Residual & residual_0_, Residual & residual_1_)
122  {
123  residual_0 = &residual_0_;
124  residual_1 = &residual_1_;
125 
126  // Initialize the engines of the two wrapped local assemblers
127  assert(solution != invalid_solution);
128  setLocalAssemblerEngineDT0(la.la0.localResidualAssemblerEngine(*residual_0,*solution));
129  setLocalAssemblerEngineDT1(la.la1.localResidualAssemblerEngine(*residual_1,*solution));
130  }
131 
135  void setWeights()
136  {
137  la.la0.setWeight(b_rr * la.dt_factor0);
138  la.la1.setWeight(la.dt_factor1);
139  }
140 
143  void preAssembly()
144  {
145  lae0->preAssembly();
146  lae1->preAssembly();
147 
148  // Extract the coefficients of the time step scheme
149  b_rr = la.osp_method->b(la.stage,la.stage);
150  d_r = la.osp_method->d(la.stage);
151  implicit = std::abs(b_rr) > 1e-6;
152 
153  // prepare local operators for stage
154  la.la0.setTime(la.time + d_r * la.dt);
155  la.la1.setTime(la.time + d_r * la.dt);
156 
157  setWeights();
158  }
159 
160  template<typename GFSU, typename GFSV>
161  void postAssembly(const GFSU& gfsu, const GFSV& gfsv)
162  {
163 
164  // Update residual vectors with constant part
165  assert(const_residual_0 != invalid_residual);
166  assert(const_residual_1 != invalid_residual);
167  *residual_0 += *const_residual_0;
168  if(residual_0 != residual_1){
169  assert(const_residual_0 != const_residual_1);
170  *residual_1 += *const_residual_1;
171  }
172 
173  lae0->postAssembly(gfsu,gfsv);
174  lae1->postAssembly(gfsu,gfsv);
175  }
177 
178 
179  private:
180 
182  Residual * const invalid_residual;
183 
185  Solution * const invalid_solution;
186 
191  Residual * residual_0;
192  Residual * residual_1;
194 
199  const Residual * const_residual_0;
200  const Residual * const_residual_1;
202 
204  const Solution * solution;
205 
207  Real b_rr, d_r;
208 
209  }; // End of class OneStepLocalResidualAssemblerEngine
210 
211  }
212 }
213 
214 #endif // DUNE_PDELAB_GRIDOPERATOR_ONESTEP_RESIDUALENGINE_HH
void setConstResidual(const Residual &const_residual_)
Definition: onestep/residualengine.hh:88
The local assembler engine for one step methods which assembles the residual vector.
Definition: onestep/residualengine.hh:19
const Entity & e
Definition: localfunctionspace.hh:111
LocalAssemblerDT0::LocalResidualAssemblerEngine ResidualEngineDT0
Definition: onestep/residualengine.hh:47
void setLocalAssemblerEngineDT1(LocalAssemblerEngineDT1 &lae1_)
Definition: enginebase.hh:119
const LocalAssembler & la
Definition: enginebase.hh:454
OSLA::Real Real
The type for real numbers.
Definition: onestep/residualengine.hh:58
The local assembler engine for UDG sub triangulations which assembles the residual vector...
Definition: enginebase.hh:15
OneStepLocalResidualAssemblerEngine(const LocalAssembler &local_assembler_)
Constructor.
Definition: onestep/residualengine.hh:68
OSLA::LocalAssemblerDT0 LocalAssemblerDT0
Definition: onestep/residualengine.hh:44
void setResiduals(Residual &residual_0_, Residual &residual_1_)
Definition: onestep/residualengine.hh:121
OSLA::Traits::Residual Residual
The type of the residual vector.
Definition: onestep/residualengine.hh:52
void setSolution(const Solution &solution_)
Definition: onestep/residualengine.hh:81
void setLocalAssemblerEngineDT0(LocalAssemblerEngineDT0 &lae0_)
Definition: enginebase.hh:114
void setWeights()
Definition: onestep/residualengine.hh:135
bool implicit
Definition: enginebase.hh:459
void setConstResiduals(const Residual &const_residual_0_, const Residual &const_residual_1_)
Definition: onestep/residualengine.hh:111
For backward compatibility – Do not use this!
Definition: adaptivity.hh:27
OSLA OneStepLocalAssembler
The type of the wrapping local assembler.
Definition: onestep/residualengine.hh:40
OSLA::Traits::Solution Solution
The type of the solution vector.
Definition: onestep/residualengine.hh:55
LocalAssemblerEngineDT0 * lae0
Definition: enginebase.hh:456
LocalAssemblerEngineDT1 * lae1
Definition: enginebase.hh:457
LocalAssemblerDT1::LocalResidualAssemblerEngine ResidualEngineDT1
Definition: onestep/residualengine.hh:48
void setResidual(Residual &residual_)
Definition: onestep/residualengine.hh:96
void preAssembly()
Definition: onestep/residualengine.hh:143
OSLA::LocalAssemblerDT1 LocalAssemblerDT1
Definition: onestep/residualengine.hh:45
void postAssembly(const GFSU &gfsu, const GFSV &gfsv)
Definition: onestep/residualengine.hh:161
OSLA LocalAssembler
Definition: onestep/residualengine.hh:60