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>
195 template <
int dim,
typename Number>
215 template <
int dim,
typename Number>
240 template <
int dim,
typename Number>
259 template <
int dim,
typename Number>
278 template <
int dim,
typename Number>
297 template <
int dim,
typename Number>
316 template <
int dim,
typename Number>
364 template <
int dim,
typename Number>
383 template <
int dim,
typename Number>
403 template <
int dim,
typename Number>
422 template <
int dim,
typename Number>
442 template <
int dim,
typename Number>
467 template <
int dim,
typename Number>
486 template <
int dim,
typename Number>
505 template <
int dim,
typename Number>
524 template <
int dim,
typename Number>
543 template <
int dim,
typename Number>
580 template <
int dim,
typename Number>
600 template <
int dim,
typename Number>
621 template <
int dim,
typename Number>
642 template <
int dim,
typename Number>
664 template <
int dim,
typename Number>
691 template <
int dim,
typename Number>
711 template <
int dim,
typename Number>
731 template <
int dim,
typename Number>
752 template <
int dim,
typename Number>
773 template <
int dim,
typename Number>
808 template <
int dim,
typename Number>
827 template <
int dim,
typename Number>
832 return contract<1, 0>(F, V);
837 template <
int dim,
typename Number>
842 return contract<1, 0>(
F, contract<1, 1>(T,
F));
847 template <
int dim,
typename Number>
848 inline ::SymmetricTensor<2, dim, Number>
849 transformation_contraction(const ::SymmetricTensor<2, dim, Number> &T,
853 for (
unsigned int i = 0; i < dim; ++i)
854 for (
unsigned int J = 0; J < dim; ++J)
856 for (
unsigned int I_ = 0; I_ < dim; ++I_)
857 tmp_1[i][J] += F[i][I_] * T[I_][J];
860 for (
unsigned int i = 0; i < dim; ++i)
861 for (
unsigned int j = i; j < dim; ++j)
862 for (
unsigned int J = 0; J < dim; ++J)
863 out[i][j] += F[j][J] * tmp_1[i][J];
870 template <
int dim,
typename Number>
894 return contract<1, 1>(
895 F, contract<1, 1>(
F, contract<2, 1>(contract<2, 1>(H,
F), F)));
900 template <
int dim,
typename Number>
901 inline ::SymmetricTensor<4, dim, Number>
902 transformation_contraction(const ::SymmetricTensor<4, dim, Number> &H,
923 for (
unsigned int I_ = 0; I_ < dim; ++I_)
924 for (
unsigned int j = 0; j < dim; ++j)
925 for (
unsigned int K = 0; K < dim; ++K)
926 for (
unsigned int L = 0; L < dim; ++L)
927 for (
unsigned int J = 0; J < dim; ++J)
928 tmp[I_][j][K][L] += F[j][J] * H[I_][J][K][L];
931 tmp = contract<1, 0>(
F, contract<3, 1>(tmp,
F));
935 for (
unsigned int i = 0; i < dim; ++i)
936 for (
unsigned int j = i; j < dim; ++j)
937 for (
unsigned int k = 0; k < dim; ++k)
938 for (
unsigned int l = k;
l < dim; ++
l)
939 for (
unsigned int K = 0; K < dim; ++K)
940 out[i][j][k][l] += F[k][K] * tmp[i][j][K][l];
949 template <
typename Number>
953 const double rotation[2][2] = {{std::cos(angle), -std::sin(angle)},
954 {std::sin(angle), std::cos(angle)}};
960 template <
typename Number>
964 const Number & angle)
966 Assert(std::abs(axis.norm() - 1.0) < 1
e-9,
967 ExcMessage(
"The supplied axial vector is not a unit vector."));
968 const Number c = std::cos(angle);
969 const Number s = std::sin(angle);
970 const Number t = 1. - c;
971 const double rotation[3][3] = {{t * axis[0] * axis[0] + c,
972 t * axis[0] * axis[1] - s * axis[2],
973 t * axis[0] * axis[2] + s * axis[1]},
974 {t * axis[0] * axis[1] + s * axis[2],
975 t * axis[1] * axis[1] + c,
976 t * axis[1] * axis[2] - s * axis[0]},
977 {t * axis[0] * axis[2] - s * axis[1],
978 t * axis[1] * axis[2] + s * axis[0],
979 t * axis[2] * axis[2] + c}};
985 template <
int dim,
typename Number>
991 return internal::Physics::transformation_contraction(V, F);
996 template <
int dim,
typename Number>
1002 return internal::Physics::transformation_contraction(T, F);
1007 template <
int dim,
typename Number>
1013 return internal::Physics::transformation_contraction(T, F);
1018 template <
int dim,
typename Number>
1024 return internal::Physics::transformation_contraction(H, F);
1029 template <
int dim,
typename Number>
1035 return internal::Physics::transformation_contraction(H, F);
1040 template <
int dim,
typename Number>
1046 return internal::Physics::transformation_contraction(v,
invert(F));
1051 template <
int dim,
typename Number>
1057 return internal::Physics::transformation_contraction(t,
invert(F));
1062 template <
int dim,
typename Number>
1068 return internal::Physics::transformation_contraction(t,
invert(F));
1073 template <
int dim,
typename Number>
1079 return internal::Physics::transformation_contraction(h,
invert(F));
1084 template <
int dim,
typename Number>
1090 return internal::Physics::transformation_contraction(h,
invert(F));
1095 template <
int dim,
typename Number>
1101 return internal::Physics::transformation_contraction(V,
transpose(
invert(F)));
1106 template <
int dim,
typename Number>
1112 return internal::Physics::transformation_contraction(T,
transpose(
invert(F)));
1117 template <
int dim,
typename Number>
1123 return internal::Physics::transformation_contraction(T,
transpose(
invert(F)));
1128 template <
int dim,
typename Number>
1134 return internal::Physics::transformation_contraction(H,
transpose(
invert(F)));
1139 template <
int dim,
typename Number>
1145 return internal::Physics::transformation_contraction(H,
transpose(
invert(F)));
1150 template <
int dim,
typename Number>
1155 return internal::Physics::transformation_contraction(v,
transpose(F));
1160 template <
int dim,
typename Number>
1165 return internal::Physics::transformation_contraction(t,
transpose(F));
1170 template <
int dim,
typename Number>
1176 return internal::Physics::transformation_contraction(t,
transpose(F));
1181 template <
int dim,
typename Number>
1186 return internal::Physics::transformation_contraction(h,
transpose(F));
1191 template <
int dim,
typename Number>
1197 return internal::Physics::transformation_contraction(h,
transpose(F));
1202 template <
int dim,
typename Number>
1207 return Number(1.0 /
determinant(F)) * Contravariant::push_forward(V, F);
1212 template <
int dim,
typename Number>
1217 return Number(1.0 /
determinant(F)) * Contravariant::push_forward(T, F);
1222 template <
int dim,
typename Number>
1228 return Number(1.0 /
determinant(F)) * Contravariant::push_forward(T, F);
1233 template <
int dim,
typename Number>
1238 return Number(1.0 /
determinant(F)) * Contravariant::push_forward(H, F);
1243 template <
int dim,
typename Number>
1249 return Number(1.0 /
determinant(F)) * Contravariant::push_forward(H, F);
1254 template <
int dim,
typename Number>
1259 return Number(
determinant(F)) * Contravariant::pull_back(v, F);
1264 template <
int dim,
typename Number>
1269 return Number(
determinant(F)) * Contravariant::pull_back(t, F);
1274 template <
int dim,
typename Number>
1280 return Number(
determinant(F)) * Contravariant::pull_back(t, F);
1285 template <
int dim,
typename Number>
1290 return Number(
determinant(F)) * Contravariant::pull_back(h, F);
1295 template <
int dim,
typename Number>
1301 return Number(
determinant(F)) * Contravariant::pull_back(h, F);
1306 template <
int dim,
typename Number>
1316 DEAL_II_NAMESPACE_CLOSE
constexpr Tensor< 2, dim, Number > cofactor(const Tensor< 2, dim, Number > &t)
SymmetricTensor< 2, dim, Number > invert(const SymmetricTensor< 2, dim, Number > &t)
SymmetricTensor< 2, dim, Number > e(const Tensor< 2, dim, Number > &F)
Tensor< 2, dim, Number > F(const Tensor< 2, dim, Number > &Grad_u)
static ::ExceptionBase & ExcMessage(std::string arg1)
#define Assert(cond, exc)
Number determinant(const SymmetricTensor< 2, dim, Number > &t)
Tensor< 2, dim, Number > l(const Tensor< 2, dim, Number > &F, const Tensor< 2, dim, Number > &dF_dt)