Dune Core Modules (2.7.1)

raviartthomas12dlocalbasis.hh
1 // -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
2 // vi: set et ts=4 sw=2 sts=2:
3 #ifndef DUNE_LOCALFUNCTIONS_RAVIARTTHOMAS12DLOCALBASIS_HH
4 #define DUNE_LOCALFUNCTIONS_RAVIARTTHOMAS12DLOCALBASIS_HH
5 
6 #include <numeric>
7 #include <vector>
8 
9 #include <dune/common/fmatrix.hh>
10 
11 #include "../../common/localbasis.hh"
12 
13 namespace Dune
14 {
24  template<class D, class R>
26  {
27 
28  public:
31 
37  RT12DLocalBasis (unsigned int s = 0)
38  {
39  sign0 = sign1 = sign2 = 1.0;
40  if (s & 1)
41  {
42  sign0 = -1.0;
43  }
44  if (s & 2)
45  {
46  sign1 = -1.0;
47  }
48  if (s & 4)
49  {
50  sign2 = -1.0;
51  }
52  }
53 
55  unsigned int size () const
56  {
57  return 8;
58  }
59 
66  inline void evaluateFunction (const typename Traits::DomainType& in,
67  std::vector<typename Traits::RangeType>& out) const
68  {
69  out.resize(8);
70  out[0][0] = sign0*(in[0] - 4.0*in[0]*in[1]);
71  out[0][1] = sign0*(-1.0 + 5.0*in[1] - 4.0*in[1]*in[1]);
72  out[1][0] = sign1*(-1.0 + 5.0*in[0] - 4.0*in[0]*in[0]);
73  out[1][1] = sign1*(in[1] - 4.0*in[0]*in[1]);
74  out[2][0] = sign2*(-3.0*in[0] + 4.0*in[0]*in[0] + 4.0*in[1]*in[0]);
75  out[2][1] = sign2*(-3.0*in[1] + 4.0*in[0]*in[1] + 4.0*in[1]*in[1]);
76  out[3][0] = -5.0*in[0] + 8.0*in[0]*in[0] + 4.0*in[1]*in[0];
77  out[3][1] = 3.0 - 6.0*in[0] - 7.0*in[1] + 8.0*in[0]*in[1] + 4.0*in[1]*in[1];
78  out[4][0] = -3.0 + 7.0*in[0] + 6.0*in[1] - 4.0*in[0]*in[0] - 8.0*in[1]*in[0];
79  out[4][1] = 5.0*in[1] - 4.0*in[0]*in[1] - 8.0*in[1]*in[1];
80  out[5][0] = in[0] - 4.0*in[0]*in[0] + 4.0*in[1]*in[0];
81  out[5][1] = -1.0*in[1] - 4.0*in[0]*in[1] + 4.0*in[1]*in[1];
82  out[6][0] = 16.0*in[0] - 16.0*in[0]*in[0] - 8.0*in[1]*in[0];
83  out[6][1] = 8.0*in[1] - 16.0*in[0]*in[1] - 8.0*in[1]*in[1];
84  out[7][0] = 8.0*in[0] - 8.0*in[0]*in[0] - 16.0*in[1]*in[0];
85  out[7][1] = 16.0*in[1] - 8.0*in[0]*in[1] - 16.0*in[1]*in[1];
86  }
87 
94  inline void evaluateJacobian (const typename Traits::DomainType& in,
95  std::vector<typename Traits::JacobianType>& out) const
96  {
97  out.resize(8);
98 
99  out[0][0][0] = sign0*(1.0 - 4.0*in[1]);
100  out[0][0][1] = sign0*(-4.0*in[0]);
101  out[0][1][0] = 0.0;
102  out[0][1][1] = sign0*(5.0 - 8.0*in[1]);
103 
104  out[1][0][0] = sign1*(5.0 - 8.0*in[0]);
105  out[1][0][1] = 0.0;
106  out[1][1][0] = sign1*(-4.0*in[1]);
107  out[1][1][1] = sign1*(1.0 - 4.0*in[0]);
108 
109  out[2][0][0] = sign2*(-3.0 + 8.0*in[0] + 4.0*in[1]);
110  out[2][0][1] = sign2*(4.0*in[0]);
111  out[2][1][0] = sign2*(4.0*in[1]);
112  out[2][1][1] = sign2*(-3.0 + 4.0*in[0] + 8.0*in[1]);
113 
114  out[3][0][0] = -5.0 + 16.0*in[0] + 4.0*in[1];
115  out[3][0][1] = 4.0*in[0];
116  out[3][1][0] = -6.0 + 8.0*in[1];
117  out[3][1][1] = -7.0 + 8.0*in[0] + 8.0*in[1];
118 
119  out[4][0][0] = 7.0 - 8.0*in[0] - 8.0*in[1];
120  out[4][0][1] = 6.0 - 8.0*in[0];
121  out[4][1][0] = -4.0*in[1];
122  out[4][1][1] = 5.0 - 4.0*in[0] - 16.0*in[1];
123 
124  out[5][0][0] = 1.0 - 8.0*in[0] + 4*in[1];
125  out[5][0][1] = 4.0*in[0];
126  out[5][1][0] = -4.0*in[1];
127  out[5][1][1] = -1.0 - 4.0*in[0] + 8.0*in[1];
128 
129  out[6][0][0] = 16.0 - 32.0*in[0] - 8.0*in[1];
130  out[6][0][1] = -8.0*in[0];
131  out[6][1][0] = -16.0*in[1];
132  out[6][1][1] = 8.0 - 16.0*in[0] - 16.0*in[1];
133 
134  out[7][0][0] = 8.0 - 16.0*in[0] - 16.0*in[1];
135  out[7][0][1] = -16.0*in[0];
136  out[7][1][0] = -8.0*in[1];
137  out[7][1][1] = 16.0 - 8.0*in[0] - 32.0*in[1];
138  }
139 
141  void partial (const std::array<unsigned int, 2>& order,
142  const typename Traits::DomainType& in, // position
143  std::vector<typename Traits::RangeType>& out) const // return value
144  {
145  auto totalOrder = std::accumulate(order.begin(), order.end(), 0);
146  if (totalOrder == 0) {
147  evaluateFunction(in, out);
148  } else if (totalOrder == 1) {
149  auto const direction = std::distance(order.begin(), std::find(order.begin(), order.end(), 1));
150  out.resize(size());
151 
152  switch (direction) {
153  case 0:
154  out[0][0] = sign0*(1.0 - 4.0*in[1]);
155  out[0][1] = 0.0;
156  out[1][0] = sign1*(5.0 - 8.0*in[0]);
157  out[1][1] = sign1*(-4.0*in[1]);
158  out[2][0] = sign2*(-3.0 + 8.0*in[0] + 4.0*in[1]);
159  out[2][1] = sign2*(4.0*in[1]);
160  out[3][0] = -5.0 + 16.0*in[0] + 4.0*in[1];
161  out[3][1] = -6.0 + 8.0*in[1];
162  out[4][0] = 7.0 - 8.0*in[0] - 8.0*in[1];
163  out[4][1] = -4.0*in[1];
164  out[5][0] = 1.0 - 8.0*in[0] + 4*in[1];
165  out[5][1] = -4.0*in[1];
166  out[6][0] = 16.0 - 32.0*in[0] - 8.0*in[1];
167  out[6][1] = -16.0*in[1];
168  out[7][0] = 8.0 - 16.0*in[0] - 16.0*in[1];
169  out[7][1] = -8.0*in[1];
170  break;
171  case 1:
172  out[2][1] = sign2*(-3.0 + 4.0*in[0] + 8.0*in[1]);
173  out[2][0] = sign2*(4.0*in[0]);
174  out[1][1] = sign1*(1.0 - 4.0*in[0]);
175  out[1][0] = 0.0;
176  out[0][0] = sign0*(-4.0*in[0]);
177  out[0][1] = sign0*(5.0 - 8.0*in[1]);
178  out[3][0] = 4.0*in[0];
179  out[3][1] = -7.0 + 8.0*in[0] + 8.0*in[1];
180  out[4][0] = 6.0 - 8.0*in[0];
181  out[4][1] = 5.0 - 4.0*in[0] - 16.0*in[1];
182  out[5][0] = 4.0*in[0];
183  out[5][1] = -1.0 - 4.0*in[0] + 8.0*in[1];
184  out[6][0] = -8.0*in[0];
185  out[6][1] = 8.0 - 16.0*in[0] - 16.0*in[1];
186  out[7][0] = -16.0*in[0];
187  out[7][1] = 16.0 - 8.0*in[0] - 32.0*in[1];
188  break;
189  default:
190  DUNE_THROW(RangeError, "Component out of range.");
191  }
192  } else {
193  DUNE_THROW(NotImplemented, "Desired derivative order is not implemented");
194  }
195  }
196 
198  unsigned int order () const
199  {
200  return 2;
201  }
202 
203  private:
204  R sign0, sign1, sign2;
205  };
206 }
207 #endif // DUNE_LOCALFUNCTIONS_RAVIARTTHOMAS12DLOCALBASIS_HH
A dense n x m matrix.
Definition: fmatrix.hh:69
vector space out of a tensor product of fields.
Definition: fvector.hh:96
Default exception for dummy implementations.
Definition: exceptions.hh:261
First order Raviart-Thomas shape functions on the reference triangle.
Definition: raviartthomas12dlocalbasis.hh:26
unsigned int size() const
number of shape functions
Definition: raviartthomas12dlocalbasis.hh:55
void partial(const std::array< unsigned int, 2 > &order, const typename Traits::DomainType &in, std::vector< typename Traits::RangeType > &out) const
Evaluate partial derivatives of all shape functions.
Definition: raviartthomas12dlocalbasis.hh:141
void evaluateJacobian(const typename Traits::DomainType &in, std::vector< typename Traits::JacobianType > &out) const
Evaluate Jacobian of all shape functions.
Definition: raviartthomas12dlocalbasis.hh:94
RT12DLocalBasis(unsigned int s=0)
Make set number s, where 0 <= s < 8.
Definition: raviartthomas12dlocalbasis.hh:37
unsigned int order() const
Polynomial order of the shape functions.
Definition: raviartthomas12dlocalbasis.hh:198
void evaluateFunction(const typename Traits::DomainType &in, std::vector< typename Traits::RangeType > &out) const
Evaluate all shape functions.
Definition: raviartthomas12dlocalbasis.hh:66
Default exception class for range errors.
Definition: exceptions.hh:252
Implements a matrix constructed from a given type representing a field and compile-time given number ...
#define DUNE_THROW(E, m)
Definition: exceptions.hh:216
T accumulate(Range &&range, T value, F &&f)
Accumulate values.
Definition: hybridutilities.hh:290
Dune namespace.
Definition: alignedallocator.hh:14
Type traits for LocalBasisVirtualInterface.
Definition: localbasis.hh:32
D DomainType
domain type
Definition: localbasis.hh:43
Creative Commons License   |  Legal Statements / Impressum  |  Hosted by TU Dresden  |  generated with Hugo v0.80.0 (May 16, 22:29, 2024)