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 Lagrange1
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 3;
96 }
97
107 template<typename EvalData_>
109 EvalData_& data,
110 const DomainPointType& point) const
111 {
112 data.phi[0].ref_value = DataType(1) - point[0] - point[1];
113 data.phi[1].ref_value = point[0];
114 data.phi[2].ref_value = point[1];
115 }
116
126 template<typename EvalData_>
128 EvalData_& data,
129 const DomainPointType& DOXY(point)) const
130 {
131 data.phi[0].ref_grad[0] = -DataType(1);
132 data.phi[0].ref_grad[1] = -DataType(1);
133 data.phi[1].ref_grad[0] = DataType(1);
134 data.phi[1].ref_grad[1] = DataType(0);
135 data.phi[2].ref_grad[0] = DataType(0);
136 data.phi[2].ref_grad[1] = DataType(1);
137 }
138 }; // class Evaluator<...,Simplex<2>>
139
145 template<
146 typename Space_,
147 typename TrafoEvaluator_,
148 typename SpaceEvalTraits_>
149 class Evaluator<Space_, TrafoEvaluator_, SpaceEvalTraits_, Shape::Simplex<3> > :
150 public ParametricEvaluator<
151 Evaluator<
152 Space_,
153 TrafoEvaluator_,
154 SpaceEvalTraits_,
155 Shape::Simplex<3> >,
156 TrafoEvaluator_,
157 SpaceEvalTraits_,
158 ref_caps>
159 {
160 public:
163
165 typedef Space_ SpaceType;
166
168 typedef SpaceEvalTraits_ SpaceEvalTraits;
169
171 typedef typename SpaceEvalTraits::EvalPolicy EvalPolicy;
172
174 typedef typename EvalPolicy::DomainPointType DomainPointType;
175
177 typedef typename SpaceEvalTraits::DataType DataType;
178
179 public:
186 explicit Evaluator(const SpaceType& DOXY(space))
187 {
188 }
189
197 {
198 return 4;
199 }
200
210 template<typename EvalData_>
212 EvalData_& data,
213 const DomainPointType& point) const
214 {
215 data.phi[0].ref_value = DataType(1) - point[0] - point[1] - point[2];
216 data.phi[1].ref_value = point[0];
217 data.phi[2].ref_value = point[1];
218 data.phi[3].ref_value = point[2];
219 }
220
230 template<typename EvalData_>
232 EvalData_& data,
233 const DomainPointType& DOXY(point)) const
234 {
235 data.phi[0].ref_grad[0] = -DataType(1);
236 data.phi[0].ref_grad[1] = -DataType(1);
237 data.phi[0].ref_grad[2] = -DataType(1);
238 data.phi[1].ref_grad[0] = DataType(1);
239 data.phi[1].ref_grad[1] = DataType(0);
240 data.phi[1].ref_grad[2] = DataType(0);
241 data.phi[2].ref_grad[0] = DataType(0);
242 data.phi[2].ref_grad[1] = DataType(1);
243 data.phi[2].ref_grad[2] = DataType(0);
244 data.phi[3].ref_grad[0] = DataType(0);
245 data.phi[3].ref_grad[1] = DataType(0);
246 data.phi[3].ref_grad[2] = DataType(1);
247 }
248 }; // class Evaluator<...,Simplex<3>>
249
255 template<
256 typename Space_,
257 typename TrafoEvaluator_,
258 typename SpaceEvalTraits_>
259 class Evaluator<Space_, TrafoEvaluator_, SpaceEvalTraits_, Shape::Hypercube<1> > :
260 public ParametricEvaluator<
261 Evaluator<
262 Space_,
263 TrafoEvaluator_,
264 SpaceEvalTraits_,
265 Shape::Hypercube<1> >,
266 TrafoEvaluator_,
267 SpaceEvalTraits_,
268 ref_caps>
269 {
270 public:
273
275 typedef Space_ SpaceType;
276
278 typedef SpaceEvalTraits_ SpaceEvalTraits;
279
281 typedef typename SpaceEvalTraits::EvalPolicy EvalPolicy;
282
284 typedef typename EvalPolicy::DomainPointType DomainPointType;
285
287 typedef typename SpaceEvalTraits::DataType DataType;
288
289 public:
296 explicit Evaluator(const SpaceType& DOXY(space))
297 {
298 }
299
307 {
308 return 2;
309 }
310
320 template<typename EvalData_>
322 EvalData_& data,
323 const DomainPointType& point) const
324 {
325 data.phi[0].ref_value = DataType(0.5) * (DataType(1) - point[0]);
326 data.phi[1].ref_value = DataType(0.5) * (DataType(1) + point[0]);
327 }
328
338 template<typename EvalData_>
340 EvalData_& data,
341 const DomainPointType& DOXY(point)) const
342 {
343 data.phi[0].ref_grad[0] = DataType(-0.5);
344 data.phi[1].ref_grad[0] = DataType( 0.5);
345 }
346 }; // class Evaluator<...,Hypercube<1>>
347
353 template<
354 typename Space_,
355 typename TrafoEvaluator_,
356 typename SpaceEvalTraits_>
357 class Evaluator<Space_, TrafoEvaluator_, SpaceEvalTraits_, Shape::Hypercube<2> > :
358 public ParametricEvaluator<
359 Evaluator<
360 Space_,
361 TrafoEvaluator_,
362 SpaceEvalTraits_,
363 Shape::Hypercube<2> >,
364 TrafoEvaluator_,
365 SpaceEvalTraits_,
366 ref_caps>
367 {
368 public:
371
373 typedef Space_ SpaceType;
374
376 typedef SpaceEvalTraits_ SpaceEvalTraits;
377
379 typedef typename SpaceEvalTraits::EvalPolicy EvalPolicy;
380
382 typedef typename EvalPolicy::DomainPointType DomainPointType;
383
385 typedef typename SpaceEvalTraits::DataType DataType;
386
387 public:
394 explicit Evaluator(const SpaceType& DOXY(space))
395 {
396 }
397
405 {
406 return 4;
407 }
408
418 template<typename EvalData_>
420 EvalData_& data,
421 const DomainPointType& point) const
422 {
423 data.phi[0].ref_value = DataType(0.25) * (DataType(1) - point[0]) * (DataType(1) - point[1]);
424 data.phi[1].ref_value = DataType(0.25) * (DataType(1) + point[0]) * (DataType(1) - point[1]);
425 data.phi[2].ref_value = DataType(0.25) * (DataType(1) - point[0]) * (DataType(1) + point[1]);
426 data.phi[3].ref_value = DataType(0.25) * (DataType(1) + point[0]) * (DataType(1) + point[1]);
427 }
428
438 template<typename EvalData_>
440 EvalData_& data,
441 const DomainPointType& point) const
442 {
443 data.phi[0].ref_grad[0] = DataType(-0.25) * (DataType(1) - point[1]);
444 data.phi[0].ref_grad[1] = DataType(-0.25) * (DataType(1) - point[0]);
445 data.phi[1].ref_grad[0] = DataType( 0.25) * (DataType(1) - point[1]);
446 data.phi[1].ref_grad[1] = DataType(-0.25) * (DataType(1) + point[0]);
447 data.phi[2].ref_grad[0] = DataType(-0.25) * (DataType(1) + point[1]);
448 data.phi[2].ref_grad[1] = DataType( 0.25) * (DataType(1) - point[0]);
449 data.phi[3].ref_grad[0] = DataType( 0.25) * (DataType(1) + point[1]);
450 data.phi[3].ref_grad[1] = DataType( 0.25) * (DataType(1) + point[0]);
451 }
452 }; // class Evaluator<...,Hypercube<2>>
453
459 template<
460 typename Space_,
461 typename TrafoEvaluator_,
462 typename SpaceEvalTraits_>
463 class Evaluator<Space_, TrafoEvaluator_, SpaceEvalTraits_, Shape::Hypercube<3> > :
464 public ParametricEvaluator<
465 Evaluator<
466 Space_,
467 TrafoEvaluator_,
468 SpaceEvalTraits_,
469 Shape::Hypercube<3> >,
470 TrafoEvaluator_,
471 SpaceEvalTraits_,
472 ref_caps>
473 {
474 public:
477
479 typedef Space_ SpaceType;
480
482 typedef SpaceEvalTraits_ SpaceEvalTraits;
483
485 typedef typename SpaceEvalTraits::EvalPolicy EvalPolicy;
486
488 typedef typename EvalPolicy::DomainPointType DomainPointType;
489
491 typedef typename SpaceEvalTraits::DataType DataType;
492
493 public:
500 explicit Evaluator(const SpaceType& DOXY(space))
501 {
502 }
503
511 {
512 return 8;
513 }
514
524 template<typename EvalData_>
526 EvalData_& data,
527 const DomainPointType& point) const
528 {
529 data.phi[0].ref_value = DataType(0.125) * (DataType(1) - point[0]) * (DataType(1) - point[1]) * (DataType(1) - point[2]);
530 data.phi[1].ref_value = DataType(0.125) * (DataType(1) + point[0]) * (DataType(1) - point[1]) * (DataType(1) - point[2]);
531 data.phi[2].ref_value = DataType(0.125) * (DataType(1) - point[0]) * (DataType(1) + point[1]) * (DataType(1) - point[2]);
532 data.phi[3].ref_value = DataType(0.125) * (DataType(1) + point[0]) * (DataType(1) + point[1]) * (DataType(1) - point[2]);
533 data.phi[4].ref_value = DataType(0.125) * (DataType(1) - point[0]) * (DataType(1) - point[1]) * (DataType(1) + point[2]);
534 data.phi[5].ref_value = DataType(0.125) * (DataType(1) + point[0]) * (DataType(1) - point[1]) * (DataType(1) + point[2]);
535 data.phi[6].ref_value = DataType(0.125) * (DataType(1) - point[0]) * (DataType(1) + point[1]) * (DataType(1) + point[2]);
536 data.phi[7].ref_value = DataType(0.125) * (DataType(1) + point[0]) * (DataType(1) + point[1]) * (DataType(1) + point[2]);
537 }
538
548 template<typename EvalData_>
550 EvalData_& data,
551 const DomainPointType& point) const
552 {
553 data.phi[0].ref_grad[0] = DataType(-0.125) * (DataType(1) - point[1]) * (DataType(1) - point[2]);
554 data.phi[0].ref_grad[1] = DataType(-0.125) * (DataType(1) - point[2]) * (DataType(1) - point[0]);
555 data.phi[0].ref_grad[2] = DataType(-0.125) * (DataType(1) - point[0]) * (DataType(1) - point[1]);
556
557 data.phi[1].ref_grad[0] = DataType( 0.125) * (DataType(1) - point[1]) * (DataType(1) - point[2]);
558 data.phi[1].ref_grad[1] = DataType(-0.125) * (DataType(1) - point[2]) * (DataType(1) + point[0]);
559 data.phi[1].ref_grad[2] = DataType(-0.125) * (DataType(1) + point[0]) * (DataType(1) - point[1]);
560
561 data.phi[2].ref_grad[0] = DataType(-0.125) * (DataType(1) + point[1]) * (DataType(1) - point[2]);
562 data.phi[2].ref_grad[1] = DataType( 0.125) * (DataType(1) - point[2]) * (DataType(1) - point[0]);
563 data.phi[2].ref_grad[2] = DataType(-0.125) * (DataType(1) - point[0]) * (DataType(1) + point[1]);
564
565 data.phi[3].ref_grad[0] = DataType( 0.125) * (DataType(1) + point[1]) * (DataType(1) - point[2]);
566 data.phi[3].ref_grad[1] = DataType( 0.125) * (DataType(1) - point[2]) * (DataType(1) + point[0]);
567 data.phi[3].ref_grad[2] = DataType(-0.125) * (DataType(1) + point[0]) * (DataType(1) + point[1]);
568
569 data.phi[4].ref_grad[0] = DataType(-0.125) * (DataType(1) - point[1]) * (DataType(1) + point[2]);
570 data.phi[4].ref_grad[1] = DataType(-0.125) * (DataType(1) + point[2]) * (DataType(1) - point[0]);
571 data.phi[4].ref_grad[2] = DataType( 0.125) * (DataType(1) - point[0]) * (DataType(1) - point[1]);
572
573 data.phi[5].ref_grad[0] = DataType( 0.125) * (DataType(1) - point[1]) * (DataType(1) + point[2]);
574 data.phi[5].ref_grad[1] = DataType(-0.125) * (DataType(1) + point[2]) * (DataType(1) + point[0]);
575 data.phi[5].ref_grad[2] = DataType( 0.125) * (DataType(1) + point[0]) * (DataType(1) - point[1]);
576
577 data.phi[6].ref_grad[0] = DataType(-0.125) * (DataType(1) + point[1]) * (DataType(1) + point[2]);
578 data.phi[6].ref_grad[1] = DataType( 0.125) * (DataType(1) + point[2]) * (DataType(1) - point[0]);
579 data.phi[6].ref_grad[2] = DataType( 0.125) * (DataType(1) - point[0]) * (DataType(1) + point[1]);
580
581 data.phi[7].ref_grad[0] = DataType( 0.125) * (DataType(1) + point[1]) * (DataType(1) + point[2]);
582 data.phi[7].ref_grad[1] = DataType( 0.125) * (DataType(1) + point[2]) * (DataType(1) + point[0]);
583 data.phi[7].ref_grad[2] = DataType( 0.125) * (DataType(1) + point[0]) * (DataType(1) + point[1]);
584 }
585 }; // class Evaluator<...,Hypercube<3>>
586 } // namespace Lagrange1
587 } // namespace Space
588} // namespace FEAT
void eval_ref_gradients(EvalData_ &data, const DomainPointType &point) const
Evaluates the basis function gradients on the reference cell.
Definition: evaluator.hpp:339
ParametricEvaluator< Evaluator, TrafoEvaluator_, SpaceEvalTraits_, ref_caps > BaseClass
base-class typedef
Definition: evaluator.hpp:272
void eval_ref_values(EvalData_ &data, const DomainPointType &point) const
Evaluates the basis function values on the reference cell.
Definition: evaluator.hpp:321
ParametricEvaluator< Evaluator, TrafoEvaluator_, SpaceEvalTraits_, ref_caps > BaseClass
base-class typedef
Definition: evaluator.hpp:162
void eval_ref_gradients(EvalData_ &data, const DomainPointType &point) const
Evaluates the basis function gradients on the reference cell.
Definition: evaluator.hpp:231
void eval_ref_values(EvalData_ &data, const DomainPointType &point) const
Evaluates the basis function values on the reference cell.
Definition: evaluator.hpp:211
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:127
void eval_ref_values(EvalData_ &data, const DomainPointType &point) const
Evaluates the basis function values on the reference cell.
Definition: evaluator.hpp:419
void eval_ref_gradients(EvalData_ &data, const DomainPointType &point) const
Evaluates the basis function gradients on the reference cell.
Definition: evaluator.hpp:439
ParametricEvaluator< Evaluator, TrafoEvaluator_, SpaceEvalTraits_, ref_caps > BaseClass
base-class typedef
Definition: evaluator.hpp:370
ParametricEvaluator< Evaluator, TrafoEvaluator_, SpaceEvalTraits_, ref_caps > BaseClass
base-class typedef
Definition: evaluator.hpp:476
void eval_ref_values(EvalData_ &data, const DomainPointType &point) const
Evaluates the basis function values on the reference cell.
Definition: evaluator.hpp:525
void eval_ref_gradients(EvalData_ &data, const DomainPointType &point) const
Evaluates the basis function gradients on the reference cell.
Definition: evaluator.hpp:549
Lagrange-1 Element Evaluator class template declaration.
Definition: evaluator.hpp:35
Finite-Element Parametric Evaluator CRTP base-class template.
static constexpr SpaceTags ref_caps
Lagrange-1 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_grad
specifies whether the space should supply reference basis function gradients