3 #ifndef DUNE_HIERARCHICAL_SIMPLEX_P2_LOCALBASIS_HH 4 #define DUNE_HIERARCHICAL_SIMPLEX_P2_LOCALBASIS_HH 12 #include <dune/common/fvector.hh> 13 #include <dune/common/fmatrix.hh> 19 template<
class D,
class R,
int dim>
25 DUNE_THROW(Dune::NotImplemented,
"HierarchicalSimplexP2LocalBasis not implemented for dim > 3.");
43 template<
class D,
class R>
59 std::vector<typename Traits::RangeType>& out)
const 64 out[1] = 1-4*(in[0]-0.5)*(in[0]-0.5);
71 std::vector<typename Traits::JacobianType>& out)
const 76 out[1][0][0] = 4-8*in[0];
81 void partial (
const std::array<unsigned int, 1>& order,
83 std::vector<typename Traits::RangeType>& out)
const 85 auto totalOrder = order[0];
86 if (totalOrder == 0) {
87 evaluateFunction(in, out);
88 }
else if (totalOrder == 1) {
93 }
else if (totalOrder == 2) {
100 out[0] = out[1] = out[2] = 0;
132 template<
class D,
class R>
148 std::vector<typename Traits::RangeType>& out)
const 152 out[0] = 1 - in[0] - in[1];
153 out[1] = 4*in[0]*(1-in[0]-in[1]);
155 out[3] = 4*in[1]*(1-in[0]-in[1]);
156 out[4] = 4*in[0]*in[1];
164 std::vector<typename Traits::JacobianType>& out)
const 168 out[0][0][0] = -1; out[0][0][1] = -1;
169 out[1][0][0] = 4-8*in[0]-4*in[1]; out[1][0][1] = -4*in[0];
170 out[2][0][0] = 1; out[2][0][1] = 0;
171 out[3][0][0] = -4*in[1]; out[3][0][1] = 4-4*in[0]-8*in[1];
172 out[4][0][0] = 4*in[1]; out[4][0][1] = 4*in[0];
173 out[5][0][0] = 0; out[5][0][1] = 1;
177 void partial (
const std::array<unsigned int, 2>& order,
179 std::vector<typename Traits::RangeType>& out)
const 181 auto totalOrder = std::accumulate(order.begin(), order.end(), 0);
182 if (totalOrder == 0) {
183 evaluateFunction(in, out);
184 }
else if (totalOrder == 1) {
186 auto const direction = std::distance(order.begin(), std::find(order.begin(), order.end(), 1));
191 out[1] = 4-8*in[0]-4*in[1];
201 out[3] = 4-4*in[0]-8*in[1];
206 DUNE_THROW(RangeError,
"Component out of range.");
209 DUNE_THROW(NotImplemented,
"Desired derivative order is not implemented");
245 template<
class D,
class R>
261 std::vector<typename Traits::RangeType>& out)
const 265 out[0] = 1 - in[0] - in[1] - in[2];
266 out[1] = 4 * in[0] * (1 - in[0] - in[1] - in[2]);
268 out[3] = 4 * in[1] * (1 - in[0] - in[1] - in[2]);
269 out[4] = 4 * in[0] * in[1];
271 out[6] = 4 * in[2] * (1 - in[0] - in[1] - in[2]);
272 out[7] = 4 * in[0] * in[2];
273 out[8] = 4 * in[1] * in[2];
279 std::vector<typename Traits::JacobianType>& out)
const 283 out[0][0][0] = -1; out[0][0][1] = -1; out[0][0][2] = -1;
284 out[1][0][0] = 4-8*in[0]-4*in[1]-4*in[2]; out[1][0][1] = -4*in[0]; out[1][0][2] = -4*in[0];
285 out[2][0][0] = 1; out[2][0][1] = 0; out[2][0][2] = 0;
286 out[3][0][0] = -4*in[1]; out[3][0][1] = 4-4*in[0]-8*in[1]-4*in[2]; out[3][0][2] = -4*in[1];
287 out[4][0][0] = 4*in[1]; out[4][0][1] = 4*in[0]; out[4][0][2] = 0;
288 out[5][0][0] = 0; out[5][0][1] = 1; out[5][0][2] = 0;
289 out[6][0][0] = -4*in[2]; out[6][0][1] = -4*in[2]; out[6][0][2] = 4-4*in[0]-4*in[1]-8*in[2];
290 out[7][0][0] = 4*in[2]; out[7][0][1] = 0; out[7][0][2] = 4*in[0];
291 out[8][0][0] = 0; out[8][0][1] = 4*in[2]; out[8][0][2] = 4*in[1];
292 out[9][0][0] = 0; out[9][0][1] = 0; out[9][0][2] = 1;
296 void partial (
const std::array<unsigned int, 3>& order,
298 std::vector<typename Traits::RangeType>& out)
const 300 auto totalOrder = std::accumulate(order.begin(), order.end(), 0);
301 if (totalOrder == 0) {
302 evaluateFunction(in, out);
303 }
else if (totalOrder == 1) {
305 auto const direction = std::distance(order.begin(), std::find(order.begin(), order.end(), 1));
310 out[1] = 4-8*in[0]-4*in[1]-4*in[2];
324 out[3] = 4-4*in[0]-8*in[1]-4*in[2];
339 out[6] = 4-4*in[0]-4*in[1]-8*in[2];
345 DUNE_THROW(RangeError,
"Component out of range.");
348 DUNE_THROW(NotImplemented,
"Desired derivative order is not implemented");
LocalBasisTraits< D, 2, Dune::FieldVector< D, 2 >, R, 1, Dune::FieldVector< R, 1 >, Dune::FieldMatrix< R, 1, 2 > > Traits
export type traits for function signature
Definition: hierarchicalsimplexp2localbasis.hh:138
void evaluateJacobian(const typename Traits::DomainType &in, std::vector< typename Traits::JacobianType > &out) const
Evaluate Jacobian of all shape functions.
Definition: hierarchicalsimplexp2localbasis.hh:278
LocalBasisTraits< D, 1, Dune::FieldVector< D, 1 >, R, 1, Dune::FieldVector< R, 1 >, Dune::FieldMatrix< R, 1, 1 > > Traits
export type traits for function signature
Definition: hierarchicalsimplexp2localbasis.hh:49
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: hierarchicalsimplexp2localbasis.hh:177
unsigned int size() const
number of shape functions
Definition: hierarchicalsimplexp2localbasis.hh:141
unsigned int order() const
Polynomial order of the shape functions (2, in this case)
Definition: hierarchicalsimplexp2localbasis.hh:106
Type traits for LocalBasisVirtualInterface.
Definition: localbasis.hh:31
void evaluateFunction(const typename Traits::DomainType &in, std::vector< typename Traits::RangeType > &out) const
Evaluate all shape functions.
Definition: hierarchicalsimplexp2localbasis.hh:147
D DomainType
domain type
Definition: localbasis.hh:43
void evaluateFunction(const typename Traits::DomainType &in, std::vector< typename Traits::RangeType > &out) const
Evaluate all shape functions.
Definition: hierarchicalsimplexp2localbasis.hh:58
unsigned int order() const
Polynomial order of the shape functions (2 in this case)
Definition: hierarchicalsimplexp2localbasis.hh:215
void partial(const std::array< unsigned int, 1 > &order, const typename Traits::DomainType &in, std::vector< typename Traits::RangeType > &out) const
Evaluate partial derivatives of all shape functions.
Definition: hierarchicalsimplexp2localbasis.hh:81
void evaluateFunction(const typename Traits::DomainType &in, std::vector< typename Traits::RangeType > &out) const
Evaluate all shape functions.
Definition: hierarchicalsimplexp2localbasis.hh:260
void evaluateJacobian(const typename Traits::DomainType &in, std::vector< typename Traits::JacobianType > &out) const
Evaluate Jacobian of all shape functions.
Definition: hierarchicalsimplexp2localbasis.hh:163
LocalBasisTraits< D, 3, Dune::FieldVector< D, 3 >, R, 1, Dune::FieldVector< R, 1 >, Dune::FieldMatrix< R, 1, 3 > > Traits
export type traits for function signature
Definition: hierarchicalsimplexp2localbasis.hh:251
Definition: brezzidouglasmarini1cube2dlocalbasis.hh:15
void evaluateJacobian(const typename Traits::DomainType &in, std::vector< typename Traits::JacobianType > &out) const
Evaluate Jacobian of all shape functions.
Definition: hierarchicalsimplexp2localbasis.hh:70
unsigned int size() const
number of shape functions
Definition: hierarchicalsimplexp2localbasis.hh:254
unsigned int size() const
number of shape functions
Definition: hierarchicalsimplexp2localbasis.hh:52
void partial(const std::array< unsigned int, 3 > &order, const typename Traits::DomainType &in, std::vector< typename Traits::RangeType > &out) const
Evaluate partial derivatives of all shape functions.
Definition: hierarchicalsimplexp2localbasis.hh:296
unsigned int order() const
Polynomial order of the shape functions (2 in this case)
Definition: hierarchicalsimplexp2localbasis.hh:354
HierarchicalSimplexP2LocalBasis()
Definition: hierarchicalsimplexp2localbasis.hh:23
Definition: hierarchicalsimplexp2localbasis.hh:20