16 #ifndef dealii_transformations_h 17 #define dealii_transformations_h 19 #include <deal.II/base/point.h> 21 #include <deal.II/base/tensor.h> 23 DEAL_II_NAMESPACE_OPEN
28 namespace Transformations
58 template <
typename Number>
91 template <
typename Number>
117 namespace Contravariant
137 template <
int dim,
typename Number>
156 template <
int dim,
typename Number>
176 template <
int dim,
typename Number>
194 template <
int dim,
typename Number>
213 template <
int dim,
typename Number>
238 template <
int dim,
typename Number>
257 template <
int dim,
typename Number>
276 template <
int dim,
typename Number>
295 template <
int dim,
typename Number>
314 template <
int dim,
typename Number>
362 template <
int dim,
typename Number>
381 template <
int dim,
typename Number>
401 template <
int dim,
typename Number>
420 template <
int dim,
typename Number>
440 template <
int dim,
typename Number>
465 template <
int dim,
typename Number>
484 template <
int dim,
typename Number>
503 template <
int dim,
typename Number>
522 template <
int dim,
typename Number>
541 template <
int dim,
typename Number>
578 template <
int dim,
typename Number>
598 template <
int dim,
typename Number>
619 template <
int dim,
typename Number>
640 template <
int dim,
typename Number>
662 template <
int dim,
typename Number>
689 template <
int dim,
typename Number>
709 template <
int dim,
typename Number>
729 template <
int dim,
typename Number>
750 template <
int dim,
typename Number>
771 template <
int dim,
typename Number>
806 template <
int dim,
typename Number>
825 template <
int dim,
typename Number>
830 return contract<1, 0>(F, V);
835 template <
int dim,
typename Number>
840 return contract<1, 0>(F, contract<1, 1>(T, F));
845 template <
int dim,
typename Number>
846 inline ::SymmetricTensor<2, dim, Number>
847 transformation_contraction(const ::SymmetricTensor<2, dim, Number> &T,
851 for (
unsigned int i = 0; i < dim; ++i)
852 for (
unsigned int J = 0; J < dim; ++J)
853 for (
unsigned int I = 0; I < dim; ++I)
854 tmp_1[i][J] += F[i][I] * T[I][J];
857 for (
unsigned int i = 0; i < dim; ++i)
858 for (
unsigned int j = i; j < dim; ++j)
859 for (
unsigned int J = 0; J < dim; ++J)
860 out[i][j] += F[j][J] * tmp_1[i][J];
867 template <
int dim,
typename Number>
891 return contract<1, 1>(
892 F, contract<1, 1>(F, contract<2, 1>(contract<2, 1>(H, F), F)));
897 template <
int dim,
typename Number>
898 inline ::SymmetricTensor<4, dim, Number>
899 transformation_contraction(const ::SymmetricTensor<4, dim, Number> &H,
919 for (
unsigned int I = 0; I < dim; ++I)
920 for (
unsigned int j = 0; j < dim; ++j)
921 for (
unsigned int K = 0; K < dim; ++K)
922 for (
unsigned int L = 0; L < dim; ++L)
923 for (
unsigned int J = 0; J < dim; ++J)
924 tmp[I][j][K][L] += F[j][J] * H[I][J][K][L];
927 tmp = contract<1, 0>(F, contract<3, 1>(tmp, F));
931 for (
unsigned int i = 0; i < dim; ++i)
932 for (
unsigned int j = i; j < dim; ++j)
933 for (
unsigned int k = 0; k < dim; ++k)
934 for (
unsigned int l = k; l < dim; ++l)
935 for (
unsigned int K = 0; K < dim; ++K)
936 out[i][j][k][l] += F[k][K] * tmp[i][j][K][l];
945 template <
typename Number>
949 const double rotation[2][2] = {{std::cos(angle), -std::sin(angle)},
950 {std::sin(angle), std::cos(angle)}};
956 template <
typename Number>
960 const Number & angle)
963 ExcMessage(
"The supplied axial vector is not a unit vector."));
964 const Number c = std::cos(angle);
965 const Number s = std::sin(angle);
966 const Number t = 1. - c;
967 const double rotation[3][3] = {{t * axis[0] * axis[0] + c,
968 t * axis[0] * axis[1] - s * axis[2],
969 t * axis[0] * axis[2] + s * axis[1]},
970 {t * axis[0] * axis[1] + s * axis[2],
971 t * axis[1] * axis[1] + c,
972 t * axis[1] * axis[2] - s * axis[0]},
973 {t * axis[0] * axis[2] - s * axis[1],
974 t * axis[1] * axis[2] + s * axis[0],
975 t * axis[2] * axis[2] + c}};
981 template <
int dim,
typename Number>
987 return internal::Physics::transformation_contraction(V, F);
992 template <
int dim,
typename Number>
998 return internal::Physics::transformation_contraction(T, F);
1003 template <
int dim,
typename Number>
1009 return internal::Physics::transformation_contraction(T, F);
1014 template <
int dim,
typename Number>
1020 return internal::Physics::transformation_contraction(H, F);
1025 template <
int dim,
typename Number>
1031 return internal::Physics::transformation_contraction(H, F);
1036 template <
int dim,
typename Number>
1042 return internal::Physics::transformation_contraction(v,
invert(F));
1047 template <
int dim,
typename Number>
1053 return internal::Physics::transformation_contraction(t,
invert(F));
1058 template <
int dim,
typename Number>
1064 return internal::Physics::transformation_contraction(t,
invert(F));
1069 template <
int dim,
typename Number>
1075 return internal::Physics::transformation_contraction(h,
invert(F));
1080 template <
int dim,
typename Number>
1086 return internal::Physics::transformation_contraction(h,
invert(F));
1091 template <
int dim,
typename Number>
1097 return internal::Physics::transformation_contraction(V,
transpose(
invert(F)));
1102 template <
int dim,
typename Number>
1108 return internal::Physics::transformation_contraction(T,
transpose(
invert(F)));
1113 template <
int dim,
typename Number>
1119 return internal::Physics::transformation_contraction(T,
transpose(
invert(F)));
1124 template <
int dim,
typename Number>
1130 return internal::Physics::transformation_contraction(H,
transpose(
invert(F)));
1135 template <
int dim,
typename Number>
1141 return internal::Physics::transformation_contraction(H,
transpose(
invert(F)));
1146 template <
int dim,
typename Number>
1151 return internal::Physics::transformation_contraction(v,
transpose(F));
1156 template <
int dim,
typename Number>
1161 return internal::Physics::transformation_contraction(t,
transpose(F));
1166 template <
int dim,
typename Number>
1172 return internal::Physics::transformation_contraction(t,
transpose(F));
1177 template <
int dim,
typename Number>
1182 return internal::Physics::transformation_contraction(h,
transpose(F));
1187 template <
int dim,
typename Number>
1193 return internal::Physics::transformation_contraction(h,
transpose(F));
1198 template <
int dim,
typename Number>
1208 template <
int dim,
typename Number>
1218 template <
int dim,
typename Number>
1229 template <
int dim,
typename Number>
1239 template <
int dim,
typename Number>
1250 template <
int dim,
typename Number>
1260 template <
int dim,
typename Number>
1270 template <
int dim,
typename Number>
1281 template <
int dim,
typename Number>
1291 template <
int dim,
typename Number>
1302 template <
int dim,
typename Number>
1307 return cofactor(F) * N;
1312 DEAL_II_NAMESPACE_CLOSE
Number determinant(const SymmetricTensor< 2, dim, Number > &)
numbers::NumberTraits< Number >::real_type norm() const
SymmetricTensor< 2, dim, Number > invert(const SymmetricTensor< 2, dim, Number > &)
static::ExceptionBase & ExcMessage(std::string arg1)
#define Assert(cond, exc)
SymmetricTensor< rank_, dim, Number > transpose(const SymmetricTensor< rank_, dim, Number > &t)