dune-pdelab  2.5-dev
numericalresidual.hh
Go to the documentation of this file.
1 // -*- tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*-
2 // vi: set et ts=8 sw=2 sts=2:
3 #ifndef DUNE_PDELAB_LOCALOPERATOR_NUMERICALRESIDUAL_HH
4 #define DUNE_PDELAB_LOCALOPERATOR_NUMERICALRESIDUAL_HH
5 
6 #include <cmath>
7 
10 
11 namespace Dune {
12  namespace PDELab {
13 
17 
19  //
20  // Implementation of alpha_*() in terms of jacobian_*()
21  //
22 
24 
34  template<typename Imp>
36  {
37  public:
38 
40  template<typename EG, typename LFSU, typename X, typename LFSV,
41  typename R>
42  void alpha_volume
43  ( const EG& eg,
44  const LFSU& lfsu, const X& x, const LFSV& lfsv,
45  R& r) const
46  {
47  typedef LocalMatrix<typename R::value_type> Jacobian;
48  typedef typename Jacobian::WeightedAccumulationView JacobianView;
49 
50  Jacobian mat(r.size(),x.size(), 0);
51  JacobianView matview = mat.weightedAccumulationView(1.0);
52  asImp().jacobian_volume(eg, lfsu, x, lfsv, matview);
53  // we need to include the weight here, as umv() and usmv() operate on the bare container for effiency
54  mat.usmv(r.weight(),x,r);
55  }
56 
57  private:
58  Imp& asImp () { return static_cast<Imp &> (*this); }
59  const Imp& asImp () const { return static_cast<const Imp &>(*this); }
60  };
61 
63 
73  template<typename Imp>
75  {
76  public:
77 
79  template<typename IG, typename LFSU, typename X, typename LFSV,
80  typename R>
81  void alpha_skeleton
82  ( const IG& ig,
83  const LFSU& lfsu_s, const X& x_s, const LFSV& lfsv_s,
84  const LFSU& lfsu_n, const X& x_n, const LFSV& lfsv_n,
85  R& r_s, R& r_n) const
86  {
87  typedef LocalMatrix<typename R::value_type> Jacobian;
88  typedef typename Jacobian::WeightedAccumulationView JacobianView;
89 
90  Jacobian mat_ss(r_s.size(),x_s.size(),0);
91  Jacobian mat_sn(r_s.size(),x_n.size(),0);
92  Jacobian mat_ns(r_n.size(),x_s.size(),0);
93  Jacobian mat_nn(r_n.size(),x_n.size(),0);
94 
95  JacobianView view_ss = mat_ss.weightedAccumulationView(1.0);
96  JacobianView view_sn = mat_sn.weightedAccumulationView(1.0);
97  JacobianView view_ns = mat_ns.weightedAccumulationView(1.0);
98  JacobianView view_nn = mat_nn.weightedAccumulationView(1.0);
99 
100  asImp().jacobian_skeleton(ig,
101  lfsu_s, x_s, lfsv_s,
102  lfsu_n, x_n, lfsv_n,
103  view_ss, view_sn, view_ns, view_nn);
104  // TODO: Reihenfolge der Multiplikationen!
105  mat_ss.usmv(r_s.weight(),x_s,r_s);
106  mat_ns.usmv(r_n.weight(),x_s,r_n);
107  mat_sn.usmv(r_s.weight(),x_n,r_s);
108  mat_nn.usmv(r_n.weight(),x_n,r_n);
109  }
110 
111  private:
112  Imp& asImp () { return static_cast<Imp &> (*this); }
113  const Imp& asImp () const { return static_cast<const Imp &>(*this); }
114  };
115 
117 
127  template<typename Imp>
129  {
130  public:
131 
133  template<typename IG, typename LFSU, typename X, typename LFSV,
134  typename R>
135  void alpha_boundary
136  ( const IG& ig,
137  const LFSU& lfsu, const X& x, const LFSV& lfsv,
138  R& r) const
139  {
140  typedef LocalMatrix<typename R::value_type> Jacobian;
141  typedef typename Jacobian::WeightedAccumulationView JacobianView;
142 
143  Jacobian mat(x.size(),r.size(), 0);
144  JacobianView view = mat.weightedAccumulationView(1.0);
145  asImp().jacobian_boundary(ig, lfsu, x, lfsv, view);
146  // we need to include the weight here, as umv() and usmv() operate on the bare container for effiency
147  mat.usmv(r.weight(),x,r);
148  }
149 
150  private:
151  Imp& asImp () { return static_cast<Imp &> (*this); }
152  const Imp& asImp () const { return static_cast<const Imp &>(*this); }
153  };
154 
156  }
157 }
158 
159 #endif // DUNE_PDELAB_LOCALOPERATOR_NUMERICALRESIDUAL_HH
Implement alpha_boundary() based on jacobian_boundary()
Definition: numericalresidual.hh:128
const IG & ig
Definition: constraints.hh:148
WeightedAccumulationView weightedAccumulationView(weight_type weight)
Returns a weighted accumulate-only view of this matrix with the given weight.
Definition: localmatrix.hh:398
void alpha_volume(const EG &eg, const LFSU &lfsu, const X &x, const LFSV &lfsv, R &r) const
compute
Definition: numericalresidual.hh:43
WeightedAccumulationView weightedAccumulationView(weight_type weight)
Returns a WeighedAccumulationView with some weight in addition to this view&#39;s weight.
Definition: localmatrix.hh:47
Implement alpha_skeleton() based on jacobian_skeleton()
Definition: numericalresidual.hh:74
A dense matrix for storing data associated with the degrees of freedom of a pair of LocalFunctionSpac...
Definition: localmatrix.hh:184
For backward compatibility – Do not use this!
Definition: adaptivity.hh:27
Implement alpha_volume() based on jacobian_volume()
Definition: numericalresidual.hh:35