16 #ifndef dealii__transformations_h 17 #define dealii__transformations_h 19 #include <deal.II/base/point.h> 20 #include <deal.II/base/tensor.h> 21 #include <deal.II/base/symmetric_tensor.h> 23 DEAL_II_NAMESPACE_OPEN
29 namespace Transformations
60 template<
typename Number>
93 template<
typename Number>
120 namespace Contravariant
141 template <
int dim,
typename Number>
159 template <
int dim,
typename Number>
178 template <
int dim,
typename Number>
196 template <
int dim,
typename Number>
215 template <
int dim,
typename Number>
240 template <
int dim,
typename Number>
258 template <
int dim,
typename Number>
276 template <
int dim,
typename Number>
294 template <
int dim,
typename Number>
312 template <
int dim,
typename Number>
360 template <
int dim,
typename Number>
378 template <
int dim,
typename Number>
397 template <
int dim,
typename Number>
415 template <
int dim,
typename Number>
434 template <
int dim,
typename Number>
459 template <
int dim,
typename Number>
477 template <
int dim,
typename Number>
495 template <
int dim,
typename Number>
513 template <
int dim,
typename Number>
531 template <
int dim,
typename Number>
568 template <
int dim,
typename Number>
587 template <
int dim,
typename Number>
607 template <
int dim,
typename Number>
626 template <
int dim,
typename Number>
646 template <
int dim,
typename Number>
672 template <
int dim,
typename Number>
691 template <
int dim,
typename Number>
710 template <
int dim,
typename Number>
729 template <
int dim,
typename Number>
748 template <
int dim,
typename Number>
783 template<
int dim,
typename Number>
804 template <
int dim,
typename Number>
810 return contract<1,0>(F, V);
815 template <
int dim,
typename Number>
821 return contract<1,1>(
F,contract<1,0>(
F, T));
826 template <
int dim,
typename Number>
828 ::SymmetricTensor<2,dim,Number>
829 transformation_contraction (const ::SymmetricTensor<2,dim,Number> &T,
833 for (
unsigned int i=0; i<dim; ++i)
834 for (
unsigned int J=0; J<dim; ++J)
835 for (
unsigned int I=0; I<dim; ++I)
836 tmp_1[i][J] += F[i][I] * T[I][J];
839 for (
unsigned int i=0; i<dim; ++i)
840 for (
unsigned int j=i; j<dim; ++j)
841 for (
unsigned int J=0; J<dim; ++J)
842 out[i][j] += F[j][J] * tmp_1[i][J];
849 template <
int dim,
typename Number>
857 return contract<1,3>(
F,contract<1,2>(
F,contract<1,1>(
F,contract<1,0>(
F, H))));
862 template <
int dim,
typename Number>
864 ::SymmetricTensor<4,dim,Number>
865 transformation_contraction (const ::SymmetricTensor<4,dim,Number> &H,
872 for (
unsigned int i=0; i<dim; ++i)
873 for (
unsigned int J=0; J<dim; ++J)
874 for (
unsigned int K=0; K<dim; ++K)
875 for (
unsigned int L=0; L<dim; ++L)
876 for (
unsigned int I=0; I<dim; ++I)
877 tmp_1[i][J][K][L] += F[i][I] * H[I][J][K][L];
880 for (
unsigned int i=0; i<dim; ++i)
881 for (
unsigned int j=0; j<dim; ++j)
882 for (
unsigned int K=0; K<dim; ++K)
883 for (
unsigned int L=0; L<dim; ++L)
884 for (
unsigned int J=0; J<dim; ++J)
885 tmp_2[i][j][K][L] += F[j][J] * tmp_1[i][J][K][L];
888 for (
unsigned int i=0; i<dim; ++i)
889 for (
unsigned int j=0; j<dim; ++j)
890 for (
unsigned int k=0; k<dim; ++k)
891 for (
unsigned int L=0; L<dim; ++L)
892 for (
unsigned int K=0; K<dim; ++K)
893 tmp_1[i][j][k][L] += F[k][K] * tmp_2[i][j][K][L];
896 for (
unsigned int i=0; i<dim; ++i)
897 for (
unsigned int j=i; j<dim; ++j)
898 for (
unsigned int k=0; k<dim; ++k)
899 for (
unsigned int l=k;
l<dim; ++
l)
900 for (
unsigned int L=0; L<dim; ++L)
901 out[i][j][k][l] += F[l][L] * tmp_1[i][j][k][L];
911 template<
typename Number>
915 const double rotation[2][2]
917 std::cos(angle) , -std::sin(angle)
920 std::sin(angle) , std::cos(angle)
928 template<
typename Number>
933 Assert(std::abs(axis.norm() - 1.0) < 1
e-9,
934 ExcMessage(
"The supplied axial vector is not a unit vector."));
935 const Number c = std::cos(angle);
936 const Number s = std::sin(angle);
937 const Number t = 1.-c;
938 const double rotation[3][3]
940 t *axis[0] *axis[0] + c,
941 t *axis[0] *axis[1] - s *axis[2],
942 t *axis[0] *axis[2] + s *axis[1]
945 t *axis[0] *axis[1] + s *axis[2],
946 t *axis[1] *axis[1] + c,
947 t *axis[1] *axis[2] - s *axis[0]
950 t *axis[0] *axis[2] - s *axis[1],
951 t *axis[1] *axis[2] + s *axis[0],
952 t *axis[2] *axis[2] + c
960 template <
int dim,
typename Number>
966 return internal::Physics::transformation_contraction(V,F);
971 template <
int dim,
typename Number>
977 return internal::Physics::transformation_contraction(T,F);
982 template <
int dim,
typename Number>
988 return internal::Physics::transformation_contraction(T,F);
993 template <
int dim,
typename Number>
999 return internal::Physics::transformation_contraction(H,F);
1004 template <
int dim,
typename Number>
1010 return internal::Physics::transformation_contraction(H,F);
1015 template <
int dim,
typename Number>
1021 return internal::Physics::transformation_contraction(v,
invert(F));
1026 template <
int dim,
typename Number>
1032 return internal::Physics::transformation_contraction(t,
invert(F));
1037 template <
int dim,
typename Number>
1043 return internal::Physics::transformation_contraction(t,
invert(F));
1048 template <
int dim,
typename Number>
1054 return internal::Physics::transformation_contraction(h,
invert(F));
1059 template <
int dim,
typename Number>
1065 return internal::Physics::transformation_contraction(h,
invert(F));
1070 template <
int dim,
typename Number>
1076 return internal::Physics::transformation_contraction(V,
transpose(
invert(F)));
1081 template <
int dim,
typename Number>
1087 return internal::Physics::transformation_contraction(T,
transpose(
invert(F)));
1092 template <
int dim,
typename Number>
1098 return internal::Physics::transformation_contraction(T,
transpose(
invert(F)));
1103 template <
int dim,
typename Number>
1109 return internal::Physics::transformation_contraction(H,
transpose(
invert(F)));
1114 template <
int dim,
typename Number>
1120 return internal::Physics::transformation_contraction(H,
transpose(
invert(F)));
1125 template <
int dim,
typename Number>
1131 return internal::Physics::transformation_contraction(v,
transpose(F));
1136 template <
int dim,
typename Number>
1142 return internal::Physics::transformation_contraction(t,
transpose(F));
1147 template <
int dim,
typename Number>
1153 return internal::Physics::transformation_contraction(t,
transpose(F));
1158 template <
int dim,
typename Number>
1164 return internal::Physics::transformation_contraction(h,
transpose(F));
1169 template <
int dim,
typename Number>
1175 return internal::Physics::transformation_contraction(h,
transpose(F));
1180 template <
int dim,
typename Number>
1186 return Number(1.0/
determinant(F))*Contravariant::push_forward(V,F);
1191 template <
int dim,
typename Number>
1197 return Number(1.0/
determinant(F))*Contravariant::push_forward(T,F);
1202 template <
int dim,
typename Number>
1208 return Number(1.0/
determinant(F))*Contravariant::push_forward(T,F);
1213 template <
int dim,
typename Number>
1219 return Number(1.0/
determinant(F))*Contravariant::push_forward(H,F);
1224 template <
int dim,
typename Number>
1230 return Number(1.0/
determinant(F))*Contravariant::push_forward(H,F);
1235 template <
int dim,
typename Number>
1241 return Number(
determinant(F))*Contravariant::pull_back(v,F);
1246 template <
int dim,
typename Number>
1252 return Number(
determinant(F))*Contravariant::pull_back(t,F);
1257 template <
int dim,
typename Number>
1263 return Number(
determinant(F))*Contravariant::pull_back(t,F);
1268 template <
int dim,
typename Number>
1274 return Number(
determinant(F))*Contravariant::pull_back(h,F);
1279 template <
int dim,
typename Number>
1285 return Number(
determinant(F))*Contravariant::pull_back(h,F);
1290 template<
int dim,
typename Number>
1300 DEAL_II_NAMESPACE_CLOSE
SymmetricTensor< 2, dim, Number > e(const Tensor< 2, dim, Number > &F)
Tensor< 2, dim, Number > F(const Tensor< 2, dim, Number > &Grad_u)
Tensor< 2, dim, Number > cofactor(const Tensor< 2, dim, Number > &t)
static ::ExceptionBase & ExcMessage(std::string arg1)
#define Assert(cond, exc)
Number determinant(const SymmetricTensor< 2, dim, Number > &t)
SymmetricTensor< 2, dim, Number > invert(const SymmetricTensor< 2, dim, Number > &)
Tensor< 2, dim, Number > l(const Tensor< 2, dim, Number > &F, const Tensor< 2, dim, Number > &dF_dt)