dune-localfunctions  2.2.1
raviartthomas1q2dlocalbasis.hh
Go to the documentation of this file.
1 #ifndef DUNE_LOCALFUNCTIONS_RAVIARTTHOMAS1Q2DLOCALBASIS_HH
2 #define DUNE_LOCALFUNCTIONS_RAVIARTTHOMAS1Q2DLOCALBASIS_HH
3 
4 #include <vector>
5 
6 #include <dune/common/fmatrix.hh>
7 
8 #include "../../common/localbasis.hh"
9 
10 namespace Dune
11 {
21  template<class D, class R>
23  {
24 
25 public:
26  typedef LocalBasisTraits<D,2,Dune::FieldVector<D,2>,R,2,Dune::FieldVector<R,2>,
27  Dune::FieldMatrix<R,2,2> > Traits;
28 
31  {
32  sign0 = sign1 = sign2 = sign3 = 1.0;
33  }
34 
40  RT1Q2DLocalBasis (unsigned int s)
41  {
42  sign0 = sign1 = sign2 = sign3 = 1.0;
43  if (s & 1)
44  {
45  sign0 = -1.0;
46  }
47  if (s & 2)
48  {
49  sign1 = -1.0;
50  }
51  if (s & 4)
52  {
53  sign2 = -1.0;
54  }
55  if (s & 8)
56  {
57  sign3 = -1.0;
58  }
59  }
60 
62  unsigned int size () const
63  {
64  return 12;
65  }
66 
73  inline void evaluateFunction (const typename Traits::DomainType& in,
74  std::vector<typename Traits::RangeType>& out) const
75  {
76  out.resize(12);
77 
78  out[0][0] = sign0*(-1.0 + 4.0*in[0]-3*in[0]*in[0]);
79  out[0][1] = 0.0;
80  out[1][0] = 3.0 - 12.0*in[0] - 6.0*in[1] + 24.0*in[0]*in[1]+9*in[0]*in[0] - 18.0*in[0]*in[0]*in[1];
81  out[1][1] = 0.0;
82  out[2][0] = sign1*(-2.0*in[0] + 3.0*in[0]*in[0]);
83  out[2][1] = 0.0;
84  out[3][0] = -6.0*in[0] + 12.0*in[0]*in[1] + 9.0*in[0]*in[0] - 18.0*in[0]*in[0]*in[1];
85  out[3][1] = 0.0;
86  out[4][0] = 0.0;
87  out[4][1] = sign2*(-1.0 + 4.0*in[1] - 3.0*in[1]*in[1]);
88  out[5][0] = 0.0;
89  out[5][1] = -3.0 + 6.0*in[0] + 12.0*in[1] - 24.0*in[0]*in[1] - 9.0*in[1]*in[1] + 18.0*in[0]*in[1]*in[1];
90  out[6][0] = 0.0;
91  out[6][1] = sign3*(-2.0*in[1] + 3.0*in[1]*in[1]);
92  out[7][0] = 0.0;
93  out[7][1] = 6.0*in[1] - 12.0*in[0]*in[1] - 9.0*in[1]*in[1] + 18.0*in[0]*in[1]*in[1];
94  out[8][0] = 24.0*in[0] - 36.0*in[0]*in[1] - 24.0*in[0]*in[0] + 36.0*in[0]*in[0]*in[1];
95  out[8][1] = 0.0;
96  out[9][0] = 0.0;
97  out[9][1] = 24.0*in[1] - 36.0*in[0]*in[1] - 24.0*in[1]*in[1] + 36.0*in[0]*in[1]*in[1];
98  out[10][0] = -36.0*in[0] + 72.0*in[0]*in[1] + 36.0*in[0]*in[0] - 72.0*in[0]*in[0]*in[1];
99  out[10][1] = 0.0;
100  out[11][0] = 0.0;
101  out[11][1] = -36.0*in[1] + 72.0*in[0]*in[1] + 36*in[1]*in[1] - 72.0*in[0]*in[1]*in[1];
102  }
103 
110  inline void evaluateJacobian (const typename Traits::DomainType& in,
111  std::vector<typename Traits::JacobianType>& out) const
112  {
113  out.resize(12);
114 
115  out[0][0][0] = sign0*(4.0 - 6.0*in[0]);
116  out[0][0][1] = 0.0;
117  out[0][1][0] = 0.0;
118  out[0][1][1] = 0.0;
119 
120  out[1][0][0] = -12.0 + 24.0*in[1] + 18.0*in[0] - 36.0*in[0]*in[1];
121  out[1][0][1] = -6 + 24.0*in[0] - 18.0*in[0]*in[0];
122  out[1][1][0] = 0.0;
123  out[1][1][1] = 0.0;
124 
125  out[2][0][0] = sign1*(-2.0 + 6.0*in[0]);
126  out[2][0][1] = 0.0;
127  out[2][1][0] = 0.0;
128  out[2][1][1] = 0.0;
129 
130  out[3][0][0] = -6.0 + 12.0*in[1] + 18.0*in[0] - 36.0*in[0]*in[1];
131  out[3][0][1] = 12.0*in[0] - 18.0*in[0]*in[0];
132  out[3][1][0] = 0.0;
133  out[3][1][1] = 0.0;
134 
135  out[4][0][0] = 0.0;
136  out[4][0][1] = 0.0;
137  out[4][1][0] = 0.0;
138  out[4][1][1] = sign2*(4.0 - 6.0*in[1]);
139 
140  out[5][0][0] = 0.0;
141  out[5][0][1] = 0.0;
142  out[5][1][0] = 6.0 - 24.0*in[1] + 18.0*in[1]*in[1];
143  out[5][1][1] = 12.0 - 24.0*in[0] - 18.0*in[1] + 36.0*in[0]*in[1];
144 
145  out[6][0][0] = 0.0;
146  out[6][0][1] = 0.0;
147  out[6][1][0] = 0.0;
148  out[6][1][1] = sign3*(-2.0 + 6.0*in[1]);
149 
150  out[7][0][0] = 0.0;
151  out[7][0][1] = 0.0;
152  out[7][1][0] = -12.0*in[1] + 18.0*in[1]*in[1];
153  out[7][1][1] = 6.0 - 12.0*in[0] - 18.0*in[1] + 36.0*in[1]*in[0];
154 
155  out[8][0][0] = 24.0 - 36.0*in[1] - 48.0*in[0] + 72.0*in[0]*in[1];
156  out[8][0][1] = -36.0*in[0] + 36.0*in[0]*in[0];
157  out[8][1][0] = 0.0;
158  out[8][1][1] = 0.0;
159 
160  out[9][0][0] = 0.0;
161  out[9][0][1] = 0.0;
162  out[9][1][0] = -36.0*in[1] + 36.0*in[1]*in[1];
163  out[9][1][1] = 24.0 - 36.0*in[0] - 48.0*in[1] + 72.0*in[0]*in[1];
164 
165  out[10][0][0] = -36.0 + 72.0*in[1] + 72.0*in[0] - 144.0*in[0]*in[1];
166  out[10][0][1] = 72.0*in[0] - 72.0*in[0]*in[0];
167  out[10][1][0] = 0.0;
168  out[10][1][1] = 0.0;
169 
170  out[11][0][0] = 0.0;
171  out[11][0][1] = 0.0;
172  out[11][1][0] = 72.0*in[1] - 72.0*in[1]*in[1];
173  out[11][1][1] = -36.0 + 72.0*in[0] + 72.0*in[1] - 144.0*in[0]*in[1];
174  }
175 
177  unsigned int order () const
178  {
179  return 3;
180  }
181 
182 private:
183  R sign0, sign1, sign2, sign3;
184  };
185 }
186 #endif // DUNE_LOCALFUNCTIONS_RAVIARTTHOMAS1Q2DLOCALBASIS_HH