FEAT 3
Finite Element Analysis Toolbox
Loading...
Searching...
No Matches
common_operators.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/assembly/bilinear_operator.hpp>
10#include <iostream>
11
12namespace FEAT
13{
14 namespace Assembly
15 {
22 namespace Common
23 {
36 public BilinearOperator
37 {
38 public:
39 static constexpr TrafoTags trafo_config = TrafoTags::none;
40 static constexpr SpaceTags test_config = SpaceTags::grad;
41 static constexpr SpaceTags trial_config = SpaceTags::grad;
42
51 template<typename AsmTraits_>
52 class Evaluator :
53 public BilinearOperator::Evaluator<AsmTraits_>
54 {
55 public:
57 typedef typename AsmTraits_::DataType DataType;
59 typedef typename AsmTraits_::TrafoData TrafoData;
61 typedef typename AsmTraits_::TestBasisData TestBasisData;
63 typedef typename AsmTraits_::TrialBasisData TrialBasisData;
66
67 public:
74 explicit Evaluator(const LaplaceOperator& DOXY(operat))
75 {
76 }
77
94 {
95 return dot(phi.grad, psi.grad);
96 }
97 }; // class LaplaceOperator::Evaluator<...>
98 }; // class LaplaceOperator
99
111 template<int dimension_>
113 public BilinearOperator
114 {
115 public:
117 static constexpr int BlockHeight = dimension_;
119 static constexpr int BlockWidth = dimension_;
120
121 static constexpr TrafoTags trafo_config = TrafoTags::none;
122 static constexpr SpaceTags test_config = SpaceTags::grad;
123 static constexpr SpaceTags trial_config = SpaceTags::grad;
124
133 template<typename AsmTraits_>
134 class Evaluator :
135 public BilinearOperator::Evaluator<AsmTraits_>
136 {
137 public:
139 typedef typename AsmTraits_::DataType DataType;
141 typedef typename AsmTraits_::TrafoData TrafoData;
143 typedef typename AsmTraits_::TestBasisData TestBasisData;
145 typedef typename AsmTraits_::TrialBasisData TrialBasisData;
148
149 public:
156 explicit Evaluator(const LaplaceOperatorBlocked& DOXY(operat))
157 {
158 }
159
176 {
177 ValueType r(DataType(0));
178 r.add_scalar_main_diag(Tiny::dot(phi.grad, psi.grad));
179 return r;
180 }
181 }; // class LaplaceOperatorBlocked::Evaluator<...>
182 }; // class LaplaceOperatorBlocked
183
213 {
214 public:
215 static constexpr TrafoTags trafo_config = TrafoTags::jac_det;
220
229 template<typename AsmTraits_>
230 class Evaluator :
232 {
233 public:
235 typedef typename AsmTraits_::DataType DataType;
237 typedef typename AsmTraits_::TrafoEvaluator TrafoEvaluator;
239 typedef typename AsmTraits_::TrafoData TrafoData;
241 typedef typename AsmTraits_::TestBasisData TestBasisData;
243 typedef typename AsmTraits_::TrialBasisData TrialBasisData;
246
247 private:
250
251 public:
252 explicit Evaluator(const LaplaceBeltramiOperator& DOXY(operat))
253 {
254 }
255
256 void set_point(const TrafoData& tau)
257 {
258 // compute the Jacobi-Gram matrix
259 gram_mat.set_gram(tau.jac_mat);
260 // and invert it
261 gram_inv.set_inverse(gram_mat);
262 }
263
280 {
281 return gram_inv.scalar_product(phi.ref_grad, psi.ref_grad);
282 }
283 }; // class LaplaceBeltramiOperator::Evaluator<...>
284 }; // class LaplaceBeltramiOperator
285
298 public BilinearOperator
299 {
300 public:
301 static constexpr TrafoTags trafo_config = TrafoTags::none;
302 static constexpr SpaceTags test_config = SpaceTags::hess;
303 static constexpr SpaceTags trial_config = SpaceTags::hess;
304
313 template<typename AsmTraits_>
314 class Evaluator :
315 public BilinearOperator::Evaluator<AsmTraits_>
316 {
317 public:
319 typedef typename AsmTraits_::DataType DataType;
321 typedef typename AsmTraits_::TrafoData TrafoData;
323 typedef typename AsmTraits_::TestBasisData TestBasisData;
325 typedef typename AsmTraits_::TrialBasisData TrialBasisData;
328
329 public:
336 explicit Evaluator(const BiharmonicOperator& DOXY(operat))
337 {
338 }
339
356 {
357 return phi.hess.trace() * psi.hess.trace();
358 }
359 }; // class BiharmonicOperator::Evaluator<...>
360 }; // class BiharmonicOperator
361
374 public BilinearOperator
375 {
376 public:
377 static constexpr TrafoTags trafo_config = TrafoTags::none;
378 static constexpr SpaceTags test_config = SpaceTags::value;
379 static constexpr SpaceTags trial_config = SpaceTags::value;
380
389 template<typename AsmTraits_>
390 class Evaluator :
391 public BilinearOperator::Evaluator<AsmTraits_>
392 {
393 public:
395 typedef typename AsmTraits_::DataType DataType;
397 typedef typename AsmTraits_::TrafoData TrafoData;
399 typedef typename AsmTraits_::TestBasisData TestBasisData;
401 typedef typename AsmTraits_::TrialBasisData TrialBasisData;
404
405 public:
412 explicit Evaluator(const IdentityOperator& DOXY(operat))
413 {
414 }
415
432 {
433 return phi.value * psi.value;
434 }
435 }; // class IdentityOperator::Evaluator<...>
436 }; // class IdentityOperator
437
447 template<int dimension_>
449 public BilinearOperator
450 {
451 public:
453 static constexpr int BlockHeight = dimension_;
455 static constexpr int BlockWidth = dimension_;
456
457 static constexpr TrafoTags trafo_config = TrafoTags::none;
458 static constexpr SpaceTags test_config = SpaceTags::value;
459 static constexpr SpaceTags trial_config = SpaceTags::value;
460
469 template<typename AsmTraits_>
470 class Evaluator :
471 public BilinearOperator::Evaluator<AsmTraits_>
472 {
473 public:
475 typedef typename AsmTraits_::DataType DataType;
479 typedef typename AsmTraits_::TrafoData TrafoData;
481 typedef typename AsmTraits_::TestBasisData TestBasisData;
483 typedef typename AsmTraits_::TrialBasisData TrialBasisData;
484
485 public:
492 explicit Evaluator(const IdentityOperatorBlocked& DOXY(operat))
493 {
494 }
495
512 {
513 ValueType r(DataType(0));
514 r.add_scalar_main_diag(phi.value * psi.value);
515 return r;
516 }
517 }; // class IdentityOperatorBlocked::Evaluator<...>
518 }; // class IdentityOperatorBlocked
519
532 public BilinearOperator
533 {
534 public:
536 int deriv;
537
538 static constexpr TrafoTags trafo_config = TrafoTags::none;
539 static constexpr SpaceTags test_config = SpaceTags::grad;
540 static constexpr SpaceTags trial_config = SpaceTags::value;
541
550 template<typename AsmTraits_>
551 class Evaluator :
552 public BilinearOperator::Evaluator<AsmTraits_>
553 {
554 public:
556 typedef typename AsmTraits_::DataType DataType;
558 typedef typename AsmTraits_::TrafoData TrafoData;
560 typedef typename AsmTraits_::TestBasisData TestBasisData;
562 typedef typename AsmTraits_::TrialBasisData TrialBasisData;
565
566 protected:
568 const int deriv;
569
570 public:
577 explicit Evaluator(const TrialDerivativeOperator& operat) :
578 deriv(operat.deriv)
579 {
580 }
581
582 // copy pasted since Doxygen does not like the operator part in
583 // \copydoc BilinearOperator::Evaluator::operator()
600 {
601 return phi.value * psi.grad[deriv];
602 }
603 }; // class TrialDerivativeOperator::Evaluator<...>
604
605 /*
606 *
607 * \param[in] derivative
608 * The index of the derivative for this operator:
609 * - 0: X-derivative
610 * - 1: Y-derivative
611 * - 2: Z-derivative
612 * - ...
613 */
614 explicit TrialDerivativeOperator(int derivative) :
615 deriv(derivative)
616 {
617 }
618 }; // class TrialDerivativeOperator
619
632 public BilinearOperator
633 {
634 public:
636 int deriv;
637
638 static constexpr TrafoTags trafo_config = TrafoTags::none;
639 static constexpr SpaceTags test_config = SpaceTags::grad;
640 static constexpr SpaceTags trial_config = SpaceTags::value;
641
650 template<typename AsmTraits_>
651 class Evaluator :
652 public BilinearOperator::Evaluator<AsmTraits_>
653 {
654 public:
656 typedef typename AsmTraits_::DataType DataType;
658 typedef typename AsmTraits_::TrafoData TrafoData;
660 typedef typename AsmTraits_::TestBasisData TestBasisData;
662 typedef typename AsmTraits_::TrialBasisData TrialBasisData;
665
666 protected:
668 const int deriv;
669
670 public:
677 explicit Evaluator(const TestDerivativeOperator& operat) :
678 deriv(operat.deriv)
679 {
680 }
681
682 // copy pasted since Doxygen does not like the operator part in
683 // \copydoc BilinearOperator::Evaluator::operator()
700 {
701 return phi.value * psi.grad[deriv];
702 }
703 }; // class TestDerivativeOperator::Evaluator<...>
704
705 /*
706 *
707 * \param[in] derivative
708 * The index of the derivative for this operator:
709 * - 0: X-derivative
710 * - 1: Y-derivative
711 * - 2: Z-derivative
712 * - ...
713 */
714 explicit TestDerivativeOperator(int derivative) :
715 deriv(derivative)
716 {
717 }
718 }; // class TestDerivativeOperator
719
727 {
728 public:
730 int ir;
732 int ic;
733
734 static constexpr TrafoTags trafo_config = TrafoTags::none;
735 static constexpr SpaceTags test_config = SpaceTags::grad;
736 static constexpr SpaceTags trial_config = SpaceTags::grad;
737
738 template<typename AsmTraits_>
739 class Evaluator :
741 {
742 public:
744 typedef typename AsmTraits_::DataType DataType;
746 typedef typename AsmTraits_::TrafoData TrafoData;
748 typedef typename AsmTraits_::TestBasisData TestBasisData;
750 typedef typename AsmTraits_::TrialBasisData TrialBasisData;
753
754 protected:
756 const int ir;
758 const int ic;
759
760 public:
767 explicit Evaluator(const DivDivOperator& operat) :
768 ir(operat.ir), ic(operat.ic)
769 {
770 }
771
788 {
789 return phi.grad[ic] * psi.grad[ir];
790 }
791 }; // class DivDivOperator::Evaluator<...>
792
802 explicit DivDivOperator(int ir_, int ic_) :
803 ir(ir_), ic(ic_)
804 {
805 }
806 }; // class DivDivOperator
807
834 public BilinearOperator
835 {
836 public:
838 int ir;
840 int ic;
841
842 static constexpr TrafoTags trafo_config = TrafoTags::none;
843 static constexpr SpaceTags test_config = SpaceTags::grad;
844 static constexpr SpaceTags trial_config = SpaceTags::grad;
845
854 template<typename AsmTraits_>
855 class Evaluator :
856 public BilinearOperator::Evaluator<AsmTraits_>
857 {
858 public:
860 typedef typename AsmTraits_::DataType DataType;
862 typedef typename AsmTraits_::TrafoData TrafoData;
864 typedef typename AsmTraits_::TestBasisData TestBasisData;
866 typedef typename AsmTraits_::TrialBasisData TrialBasisData;
869
870 protected:
872 const int ir;
874 const int ic;
875
876 public:
883 explicit Evaluator(const DuDvOperator& operat) :
884 ir(operat.ir), ic(operat.ic)
885 {
886 }
887
904 {
905 return ((ir==ic) ? dot(phi.grad,psi.grad) : DataType(0)) + phi.grad[ir] * psi.grad[ic];
906 }
907 }; // class DuDvOperator::Evaluator<...>
908
918 explicit DuDvOperator(int ir_, int ic_) :
919 ir(ir_), ic(ic_)
920 {
921 }
922 }; // class DuDvOperator
923
948 template<int dimension_>
950 public BilinearOperator
951 {
952 public:
954 static constexpr int BlockHeight = dimension_;
956 static constexpr int BlockWidth = dimension_;
957
958 static constexpr TrafoTags trafo_config = TrafoTags::none;
959 static constexpr SpaceTags test_config = SpaceTags::grad;
960 static constexpr SpaceTags trial_config = SpaceTags::grad;
961
970 template<typename AsmTraits_>
971 class Evaluator :
972 public BilinearOperator::Evaluator<AsmTraits_>
973 {
974 public:
976 typedef typename AsmTraits_::DataType DataType;
980 typedef typename AsmTraits_::TrafoData TrafoData;
982 typedef typename AsmTraits_::TestBasisData TestBasisData;
984 typedef typename AsmTraits_::TrialBasisData TrialBasisData;
985
986 public:
993 explicit Evaluator(const DuDvOperatorBlocked& DOXY(operat))
994 {
995 }
996
1013 {
1014 ValueType r(DataType(0));
1015 r.set_outer_product(phi.grad, psi.grad);
1016 r.add_scalar_main_diag(Tiny::dot(phi.grad, psi.grad));
1017 return r;
1018 }
1019
1020 /*OperatorValueType operator()(const TrialBasisData& phi, const TestBasisData& psi)
1021 {
1022 OperatorValueType r(DataType(0));
1023 for(int i(0); i < OperatorValueType::m; ++i)
1024 {
1025 r(i,i) = dot(phi.grad, psi.grad) + phi.grad[i]*psi.grad[i];
1026 for(int j(0); j < i; ++j)
1027 {
1028 r(i,j) = phi.grad[i] * psi.grad[j];
1029 r(j,i) = phi.grad[j] * psi.grad[i];
1030 }
1031 }
1032 return r;
1033 }*/
1034 }; // class DuDvOperatorBlocked::Evaluator<...>
1035 }; // class DuDVOperatorBlocked
1036
1055 template<int dimension_>
1057 public BilinearOperator
1058 {
1059 public:
1060 static constexpr int BlockHeight = dimension_;
1061 static constexpr int BlockWidth = dimension_;
1062
1063 static constexpr TrafoTags trafo_config = TrafoTags::normal;
1064 static constexpr SpaceTags test_config = SpaceTags::value;
1065 static constexpr SpaceTags trial_config = SpaceTags::grad;
1066
1067 template<typename AsmTraits_>
1069 public BilinearOperator::Evaluator<AsmTraits_>
1070 {
1071 public:
1073 typedef typename AsmTraits_::DataType DataType;
1077 typedef typename AsmTraits_::TrafoData TrafoData;
1079 typedef typename AsmTraits_::TestBasisData TestBasisData;
1081 typedef typename AsmTraits_::TrialBasisData TrialBasisData;
1082
1083 protected:
1085
1086 public:
1087 explicit Evaluator(const NormalGradientTrialOperatorBlocked&) : _normal(DataType(0))
1088 {
1089 }
1090
1091 void set_point(const TrafoData& tau)
1092 {
1093 _normal = tau.normal;
1094 }
1095
1096 ValueType eval(const TrialBasisData& phi, const TestBasisData& psi)
1097 {
1098 ValueType r(DataType(0));
1099 r.add_scalar_main_diag(Tiny::dot(_normal, phi.grad) * psi.value);
1100
1101 return r;
1102 }
1103 }; // class NormalGradientTrialOperatorBlocked::Evaluator<...>
1104 }; // class NormalGradientTrialOperatorBlocked
1105
1124 template<int dimension_>
1126 public BilinearOperator
1127 {
1128 public:
1129 static constexpr int BlockHeight = dimension_;
1130 static constexpr int BlockWidth = dimension_;
1131
1132 static constexpr TrafoTags trafo_config = TrafoTags::normal;
1133 static constexpr SpaceTags test_config = SpaceTags::value;
1134 static constexpr SpaceTags trial_config = SpaceTags::grad;
1135
1136 template<typename AsmTraits_>
1138 public BilinearOperator::Evaluator<AsmTraits_>
1139 {
1140 public:
1142 typedef typename AsmTraits_::DataType DataType;
1146 typedef typename AsmTraits_::TrafoData TrafoData;
1148 typedef typename AsmTraits_::TestBasisData TestBasisData;
1150 typedef typename AsmTraits_::TrialBasisData TrialBasisData;
1151
1152 protected:
1154
1155 public:
1157 {
1158 }
1159
1160 void set_point(const TrafoData& tau)
1161 {
1162 _normal = tau.normal;
1163 }
1164
1165 ValueType eval(const TrialBasisData& phi, const TestBasisData& psi)
1166 {
1167 ValueType r(DataType(0));
1168 r.add_outer_product(phi.grad, _normal, psi.value);
1169 return r;
1170 }
1171 }; // class NormalTransposedGradientTrialOperatorBlocked::Evaluator<...>
1172
1173 }; // class NormalTransposedGradientTrialOperatorBlocked
1174
1183 template<int dimension_>
1185 public BilinearOperator
1186 {
1187 public:
1188 static constexpr int BlockHeight = dimension_;
1189 static constexpr int BlockWidth = 1;
1190
1191 static constexpr TrafoTags trafo_config = TrafoTags::none;
1192 static constexpr SpaceTags test_config = SpaceTags::value;
1193 static constexpr SpaceTags trial_config = SpaceTags::grad;
1194
1195 template<typename AsmTraits_>
1197 public BilinearOperator::Evaluator<AsmTraits_>
1198 {
1199 public:
1201 typedef typename AsmTraits_::DataType DataType;
1205 typedef typename AsmTraits_::TrafoData TrafoData;
1207 typedef typename AsmTraits_::TestBasisData TestBasisData;
1209 typedef typename AsmTraits_::TrialBasisData TrialBasisData;
1210
1211 public:
1213 {
1214 }
1215
1216 ValueType eval(const TrialBasisData& phi, const TestBasisData& psi)
1217 {
1218 ValueType r(DataType(0));
1219 for(int i(0); i < dimension_; ++i)
1220 r(i,0) = phi.grad[i] * psi.value;
1221 return r;
1222 }
1223 }; // class GradientTrialOperatorBlocked::Evaluator<...>
1224 }; // class GradientTrialOperatorBlocked
1225
1234 template<int dimension_>
1236 public BilinearOperator
1237 {
1238 public:
1239 static constexpr int BlockHeight = dimension_;
1240 static constexpr int BlockWidth = 1;
1241
1242 static constexpr TrafoTags trafo_config = TrafoTags::none;
1243 static constexpr SpaceTags test_config = SpaceTags::grad;
1244 static constexpr SpaceTags trial_config = SpaceTags::value;
1245
1246 template<typename AsmTraits_>
1248 public BilinearOperator::Evaluator<AsmTraits_>
1249 {
1250 public:
1252 typedef typename AsmTraits_::DataType DataType;
1256 typedef typename AsmTraits_::TrafoData TrafoData;
1258 typedef typename AsmTraits_::TestBasisData TestBasisData;
1260 typedef typename AsmTraits_::TrialBasisData TrialBasisData;
1261
1262 public:
1263 explicit Evaluator(const GradientTestOperatorBlocked&)
1264 {
1265 }
1266
1267 ValueType eval(const TrialBasisData& phi, const TestBasisData& psi)
1268 {
1269 ValueType r(DataType(0));
1270 for(int i(0); i < dimension_; ++i)
1271 r(i,0) = phi.value * psi.grad[i];
1272 return r;
1273 }
1274 }; // class GradientTestOperatorBlocked::Evaluator<...>
1275 }; // class GradientTestOperatorBlocked
1276
1298 template<int dim_, int nsc_>
1301 {
1302 public:
1303 static constexpr int BlockHeight = dim_;
1304 static constexpr int BlockWidth = nsc_;
1305
1306 static constexpr TrafoTags trafo_config = TrafoTags::none;
1307 static constexpr SpaceTags test_config = SpaceTags::value;
1308 static constexpr SpaceTags trial_config = SpaceTags::grad;
1309
1310 template<typename AsmTraits_>
1312 public BilinearOperator::Evaluator<AsmTraits_>
1313 {
1314 public:
1316 typedef typename AsmTraits_::TestBasisData TestBasisData;
1317 typedef typename AsmTraits_::TrialBasisData TrialBasisData;
1318
1319 public:
1320 explicit Evaluator(const StressDivergenceOperator& DOXY(operat)) {}
1321
1323 template<typename T_>
1324 static void eval(Tiny::Matrix<T_, 2, 4, 2, 4>& R, const Tiny::Vector<T_, 2, 2>& der, const T_ u)
1325 {
1326 // u_1 = dx sigma_11 + dy sigma_12 = dx sigma_1 + dy sigma_2
1327 // = (dx, dy, 0, 0) : (sigma_11, sigma_12, sigma_21, sigma_22)
1328 R(0,0) = u * der(0);
1329 R(0,1) = u * der(1);
1330 R(0,2) = T_(0);
1331 R(0,3) = T_(0);
1332
1333 // u_2 = dx sigma_21 + dy sigma_22 = dx sigma_3 + dy sigma_2
1334 // = (0, 0, dx, dy) : (sigma_11, sigma_12, sigma_21, sigma_22)
1335 R(1,0) = T_(0);
1336 R(1,1) = T_(0);
1337 R(1,2) = u * der(0);
1338 R(1,3) = u * der(1);
1339 }
1340
1342 template<typename T_>
1343 static void eval(Tiny::Matrix<T_, 2, 3, 2, 3>& R, const Tiny::Vector<T_, 2, 2>& der, const T_ u)
1344 {
1345 // we have:
1346 // [ sigma_11 sigma_12 ] [ sigma_1 sigma_3 ]
1347 // [ sigma_21 sigma_22 ] = [ sigma_3 sigma_2 ]
1348
1349 // u_1 = dx sigma_11 + dy sigma_12 = dx sigma_1 + dy sigma_3
1350 // = (dx, 0, dy) : (sigma_11, sigma_22, sigma_12)
1351 R(0,0) = u * der(0);
1352 R(0,1) = T_(0);
1353 R(0,2) = u * der(1);
1354
1355 // u_2 = dx sigma_21 + dy sigma_22 = dx sigma_3 + dy sigma_2
1356 // = (0, dy, dx) : (sigma_11, sigma_22, sigma_12)
1357 R(1,0) = T_(0);
1358 R(1,1) = u * der(1);
1359 R(1,2) = u * der(0);
1360 }
1361
1363 template<typename T_>
1364 static void eval(Tiny::Matrix<T_, 3, 9, 3, 9>& R, const Tiny::Vector<T_, 3, 3>& der, const T_ u)
1365 {
1366 // u_1 = dx sigma_11 + dy sigma_12 + dz sigma_13 = dx sigma_1 + dy sigma_2 + dz sigma_3
1367 R(0,0) = u * der(0);
1368 R(0,1) = u * der(1);
1369 R(0,2) = u * der(2);
1370 R(0,3) = T_(0);
1371 R(0,4) = T_(0);
1372 R(0,5) = T_(0);
1373 R(0,6) = T_(0);
1374 R(0,7) = T_(0);
1375 R(0,8) = T_(0);
1376
1377 // u_2 = dx sigma_21 + dy sigma_22 + dz sigma_23 = dx sigma_4 + dy sigma_5 + dz sigma_6
1378 R(1,0) = T_(0);
1379 R(1,1) = T_(0);
1380 R(1,2) = T_(0);
1381 R(1,3) = u * der(0);
1382 R(1,4) = u * der(1);
1383 R(1,5) = u * der(2);
1384 R(1,6) = T_(0);
1385 R(1,7) = T_(0);
1386 R(1,8) = T_(0);
1387
1388 // u_3 = dx sigma_31 + dy sigma_32 + dz sigma_33 = dx sigma_7 + dy sigma_8 + dz sigma_9
1389 R(2,0) = T_(0);
1390 R(2,1) = T_(0);
1391 R(2,2) = T_(0);
1392 R(2,3) = T_(0);
1393 R(2,4) = T_(0);
1394 R(2,5) = T_(0);
1395 R(2,6) = u * der(0);
1396 R(2,7) = u * der(1);
1397 R(2,8) = u * der(2);
1398 }
1399
1401 template<typename T_>
1402 static void eval(Tiny::Matrix<T_, 3, 6, 3, 6>& R, const Tiny::Vector<T_, 3, 3>& der, const T_ u)
1403 {
1404 // we have:
1405 // [ sigma_11 sigma_12 sigma_13 ] [ sigma_1 sigma_4 sigma_6 ]
1406 // [ sigma_21 sigma_22 sigma_23 ] = [ sigma_4 sigma_2 sigma_5 ]
1407 // [ sigma_22 sigma_23 sigma_33 ] [ sigma_6 sigma_5 sigma_3 ]
1408
1409 // u_1 = dx sigma_11 + dy sigma_12 + dz sigma_13 = dx sigma_1 + dy sigma_4 + dz sigma_6
1410 R(0,0) = u * der(0);
1411 R(0,1) = T_(0);
1412 R(0,2) = T_(0);
1413 R(0,3) = u * der(1);
1414 R(0,4) = T_(0);
1415 R(0,5) = u * der(2);
1416
1417 // u_2 = dx sigma_21 + dy sigma_22 + dz sigma_23 = dx sigma_4 + dy sigma_2 + dz sigma_5
1418 R(1,0) = T_(0);
1419 R(1,1) = u * der(1);
1420 R(1,2) = T_(0);
1421 R(1,3) = u * der(0);
1422 R(1,4) = u * der(2);
1423 R(1,5) = T_(0);
1424
1425 // u_3 = dx sigma_31 + dy sigma_32 + dz sigma_33 = dx sigma_6 + dy sigma_5 + dz sigma_3
1426 R(2,0) = T_(0);
1427 R(2,1) = T_(0);
1428 R(2,2) = u * der(2);
1429 R(2,3) = T_(0);
1430 R(2,4) = u * der(1);
1431 R(2,5) = u * der(0);
1432 }
1433
1434 ValueType eval(const TrialBasisData& phi, const TestBasisData& psi)
1435 {
1436 ValueType R;
1437 eval(R, phi.grad, psi.value);
1438 return R;
1439 }
1440 }; // class StressDivergenceOperator::Evaluator
1441 }; // class StressDivergenceOperator
1442
1464 template<int dim_, int nsc_>
1467 {
1468 public:
1469 static constexpr int BlockHeight = nsc_;
1470 static constexpr int BlockWidth = dim_;
1471
1472 static constexpr TrafoTags trafo_config = TrafoTags::none;
1473 static constexpr SpaceTags test_config = SpaceTags::value;
1474 static constexpr SpaceTags trial_config = SpaceTags::grad;
1475
1476 template<typename AsmTraits_>
1478 public BilinearOperator::Evaluator<AsmTraits_>
1479 {
1480 public:
1482 typedef typename AsmTraits_::TestBasisData TestBasisData;
1483 typedef typename AsmTraits_::TrialBasisData TrialBasisData;
1484
1485 public:
1486 explicit Evaluator(const StrainRateTensorOperator& DOXY(operat)) {}
1487
1489 template<typename T_>
1490 static void eval(Tiny::Matrix<T_, 4, 2, 4, 2>& K, const Tiny::Vector<T_, 2, 2>& der, const T_ s)
1491 {
1492 // sigma_1 [11] = dx u_1 = (dx, 0) : (u_1, u_2)
1493 K(0,0) = s * der(0);
1494 K(0,1) = T_(0);
1495
1496 // sigma_2 [12] = 1/2 * (dy u_1 + dx u_2) = 1/2 * (dy, dx) : (u_1, u_2)
1497 K(1,0) = s * der(1) / T_(2);
1498 K(1,1) = s * der(0) / T_(2);
1499
1500 // sigma_3 [21] = 1/2 * (dy u_1 + dx u_2) = 1/2 * (dy, dx) : (u_1, u_2)
1501 K(2,0) = s * der(1) / T_(2);
1502 K(2,1) = s * der(0) / T_(2);
1503
1504 // sigma_4 [22] = dy u_2 = (0, dy) : (u_1, u_2)
1505 K(3,0) = T_(0);
1506 K(3,1) = s * der(1);
1507 }
1508
1510 template<typename T_>
1511 static void eval(Tiny::Matrix<T_, 3, 2, 3, 2>& K, const Tiny::Vector<T_, 2, 2>& der, const T_ s)
1512 {
1513 // we have:
1514 // [ sigma_11 sigma_12 ] [ sigma_1 sigma_3 ]
1515 // [ sigma_21 sigma_22 ] = [ sigma_3 sigma_2 ]
1516
1517 // sigma_1 [11] = dx u_1 = (dx, 0) : (u_1, u_2)
1518 K(0,0) = s * der(0);
1519 K(0,1) = T_(0);
1520
1521 // sigma_2 [22] = dy u_2 = (0, dy) : (u_1, u_2)
1522 K(1,0) = T_(0);
1523 K(1,1) = s * der(1);
1524
1525 // sigma_3 [12] = 1/2 * (dy u_1 + dx u_2) = 1/2 * (dy, dx) : (u_1, u_2)
1526 K(2,0) = s * der(1) / T_(2);
1527 K(2,1) = s * der(0) / T_(2);
1528 }
1529
1531 template<typename T_>
1532 static void eval(Tiny::Matrix<T_, 9, 3, 9, 3>& K, const Tiny::Vector<T_, 3, 3>& der, const T_ s)
1533 {
1534 // sigma_1 [11] = dx u_1 = (dx, 0, 0) : (u_1, u_2, u_3)
1535 K(0,0) = s * der(0);
1536 K(0,1) = T_(0);
1537 K(0,2) = T_(0);
1538
1539 // sigma_2 [12] = 1/2 * (dy u_1 + dx u_2) = 1/2 * (dy, dx, 0) : (u_1, u_2, u_3)
1540 K(1,0) = s * der(1) / T_(2);
1541 K(1,1) = s * der(0) / T_(2);
1542 K(1,2) = T_(0);
1543
1544 // sigma_3 [13] = 1/2 * (dz u_1 + dx u_3) = 1/2 * (dz, 0, dx) : (u_1, u_2, u_3)
1545 K(2,0) = s * der(2) / T_(2);
1546 K(2,1) = T_(0);
1547 K(2,2) = s * der(0) / T_(2);
1548
1549 // sigma_4 [21] = 1/2 * (dx u_2 + dy u_1) = 1/2 * (dy, dx, 0) : (u_1, u_2, u_3)
1550 K(3,0) = s * der(1) / T_(2);
1551 K(3,1) = s * der(0) / T_(2);
1552 K(3,2) = T_(0);
1553
1554 // sigma_5 [22] = dy u_2 = (0, dy, 0) : (u_1, u_2, u_3)
1555 K(4,0) = T_(0);
1556 K(4,1) = s * der(1);
1557 K(4,2) = T_(0);
1558
1559 // sigma_6 [23] = 1/2 * (dz u_2 + dy u_3) = 1/2 * (0, dz, dy) : (u_1, u_2, u_3)
1560 K(5,0) = T_(0);
1561 K(5,1) = s * der(2) / T_(2);
1562 K(5,2) = s * der(1) / T_(2);
1563
1564 // sigma_7 [31] = 1/2 * (dx u_3 + dz u_1) = 1/2 * (dz, 0, dx) : (u_1, u_2, u_3)
1565 K(6,0) = s * der(2) / T_(2);
1566 K(6,1) = T_(0);
1567 K(6,1) = s * der(0) / T_(2);
1568
1569 // sigma_8 [32] = 1/2 * (dy u_3 + dz u_2) = 1/2 * (0, dz, dy) : (u_1, u_2, u_3)
1570 K(7,0) = T_(0);
1571 K(7,1) = s * der(2) / T_(2);
1572 K(7,2) = s * der(1) / T_(2);
1573
1574 // sigma_9 [33] = dz u3 = (0, 0, dz) : (u_1, u_2, u_3)
1575 K(8,0) = T_(0);
1576 K(8,1) = T_(0);
1577 K(8,2) = s * der(2);
1578 }
1579
1581 template<typename T_>
1582 static void eval(Tiny::Matrix<T_, 6, 3, 6, 3>& K, const Tiny::Vector<T_, 3, 3>& der, const T_ s)
1583 {
1584 // we have:
1585 // [ sigma_11 sigma_12 sigma_13 ] [ sigma_1 sigma_4 sigma_6 ]
1586 // [ sigma_21 sigma_22 sigma_23 ] = [ sigma_4 sigma_2 sigma_5 ]
1587 // [ sigma_22 sigma_23 sigma_33 ] [ sigma_6 sigma_5 sigma_3 ]
1588
1589 // sigma_1 [11] = dx u_1 = (dx, 0, 0) : (u_1, u_2, u_3)
1590 K(0,0) = s * der(0);
1591 K(0,1) = T_(0);
1592 K(0,2) = T_(0);
1593
1594 // sigma_2 [22] = dy u_2 = (0, dy, 0) : (u_1, u_2, u_3)
1595 K(1,0) = T_(0);
1596 K(1,1) = s * der(1);
1597 K(1,2) = T_(0);
1598
1599 // sigma_3 [33] = dz u3 = (0, 0, dz) : (u_1, u_2, u_3)
1600 K(2,0) = T_(0);
1601 K(2,1) = T_(0);
1602 K(2,2) = s * der(2);
1603
1604 // sigma_4 [12] = 1/2 * (dy u_1 + dx u_2) = 1/2 * (dy, dx, 0) : (u_1, u_2, u_3)
1605 K(3,0) = s * der(1) / T_(2);
1606 K(3,1) = s * der(0) / T_(2);
1607 K(3,2) = T_(0);
1608
1609 // sigma_5 [23] = 1/2 * (dz u_2 + dy u_3) = 1/2 * (0, dz, dy) : (u_1, u_2, u_3)
1610 K(4,0) = T_(0);
1611 K(4,1) = s * der(2) / T_(2);
1612 K(4,2) = s * der(1) / T_(2);
1613
1614 // sigma_6 [13] = 1/2 * (dz u_1 + dx u_3) = 1/2 * (dz, 0, dx) : (u_1, u_2, u_3)
1615 K(5,0) = s * der(2) / T_(2);
1616 K(5,1) = T_(0);
1617 K(5,2) = s * der(0) / T_(2);
1618 }
1619
1620 ValueType eval(const TrialBasisData& phi, const TestBasisData& psi)
1621 {
1622 ValueType K;
1623 eval(K, phi.grad, psi.value);
1624 return K;
1625 }
1626 }; // class StrainRateTensorOperator::Evaluator
1627 }; // class StrainRateTensorOperator
1628 } // namespace Common
1629 } // namespace Assembly
1630} // namespace FEAT
Bilinear Operator Evaluator class template.
Base class for Bilinear Operators.
AsmTraits_::TrialBasisData TrialBasisData
the assembler's trial-function data type
AsmTraits_::TrafoData TrafoData
the assembler's trafo data type
ValueType eval(const TrialBasisData &phi, const TestBasisData &psi)
Evaluation operator.
Evaluator(const BiharmonicOperator &operat)
Constructor.
AsmTraits_::DataType DataType
the data type to be used
AsmTraits_::TestBasisData TestBasisData
the assembler's test-function data type
Biharmonic "Laplace^2" operator implementation.
AsmTraits_::DataType DataType
the data type to be used
AsmTraits_::TrafoData TrafoData
the assembler's trafo data type
AsmTraits_::TrialBasisData TrialBasisData
the assembler's trial-function data type
ValueType eval(const TrialBasisData &phi, const TestBasisData &psi)
Evaluation operator.
Evaluator(const DivDivOperator &operat)
Constructor.
AsmTraits_::TestBasisData TestBasisData
the assembler's test-function data type
div(phi) * div(psi) operator implementation
DivDivOperator(int ir_, int ic_)
Constructor.
Evaluator(const DuDvOperator &operat)
Constructor.
AsmTraits_::DataType DataType
the data type to be used
AsmTraits_::TrafoData TrafoData
the assembler's trafo data type
DataType ValueType
the operator's value type
AsmTraits_::TestBasisData TestBasisData
the assembler's test-function data type
ValueType eval(const TrialBasisData &phi, const TestBasisData &psi)
Evaluation operator.
AsmTraits_::TrialBasisData TrialBasisData
the assembler's trial-function data type
ValueType eval(const TrialBasisData &phi, const TestBasisData &psi)
Evaluation operator.
AsmTraits_::TrafoData TrafoData
the assembler's trafo data type
Evaluator(const DuDvOperatorBlocked &operat)
Constructor.
Tiny::Matrix< DataType, dimension_, dimension_ > ValueType
the data type for the block system
AsmTraits_::TrialBasisData TrialBasisData
the assembler's trial-function data type
AsmTraits_::TestBasisData TestBasisData
the assembler's test-function data type
AsmTraits_::DataType DataType
the data type to be used
static constexpr int BlockWidth
Every block is a dimension x dimension matrix.
static constexpr int BlockHeight
Every block is a dimension x dimension matrix.
Du:Dv operator implementation.
DuDvOperator(int ir_, int ic_)
Constructor.
AsmTraits_::DataType DataType
the data type to be used
AsmTraits_::TestBasisData TestBasisData
the assembler's test-function data type
AsmTraits_::TrafoData TrafoData
the assembler's trafo data type
Tiny::Matrix< DataType, dimension_, 1 > ValueType
the data type for the block system
AsmTraits_::TrialBasisData TrialBasisData
the assembler's trial-function data type
Gradient operator applied onto the test function.
AsmTraits_::TestBasisData TestBasisData
the assembler's test-function data type
AsmTraits_::TrafoData TrafoData
the assembler's trafo data type
Tiny::Matrix< DataType, dimension_, 1 > ValueType
the data type for the block system
AsmTraits_::TrialBasisData TrialBasisData
the assembler's trial-function data type
Gradient operator applied onto the trial function.
Bilinear scalar Identity evaluator class template.
AsmTraits_::TrialBasisData TrialBasisData
the assembler's trial-function data type
AsmTraits_::TrafoData TrafoData
the assembler's trafo data type
Evaluator(const IdentityOperator &operat)
Constructor.
ValueType eval(const TrialBasisData &phi, const TestBasisData &psi)
Evaluation operator.
AsmTraits_::DataType DataType
the data type to be used
AsmTraits_::TestBasisData TestBasisData
the assembler's test-function data type
Vector-valued identity operator evaluator class template.
AsmTraits_::TrialBasisData TrialBasisData
the assembler's trial-function data type
AsmTraits_::DataType DataType
the data type to be used
Evaluator(const IdentityOperatorBlocked &operat)
Constructor.
AsmTraits_::TestBasisData TestBasisData
the assembler's test-function data type
AsmTraits_::TrafoData TrafoData
the assembler's trafo data type
Tiny::Matrix< DataType, dimension_, dimension_ > ValueType
the data type for the block system
ValueType eval(const TrialBasisData &phi, const TestBasisData &psi)
Evaluation operator.
Vector-valued identity operator implementation.
static constexpr int BlockHeight
Every block is a dimension x dimension matrix.
static constexpr int BlockWidth
Every block is a dimension x dimension matrix.
Identity operator implementation.
AsmTraits_::TestBasisData TestBasisData
the assembler's test-function data type
ValueType eval(const TrialBasisData &phi, const TestBasisData &psi)
Evaluation operator.
Tiny::Matrix< DataType, TrafoEvaluator::domain_dim, TrafoEvaluator::domain_dim > gram_mat
the transformation Gram matrix and its inverse
AsmTraits_::DataType DataType
the data type to be used
AsmTraits_::TrialBasisData TrialBasisData
the assembler's trial-function data type
AsmTraits_::TrafoEvaluator TrafoEvaluator
trafo evaluator type
AsmTraits_::TrafoData TrafoData
the assembler's trafo data type
Laplace-Beltrami operator implementation.
static constexpr SpaceTags trial_config
we need reference gradients from the trial space
static constexpr SpaceTags test_config
we need reference gradients from the test space
ValueType eval(const TrialBasisData &phi, const TestBasisData &psi)
Evaluation operator.
AsmTraits_::TrialBasisData TrialBasisData
the assembler's trial-function data type
AsmTraits_::TestBasisData TestBasisData
the assembler's test-function data type
AsmTraits_::TrafoData TrafoData
the assembler's trafo data type
Evaluator(const LaplaceOperator &operat)
Constructor.
AsmTraits_::DataType DataType
the data type to be used
AsmTraits_::TrialBasisData TrialBasisData
the assembler's trial-function data type
Evaluator(const LaplaceOperatorBlocked &operat)
Constructor.
ValueType eval(const TrialBasisData &phi, const TestBasisData &psi)
Evaluation operator.
AsmTraits_::TrafoData TrafoData
the assembler's trafo data type
Tiny::Matrix< DataType, dimension_, dimension_ > ValueType
the operator's value type
AsmTraits_::DataType DataType
the data type to be used
AsmTraits_::TestBasisData TestBasisData
the assembler's test-function data type
static constexpr int BlockWidth
Every block is a dimension x dimension matrix.
static constexpr int BlockHeight
Every block is a dimension x dimension matrix.
-Laplace operator implementation
AsmTraits_::TrialBasisData TrialBasisData
the assembler's trial-function data type
Tiny::Matrix< DataType, dimension_, dimension_ > ValueType
the data type for the block system
AsmTraits_::TestBasisData TestBasisData
the assembler's test-function data type
AsmTraits_::TrafoData TrafoData
the assembler's trafo data type
AsmTraits_::TrialBasisData TrialBasisData
the assembler's trial-function data type
Tiny::Matrix< DataType, dimension_, dimension_ > ValueType
the data type for the block system
AsmTraits_::TestBasisData TestBasisData
the assembler's test-function data type
static void eval(Tiny::Matrix< T_, 6, 3, 6, 3 > &K, const Tiny::Vector< T_, 3, 3 > &der, const T_ s)
symmetric 3D version with 6 stress components
static void eval(Tiny::Matrix< T_, 4, 2, 4, 2 > &K, const Tiny::Vector< T_, 2, 2 > &der, const T_ s)
unsymmetric 2D version with 4 stress components
static void eval(Tiny::Matrix< T_, 3, 2, 3, 2 > &K, const Tiny::Vector< T_, 2, 2 > &der, const T_ s)
symmetric 2D version with 3 stress components
static void eval(Tiny::Matrix< T_, 9, 3, 9, 3 > &K, const Tiny::Vector< T_, 3, 3 > &der, const T_ s)
unsymmetric 3D version with 9 stress components
static void eval(Tiny::Matrix< T_, 3, 9, 3, 9 > &R, const Tiny::Vector< T_, 3, 3 > &der, const T_ u)
unsymmetric 3D version with 9 stress components
static void eval(Tiny::Matrix< T_, 2, 4, 2, 4 > &R, const Tiny::Vector< T_, 2, 2 > &der, const T_ u)
unsymmetric 2D version with 4 stress components
static void eval(Tiny::Matrix< T_, 3, 6, 3, 6 > &R, const Tiny::Vector< T_, 3, 3 > &der, const T_ u)
symmetric 3D version with 6 stress components
static void eval(Tiny::Matrix< T_, 2, 3, 2, 3 > &R, const Tiny::Vector< T_, 2, 2 > &der, const T_ u)
symmetric 2D version with 3 stress components
AsmTraits_::TestBasisData TestBasisData
the assembler's test-function data type
ValueType eval(const TrialBasisData &phi, const TestBasisData &psi)
Evaluation operator.
Evaluator(const TestDerivativeOperator &operat)
Constructor.
AsmTraits_::TrafoData TrafoData
the assembler's trafo data type
AsmTraits_::DataType DataType
the data type to be used
AsmTraits_::TrialBasisData TrialBasisData
the assembler's trial-function data type
Test-Derivative operator implementation.
ValueType eval(const TrialBasisData &phi, const TestBasisData &psi)
Evaluation operator.
AsmTraits_::DataType DataType
the data type to be used
AsmTraits_::TrialBasisData TrialBasisData
the assembler's trial-function data type
Evaluator(const TrialDerivativeOperator &operat)
Constructor.
AsmTraits_::TestBasisData TestBasisData
the assembler's test-function data type
AsmTraits_::TrafoData TrafoData
the assembler's trafo data type
Trial-Derivative operator implementation.
Tiny Matrix class template.
CUDA_HOST_DEVICE Matrix & add_scalar_main_diag(DataType alpha)
Adds a value onto the matrix's main diagonal.
CUDA_HOST_DEVICE Matrix & set_inverse(const Matrix< T_, m_, n_, sma_, sna_ > &a)
Sets this matrix to the inverse of another matrix.
CUDA_HOST_DEVICE DataType scalar_product(const Vector< T_, m_, snx_ > &x, const Vector< T_, n_, sny_ > &y) const
Computes the scalar product of two vectors with this matrix.
CUDA_HOST_DEVICE Matrix & set_gram(const Matrix< T_, l_, n_, sla_, sna_ > &a)
Sets this matrix to the Gram matrix of another matrix.
CUDA_HOST_DEVICE Matrix & set_outer_product(const Vector< T_, m_, snx_ > &x, const Vector< T_, n_, sny_ > &y)
Sets this matrix to the outer product of two vectors.
Tiny Vector class template.
CUDA_HOST_DEVICE T_ dot(const T_ &a, const T_ &b)
Computes the dot-product of two scalars.
FEAT namespace.
Definition: adjactor.hpp:12
SpaceTags
Space configuration tags enum.
Definition: eval_tags.hpp:97
@ value
specifies whether the space should supply basis function values
@ hess
specifies whether the space should supply basis function hessians
@ ref_grad
specifies whether the space should supply reference basis function gradients
@ grad
specifies whether the space should supply basis function gradients
TrafoTags
Trafo configuration tags enum.
Definition: eval_tags.hpp:22
@ jac_det
specifies whether the trafo should supply jacobian determinants