FEAT 3
Finite Element Analysis Toolbox
Loading...
Searching...
No Matches
evaluator.hpp
1// FEAT3: Finite Element Analysis Toolbox, Version 3
2// Copyright (C) 2010 by Stefan Turek & the FEAT group
3// FEAT3 is released under the GNU General Public License version 3,
4// see the file 'copyright.txt' in the top level directory for details.
5
6#pragma once
7
8// includes, FEAT
9#include <kernel/space/parametric_evaluator.hpp>
10#include <kernel/space/dof_mapping_common.hpp>
11
12namespace FEAT
13{
14 namespace Space
15 {
16 namespace P2Bubble
17 {
24
30 template<
31 typename Space_,
32 typename TrafoEvaluator_,
33 typename SpaceEvalTraits_,
34 typename Shape_ = typename Space_::ShapeType>
35 class Evaluator DOXY({});
36
42 template<
43 typename Space_,
44 typename TrafoEvaluator_,
45 typename SpaceEvalTraits_>
46 class Evaluator<Space_, TrafoEvaluator_, SpaceEvalTraits_, Shape::Simplex<2> > :
48 Evaluator<
49 Space_,
50 TrafoEvaluator_,
51 SpaceEvalTraits_,
52 Shape::Simplex<2> >,
53 TrafoEvaluator_,
54 SpaceEvalTraits_,
55 ref_caps>
56 {
57 public:
60
62 typedef Space_ SpaceType;
63
65 typedef SpaceEvalTraits_ SpaceEvalTraits;
66
68 typedef typename SpaceEvalTraits::EvalPolicy EvalPolicy;
69
71 typedef typename EvalPolicy::DomainPointType DomainPointType;
72
74 typedef typename SpaceEvalTraits::DataType DataType;
75
76 public:
83 explicit Evaluator(const SpaceType& DOXY(space))
84 {
85 }
86
94 {
95 return 7;
96 }
97
107 template<typename EvalData_>
109 EvalData_& data,
110 const DomainPointType& point) const
111 {
112 const DataType x = point[0];
113 const DataType y = point[1];
114 // vertex dofs
115 data.phi[0].ref_value = (DataType(1) + DataType(3)*x*y - DataType(2)*(x + y))*(DataType(1) - x - y);
116 data.phi[1].ref_value = x*(DataType(2)*x + DataType(3)*y*(DataType(1) - x - y) - DataType(1));
117 data.phi[2].ref_value = y*(DataType(2)*y + DataType(3)*x*(DataType(1) - x - y) - DataType(1));
118 // edge dofs
119 data.phi[3].ref_value = DataType(4)*x*y*(DataType(3)*(x+y)-DataType(2));
120 data.phi[4].ref_value = DataType(4)*y*(DataType(3)*x-DataType(1))*(x+y-DataType(1));
121 data.phi[5].ref_value = DataType(4)*x*(DataType(3)*y-DataType(1))*(x+y-DataType(1));
122 // centre dof
123 data.phi[6].ref_value = DataType(27)*x*y*(DataType(1)-x-y);
124 }
125
135 template<typename EvalData_>
137 EvalData_& data,
138 const DomainPointType& point) const
139 {
140 const DataType x = point[0];
141 const DataType y = point[1];
142 // vertex dofs
143 data.phi[0].ref_grad[0] = y*(DataType(7)-DataType(3)*y-DataType(6)*x)+DataType(4)*x-DataType(3);
144 data.phi[0].ref_grad[1] = x*(DataType(7)-DataType(3)*x-DataType(6)*y)+DataType(4)*y-DataType(3);
145 data.phi[1].ref_grad[0] = DataType(3)*y*(DataType(1)-y-DataType(2)*x)+DataType(4)*x-DataType(1);
146 data.phi[1].ref_grad[1] = DataType(3)*x*(DataType(1)-x-DataType(2)*y);
147 data.phi[2].ref_grad[0] = DataType(3)*y*(DataType(1)-y-DataType(2)*x);
148 data.phi[2].ref_grad[1] = DataType(3)*x*(DataType(1)-x-DataType(2)*y)+DataType(4)*y-DataType(1);
149 // edge dofs
150 data.phi[3].ref_grad[0] = DataType(4)*y*(DataType(6)*x+DataType(3)*y-DataType(2));
151 data.phi[3].ref_grad[1] = DataType(4)*x*(DataType(3)*x+DataType(6)*y-DataType(2));
152 data.phi[4].ref_grad[0] = DataType(4)*y*(DataType(6)*x+DataType(3)*y-DataType(4));
153 data.phi[4].ref_grad[1] = DataType(4)*(DataType(3)*x-DataType(1))*(x+DataType(2)*y-DataType(1));
154 data.phi[5].ref_grad[0] = DataType(4)*(DataType(3)*y-DataType(1))*(y+DataType(2)*x-DataType(1));
155 data.phi[5].ref_grad[1] = DataType(4)*x*(DataType(3)*x+DataType(6)*y-DataType(4));
156 // centre dof
157 data.phi[6].ref_grad[0] = DataType(27)*y*(DataType(1)-y-DataType(2)*x);
158 data.phi[6].ref_grad[1] = DataType(27)*x*(DataType(1)-x-DataType(2)*y);
159 }
160
170 template<typename EvalData_>
172 EvalData_& data,
173 const DomainPointType& point) const
174 {
175 const DataType x = point[0];
176 const DataType y = point[1];
177 // vertex dofs
178 data.phi[0].ref_hess[0][0] = -DataType(6)*y+DataType(4);
179 data.phi[0].ref_hess[1][1] =-DataType(6)*x+DataType(4);
180 data.phi[0].ref_hess[0][1] = data.phi[0].ref_hess[1][0] = DataType(7)-DataType(6)*(x+y);
181 data.phi[1].ref_hess[0][0] = -DataType(6)*y+DataType(4);
182 data.phi[1].ref_hess[1][1] = -DataType(6)*x;
183 data.phi[1].ref_hess[0][1] = data.phi[1].ref_hess[1][0] = DataType(3)-DataType(6)*(x+y);
184 data.phi[2].ref_hess[0][0] = -DataType(6)*y;
185 data.phi[2].ref_hess[1][1] = -DataType(6)*x+DataType(4);
186 data.phi[2].ref_hess[0][1] = data.phi[2].ref_hess[1][0] = DataType(3)-DataType(6)*(x+y);
187 // edge dofs
188 data.phi[3].ref_hess[0][0] = DataType(24)*y;
189 data.phi[3].ref_hess[1][1] = DataType(24)*x;
190 data.phi[3].ref_hess[0][1] = data.phi[3].ref_hess[1][0] = DataType(8)*(DataType(3)*(x+y)-DataType(1));
191 data.phi[4].ref_hess[0][0] = DataType(24)*y;
192 data.phi[4].ref_hess[1][1] = DataType(24)*x-DataType(8);
193 data.phi[4].ref_hess[0][1] = data.phi[4].ref_hess[1][0] = DataType(8)*(DataType(3)*(x+y)-DataType(2));
194 data.phi[5].ref_hess[0][0] = DataType(24)*y-DataType(8);
195 data.phi[5].ref_hess[1][1] = DataType(24)*x;
196 data.phi[5].ref_hess[0][1] = data.phi[5].ref_hess[1][0] = DataType(8)*(DataType(3)*(x+y)-DataType(2));
197 // centre dof
198 data.phi[6].ref_hess[0][0] = -DataType(54)*y;
199 data.phi[6].ref_hess[1][1] = -DataType(54)*x;
200 data.phi[6].ref_hess[0][1] = data.phi[6].ref_hess[1][0] = DataType(27)*(DataType(1)-DataType(2)*(x+y));
201 }
202 }; // class Evaluator<...,Simplex<2>>
203 } // namespace P2Bubble
204 } // namespace Space
205} // namespace FEAT
ParametricEvaluator< Evaluator, TrafoEvaluator_, SpaceEvalTraits_, ref_caps > BaseClass
base-class typedef
Definition: evaluator.hpp:59
void eval_ref_values(EvalData_ &data, const DomainPointType &point) const
Evaluates the basis function values on the reference cell.
Definition: evaluator.hpp:108
void eval_ref_gradients(EvalData_ &data, const DomainPointType &point) const
Evaluates the basis function gradients on the reference cell.
Definition: evaluator.hpp:136
void eval_ref_hessians(EvalData_ &data, const DomainPointType &point) const
Evaluates the basis function hessians on the reference cell.
Definition: evaluator.hpp:171
P2-Bubble Element Evaluator class template declaration.
Definition: evaluator.hpp:35
Finite-Element Parametric Evaluator CRTP base-class template.
static constexpr SpaceTags ref_caps
P2-Bubble Element Evaluator reference capabilities.
Definition: evaluator.hpp:23
FEAT namespace.
Definition: adjactor.hpp:12
SpaceTags
Space configuration tags enum.
Definition: eval_tags.hpp:97
@ ref_value
specifies whether the space should supply reference basis function values
@ ref_hess
specifies whether the space should supply reference basis function hessians
@ ref_grad
specifies whether the space should supply reference basis function gradients