diff --git a/dune/gfe/cosseratenergystiffness.hh b/dune/gfe/cosseratenergystiffness.hh index aafdca5a6983154dd90f452eb894f506281dca92..4e5fdbc0ecc069ef52a5b62d7e7b03580f621f91 100644 --- a/dune/gfe/cosseratenergystiffness.hh +++ b/dune/gfe/cosseratenergystiffness.hh @@ -74,37 +74,6 @@ class CosseratEnergyLocalStiffness enum {gridDim=GridView::dimension}; enum {dimworld=GridView::dimensionworld}; - - /** \brief Compute the symmetric part of a matrix A, i.e. \f$ \frac 12 (A + A^T) \f$ */ - static Dune::FieldMatrix<field_type,dim,dim> sym(const Dune::FieldMatrix<field_type,dim,dim>& A) - { - Dune::FieldMatrix<field_type,dim,dim> result; - for (int i=0; i<dim; i++) - for (int j=0; j<dim; j++) - result[i][j] = 0.5 * (A[i][j] + A[j][i]); - return result; - } - - /** \brief Compute the antisymmetric part of a matrix A, i.e. \f$ \frac 12 (A - A^T) \f$ */ - static Dune::FieldMatrix<field_type,dim,dim> skew(const Dune::FieldMatrix<field_type,dim,dim>& A) - { - Dune::FieldMatrix<field_type,dim,dim> result; - for (int i=0; i<dim; i++) - for (int j=0; j<dim; j++) - result[i][j] = 0.5 * (A[i][j] - A[j][i]); - return result; - } - - /** \brief Return the square of the trace of a matrix */ - template <int N> - static field_type traceSquared(const Dune::FieldMatrix<field_type,N,N>& A) - { - field_type trace = 0; - for (int i=0; i<N; i++) - trace += A[i][i]; - return trace*trace; - } - /** \brief Compute the (row-wise) curl of a matrix R \f$ \param DR The partial derivatives of the matrix R */ @@ -171,9 +140,9 @@ public: for (int i=0; i<dim; i++) UMinus1[i][i] -= 1; - return mu_ * sym(UMinus1).frobenius_norm2() - + mu_c_ * skew(UMinus1).frobenius_norm2() - + (mu_*lambda_)/(2*mu_ + lambda_) * traceSquared(sym(UMinus1)); + return mu_ * Dune::GFE::sym(UMinus1).frobenius_norm2() + + mu_c_ * Dune::GFE::skew(UMinus1).frobenius_norm2() + + (mu_*lambda_)/(2*mu_ + lambda_) * Dune::GFE::traceSquared(Dune::GFE::sym(UMinus1)); } /** \brief The energy \f$ W_{mp}(\overline{U}) \f$, as written in @@ -219,7 +188,7 @@ public: RT detU = U.determinant(); - return mu_ * sym(UMinus1).frobenius_norm2() + mu_c_ * skew(UMinus1).frobenius_norm2() + return mu_ * Dune::GFE::sym(UMinus1).frobenius_norm2() + mu_c_ * Dune::GFE::skew(UMinus1).frobenius_norm2() + (mu_*lambda_)/(2*mu_ + lambda_) * 0.5 * ((detU-1)*(detU-1) + (1.0/detU -1)*(1.0/detU -1)); } @@ -275,9 +244,9 @@ public: for (int k=0; k<3; k++) RT_DR3[i][j] += R[k][i] * DR[k][2][j]; - return mu_ * sym(RT_DR3).frobenius_norm2() - + mu_c_ * skew(RT_DR3).frobenius_norm2() - + mu_*lambda_/(2*mu_+lambda_) * traceSquared(RT_DR3); + return mu_ * Dune::GFE::sym(RT_DR3).frobenius_norm2() + + mu_c_ * Dune::GFE::skew(RT_DR3).frobenius_norm2() + + mu_*lambda_/(2*mu_+lambda_) * Dune::GFE::traceSquared(RT_DR3); } /** \brief The shell thickness */ diff --git a/dune/gfe/linearalgebra.hh b/dune/gfe/linearalgebra.hh index 7febb66e833af845024d8d7bfb11d6a5df28a9e6..a751897f8cca8a0fdab4fbd1ad63fcac7ad4e952 100644 --- a/dune/gfe/linearalgebra.hh +++ b/dune/gfe/linearalgebra.hh @@ -1,9 +1,13 @@ -#ifndef LINEAR_ALGEBRA_HH -#define LINEAR_ALGEBRA_HH +#ifndef DUNE_GFE_LINEARALGEBRA_HH +#define DUNE_GFE_LINEARALGEBRA_HH #include <dune/common/fmatrix.hh> #include <dune/common/version.hh> +/////////////////////////////////////////////////////////////////////////////////////////// +// Various vector-space matrix methods +/////////////////////////////////////////////////////////////////////////////////////////// + #if ADOLC_ADOUBLE_H #if DUNE_VERSION_LT(DUNE_FUNCTIONS,2,7) template< int m, int n, int p > @@ -171,4 +175,123 @@ Dune::FieldVector<K,m> operator/ ( const Dune::FieldVector<K, m> &A, const K& s) } #endif + +/////////////////////////////////////////////////////////////////////////////////////////// +// Various other matrix methods +/////////////////////////////////////////////////////////////////////////////////////////// + +namespace Dune { + + namespace GFE { + + /** \brief Return the trace of a matrix */ + template <class T, int n> + static T trace(const FieldMatrix<T,n,n>& A) + { + T trace = 0; + for (int i=0; i<n; i++) + trace += A[i][i]; + return trace; + } + + /** \brief Return the square of the trace of a matrix */ + template <class T, int n> + static T traceSquared(const FieldMatrix<T,n,n>& A) + { + T trace = 0; + for (int i=0; i<n; i++) + trace += A[i][i]; + return trace*trace; + } + + /** \brief Compute the symmetric part of a matrix A, i.e. \f$ \frac 12 (A + A^T) \f$ */ + template <class T, int n> + static FieldMatrix<T,n,n> sym(const FieldMatrix<T,n,n>& A) + { + FieldMatrix<T,n,n> result; + for (int i=0; i<n; i++) + for (int j=0; j<n; j++) + result[i][j] = 0.5 * (A[i][j] + A[j][i]); + return result; + } + + /** \brief Compute the antisymmetric part of a matrix A, i.e. \f$ \frac 12 (A - A^T) \f$ */ + template <class T, int n> + static FieldMatrix<T,n,n> skew(const FieldMatrix<T,n,n>& A) + { + FieldMatrix<T,n,n> result; + for (int i=0; i<n; i++) + for (int j=0; j<n; j++) + result[i][j] = 0.5 * (A[i][j] - A[j][i]); + return result; + } + + /** \brief Compute the deviator of a matrix A */ + template <class T, int n> + static FieldMatrix<T,n,n> dev(const FieldMatrix<T,n,n>& A) + { + FieldMatrix<T,n,n> result = A; + auto t = trace(A); + for (int i=0; i<n; i++) + result[i][i] -= t / n; + return result; + } + + /** \brief Return the transposed matrix */ + template <class T, int n> + static FieldMatrix<T,n,n> transpose(const FieldMatrix<T,n,n>& A) + { + FieldMatrix<T,n,n> result; + + for (int i=0; i<n; i++) + for (int j=0; j<n; j++) + result[i][j] = A[j][i]; + + return result; + } + + /** \brief The Frobenius (i.e., componentwise) product of two matrices */ + template <class T, int n> + static T frobeniusProduct(const FieldMatrix<T,n,n>& A, const FieldMatrix<T,n,n>& B) + { + T result(0.0); + + for (int i=0; i<n; i++) + for (int j=0; j<n; j++) + result += A[i][j] * B[i][j]; + + return result; + } + + template <class T, int n> + static auto dyadicProduct(const FieldVector<T,n>& A, const FieldVector<T,n>& B) + { + FieldMatrix<T,n,n> result; + + for (int i=0; i<n; i++) + for (int j=0; j<n; j++) + result[i][j] = A[i]*B[j]; + + return result; + } + +#if ADOLC_ADOUBLE_H + template <int n> + static auto dyadicProduct(const FieldVector<adouble,n>& A, const FieldVector<double,n>& B) + -> FieldMatrix<adouble,n,n> + { + FieldMatrix<adouble,n,n> result; + + for (int i=0; i<n; i++) + for (int j=0; j<n; j++) + result[i][j] = A[i]*B[j]; + + return result; + } +#endif + + } +} + + #endif diff --git a/dune/gfe/nonplanarcosseratshellenergy.hh b/dune/gfe/nonplanarcosseratshellenergy.hh index 16c97c4f0cd595ab06f7bd550aa61622a4a02ab4..102115dbc0a371ce6eb83a33e2e5dd739bd031d3 100644 --- a/dune/gfe/nonplanarcosseratshellenergy.hh +++ b/dune/gfe/nonplanarcosseratshellenergy.hh @@ -34,119 +34,6 @@ class NonplanarCosseratShellEnergy enum {gridDim=GridView::dimension}; enum {dimworld=GridView::dimensionworld}; - /** \brief Compute the symmetric part of a matrix A, i.e. \f$ \frac 12 (A + A^T) \f$ */ - static Dune::FieldMatrix<field_type,dim,dim> sym(const Dune::FieldMatrix<field_type,dim,dim>& A) - { - Dune::FieldMatrix<field_type,dim,dim> result; - for (int i=0; i<dim; i++) - for (int j=0; j<dim; j++) - result[i][j] = 0.5 * (A[i][j] + A[j][i]); - return result; - } - - /** \brief Compute the antisymmetric part of a matrix A, i.e. \f$ \frac 12 (A - A^T) \f$ */ - static Dune::FieldMatrix<field_type,dim,dim> skew(const Dune::FieldMatrix<field_type,dim,dim>& A) - { - Dune::FieldMatrix<field_type,dim,dim> result; - for (int i=0; i<dim; i++) - for (int j=0; j<dim; j++) - result[i][j] = 0.5 * (A[i][j] - A[j][i]); - return result; - } - - /** \brief Compute the deviator of a matrix A */ - static Dune::FieldMatrix<field_type,dim,dim> dev(const Dune::FieldMatrix<field_type,dim,dim>& A) - { - Dune::FieldMatrix<field_type,dim,dim> result = A; - auto t = trace(A); - for (int i=0; i<dim; i++) - result[i][i] -= t / dim; - return result; - } - - /** \brief Return the trace of a matrix */ - template <class T, int N> - static T trace(const Dune::FieldMatrix<T,N,N>& A) - { - T trace = 0; - for (int i=0; i<N; i++) - trace += A[i][i]; - return trace; - } - - /** \brief Return the square of the trace of a matrix */ - template <int N> - static field_type traceSquared(const Dune::FieldMatrix<field_type,N,N>& A) - { - field_type trace = 0; - for (int i=0; i<N; i++) - trace += A[i][i]; - return trace*trace; - } - - template <class T, int N> - static T frobeniusProduct(const Dune::FieldMatrix<T,N,N>& A, const Dune::FieldMatrix<T,N,N>& B) - { - T result(0.0); - - for (int i=0; i<N; i++) - for (int j=0; j<N; j++) - result += A[i][j] * B[i][j]; - - return result; - } - - template <int N> - static auto dyadicProduct(const Dune::FieldVector<adouble,N>& A, const Dune::FieldVector<adouble,N>& B) - -> Dune::FieldMatrix<adouble,N,N> - { - Dune::FieldMatrix<adouble,N,N> result; - - for (int i=0; i<N; i++) - for (int j=0; j<N; j++) - result[i][j] = A[i]*B[j]; - - return result; - } - - template <int N> - static auto dyadicProduct(const Dune::FieldVector<double,N>& A, const Dune::FieldVector<double,N>& B) - -> Dune::FieldMatrix<double,N,N> - { - Dune::FieldMatrix<double,N,N> result; - - for (int i=0; i<N; i++) - for (int j=0; j<N; j++) - result[i][j] = A[i]*B[j]; - - return result; - } - - template <int N> - static auto dyadicProduct(const Dune::FieldVector<adouble,N>& A, const Dune::FieldVector<double,N>& B) - -> Dune::FieldMatrix<adouble,N,N> - { - Dune::FieldMatrix<adouble,N,N> result; - - for (int i=0; i<N; i++) - for (int j=0; j<N; j++) - result[i][j] = A[i]*B[j]; - - return result; - } - - template <class T, int N> - static Dune::FieldMatrix<T,N,N> transpose(const Dune::FieldMatrix<T,N,N>& A) - { - Dune::FieldMatrix<T,N,N> result; - - for (int i=0; i<N; i++) - for (int j=0; j<N; j++) - result[i][j] = A[j][i]; - - return result; - } - public: /** \brief Constructor with a set of material parameters @@ -192,19 +79,20 @@ public: RT W_mixt(const Dune::FieldMatrix<field_type,3,3>& S, const Dune::FieldMatrix<field_type,3,3>& T) const { - return mu_ * frobeniusProduct(sym(S), sym(T)) - + mu_c_ * frobeniusProduct(skew(S), skew(T)) - + lambda_ * mu_ / (lambda_ + 2*mu_) * trace(S) * trace(T); + return mu_ * Dune::GFE::frobeniusProduct(Dune::GFE::sym(S), Dune::GFE::sym(T)) + + mu_c_ * Dune::GFE::frobeniusProduct(Dune::GFE::skew(S), Dune::GFE::skew(T)) + + lambda_ * mu_ / (lambda_ + 2*mu_) * Dune::GFE::trace(S) * Dune::GFE::trace(T); } RT W_mp(const Dune::FieldMatrix<field_type,3,3>& S) const { - return mu_ * sym(S).frobenius_norm2() + mu_c_ * skew(S).frobenius_norm2() + lambda_ * 0.5 * traceSquared(S); + return mu_ * Dune::GFE::sym(S).frobenius_norm2() + mu_c_ * Dune::GFE::skew(S).frobenius_norm2() + lambda_ * 0.5 * Dune::GFE::traceSquared(S); } RT W_curv(const Dune::FieldMatrix<field_type,3,3>& S) const { - return mu_ * L_c_ * L_c_ * (b1_ * dev(sym(S)).frobenius_norm2() + b2_ * skew(S).frobenius_norm2() + b3_ * traceSquared(S)); + return mu_ * L_c_ * L_c_ * (b1_ * Dune::GFE::dev(Dune::GFE::sym(S)).frobenius_norm2() + + b2_ * Dune::GFE::skew(S).frobenius_norm2() + b3_ * Dune::GFE::traceSquared(S)); } /** \brief The shell thickness */ @@ -297,7 +185,7 @@ energy(const typename Basis::LocalView& localView, Dune::FieldMatrix<field_type,dim,dim> R; value.q.matrix(R); - auto RT = transpose(R); + auto RT = Dune::GFE::transpose(R); Tensor3<field_type,3,3,gridDim> DR = value.quaternionTangentToMatrixTangent(derivative); @@ -328,7 +216,7 @@ energy(const typename Basis::LocalView& localView, Dune::FieldMatrix<double,3,3> a(0); for (int alpha=0; alpha<gridDim; alpha++) - a += dyadicProduct(aCovariant[alpha], aContravariant[alpha]); + a += Dune::GFE::dyadicProduct(aCovariant[alpha], aContravariant[alpha]); auto a00 = aCovariant[0] * aCovariant[0]; auto a01 = aCovariant[0] * aCovariant[1]; @@ -342,7 +230,7 @@ energy(const typename Basis::LocalView& localView, for (int alpha=0; alpha<2; alpha++) for (int beta=0; beta<2; beta++) - c += sqrt(aScalar) * eps[alpha][beta] * dyadicProduct(aContravariant[alpha], aContravariant[beta]); + c += sqrt(aScalar) * eps[alpha][beta] * Dune::GFE::dyadicProduct(aContravariant[alpha], aContravariant[beta]); // Second fundamental form // The derivative of the normal field @@ -354,14 +242,14 @@ energy(const typename Basis::LocalView& localView, Dune::FieldVector<double,3> vec; for (int i=0; i<3; i++) vec[i] = normalDerivative[i][alpha]; - b -= dyadicProduct(vec, aContravariant[alpha]); + b -= Dune::GFE::dyadicProduct(vec, aContravariant[alpha]); } // Gauss curvature auto K = b.determinant(); // Mean curvatue - auto H = 0.5 * trace(b); + auto H = 0.5 * Dune::GFE::trace(b); ////////////////////////////////////////////////////////// // Strain tensors @@ -375,7 +263,7 @@ energy(const typename Basis::LocalView& localView, Dune::FieldVector<field_type,3> vec; for (int i=0; i<3; i++) vec[i] = derivative[i][alpha]; - grad_s_m += dyadicProduct(vec, aContravariant[alpha]); + grad_s_m += Dune::GFE::dyadicProduct(vec, aContravariant[alpha]); } Ee = RT * grad_s_m - a; @@ -389,7 +277,7 @@ energy(const typename Basis::LocalView& localView, for (int j=0; j<3; j++) tmp[i][j] = DR[i][j][alpha]; auto tmp2 = RT * tmp; - Ke += dyadicProduct(SkewMatrix<field_type,3>(tmp2).axial(), aContravariant[alpha]); + Ke += Dune::GFE::dyadicProduct(SkewMatrix<field_type,3>(tmp2).axial(), aContravariant[alpha]); } ////////////////////////////////////////////////////////// diff --git a/dune/gfe/surfacecosseratenergy.hh b/dune/gfe/surfacecosseratenergy.hh index 805cd8ae3eb67b1d176cef37f0cc0749879d45dd..1aad21afc16e0769232786189914aa4772a8305a 100644 --- a/dune/gfe/surfacecosseratenergy.hh +++ b/dune/gfe/surfacecosseratenergy.hh @@ -59,121 +59,6 @@ class SurfaceCosseratEnergy enum {gridDim=GridView::dimension}; static constexpr int boundaryDim = gridDim - 1; - - /** \brief Compute the symmetric part of a matrix A, i.e. \f$ \frac 12 (A + A^T) \f$ */ - static Dune::FieldMatrix<field_type,dim,dim> sym(const Dune::FieldMatrix<field_type,dim,dim>& A) - { - Dune::FieldMatrix<field_type,dim,dim> result; - for (int i=0; i<dim; i++) - for (int j=0; j<dim; j++) - result[i][j] = 0.5 * (A[i][j] + A[j][i]); - return result; - } - - /** \brief Compute the antisymmetric part of a matrix A, i.e. \f$ \frac 12 (A - A^T) \f$ */ - static Dune::FieldMatrix<field_type,dim,dim> skew(const Dune::FieldMatrix<field_type,dim,dim>& A) - { - Dune::FieldMatrix<field_type,dim,dim> result; - for (int i=0; i<dim; i++) - for (int j=0; j<dim; j++) - result[i][j] = 0.5 * (A[i][j] - A[j][i]); - return result; - } - - /** \brief Compute the deviator of a matrix A */ - static Dune::FieldMatrix<field_type,dim,dim> dev(const Dune::FieldMatrix<field_type,dim,dim>& A) - { - Dune::FieldMatrix<field_type,dim,dim> result = A; - auto t = trace(A); - for (int i=0; i<dim; i++) - result[i][i] -= t / dim; - return result; - } - - /** \brief Return the trace of a matrix */ - template <class T, int N> - static T trace(const Dune::FieldMatrix<T,N,N>& A) - { - T trace = 0; - for (int i=0; i<N; i++) - trace += A[i][i]; - return trace; - } - - /** \brief Return the square of the trace of a matrix */ - template <int N> - static field_type traceSquared(const Dune::FieldMatrix<field_type,N,N>& A) - { - field_type trace = 0; - for (int i=0; i<N; i++) - trace += A[i][i]; - return trace*trace; - } - - template <class T, int N> - static T frobeniusProduct(const Dune::FieldMatrix<T,N,N>& A, const Dune::FieldMatrix<T,N,N>& B) - { - T result(0.0); - - for (int i=0; i<N; i++) - for (int j=0; j<N; j++) - result += A[i][j] * B[i][j]; - - return result; - } - - template <int N> - static auto dyadicProduct(const Dune::FieldVector<adouble,N>& A, const Dune::FieldVector<adouble,N>& B) - -> Dune::FieldMatrix<adouble,N,N> - { - Dune::FieldMatrix<adouble,N,N> result; - - for (int i=0; i<N; i++) - for (int j=0; j<N; j++) - result[i][j] = A[i]*B[j]; - - return result; - } - - template <int N> - static auto dyadicProduct(const Dune::FieldVector<double,N>& A, const Dune::FieldVector<double,N>& B) - -> Dune::FieldMatrix<double,N,N> - { - Dune::FieldMatrix<double,N,N> result; - - for (int i=0; i<N; i++) - for (int j=0; j<N; j++) - result[i][j] = A[i]*B[j]; - - return result; - } - - template <int N> - static auto dyadicProduct(const Dune::FieldVector<adouble,N>& A, const Dune::FieldVector<double,N>& B) - -> Dune::FieldMatrix<adouble,N,N> - { - Dune::FieldMatrix<adouble,N,N> result; - - for (int i=0; i<N; i++) - for (int j=0; j<N; j++) - result[i][j] = A[i]*B[j]; - - return result; - } - - template <class T, int N> - static Dune::FieldMatrix<T,N,N> transpose(const Dune::FieldMatrix<T,N,N>& A) - { - Dune::FieldMatrix<T,N,N> result; - - for (int i=0; i<N; i++) - for (int j=0; j<N; j++) - result[i][j] = A[j][i]; - - return result; - } - - /** \brief Compute the derivative of the rotation (with respect to x), but wrt matrix coordinates \param value Value of the gfe function at a certain point \param derivative First derivative of the gfe function wrt x at that point, in quaternion coordinates @@ -313,7 +198,7 @@ RT energy(const typename Basis::LocalView& localView, Dune::FieldMatrix<field_type,dim,dim> R; value.q.matrix(R); - auto RT = transpose(R); + auto RT = Dune::GFE::transpose(R); Tensor3<field_type,3,3,boundaryDim> DR; computeDR(value, derivative2D, DR); @@ -346,7 +231,7 @@ RT energy(const typename Basis::LocalView& localView, Dune::FieldMatrix<double,3,3> a(0); for (int alpha=0; alpha<boundaryDim; alpha++) - a += dyadicProduct(aCovariant[alpha], aContravariant[alpha]); + a += Dune::GFE::dyadicProduct(aCovariant[alpha], aContravariant[alpha]); auto a00 = aCovariant[0] * aCovariant[0]; auto a01 = aCovariant[0] * aCovariant[1]; @@ -360,7 +245,7 @@ RT energy(const typename Basis::LocalView& localView, for (int alpha=0; alpha<2; alpha++) for (int beta=0; beta<2; beta++) - c += sqrt(aScalar) * eps[alpha][beta] * dyadicProduct(aContravariant[alpha], aContravariant[beta]); + c += sqrt(aScalar) * eps[alpha][beta] * Dune::GFE::dyadicProduct(aContravariant[alpha], aContravariant[beta]); // Second fundamental form // The derivative of the normal field @@ -372,14 +257,14 @@ RT energy(const typename Basis::LocalView& localView, Dune::FieldVector<double,3> vec; for (int i=0; i<3; i++) vec[i] = normalDerivative[i][alpha]; - b -= dyadicProduct(vec, aContravariant[alpha]); + b -= Dune::GFE::dyadicProduct(vec, aContravariant[alpha]); } // Gauss curvature auto K = b.determinant(); // Mean curvatue - auto H = 0.5 * trace(b); + auto H = 0.5 * Dune::GFE::trace(b); ////////////////////////////////////////////////////////// // Strain tensors @@ -393,7 +278,7 @@ RT energy(const typename Basis::LocalView& localView, Dune::FieldVector<field_type,3> vec; for (int i=0; i<3; i++) vec[i] = derivative[i][alpha]; - grad_s_m += dyadicProduct(vec, aContravariant[alpha]); + grad_s_m += Dune::GFE::dyadicProduct(vec, aContravariant[alpha]); } Ee = RT * grad_s_m - a; @@ -407,7 +292,7 @@ RT energy(const typename Basis::LocalView& localView, for (int j=0; j<3; j++) tmp[i][j] = DR[i][j][alpha]; auto tmp2 = RT * tmp; - Ke += dyadicProduct(SkewMatrix<field_type,3>(tmp2).axial(), aContravariant[alpha]); + Ke += Dune::GFE::dyadicProduct(SkewMatrix<field_type,3>(tmp2).axial(), aContravariant[alpha]); } ////////////////////////////////////////////////////////// @@ -440,19 +325,20 @@ RT energy(const typename Basis::LocalView& localView, RT W_mixt(const Dune::FieldMatrix<field_type,3,3>& S, const Dune::FieldMatrix<field_type,3,3>& T, double mu, double lambda) const { - return mu * frobeniusProduct(sym(S), sym(T)) - + mu_c_ * frobeniusProduct(skew(S), skew(T)) - + lambda * mu / (lambda + 2*mu) * trace(S) * trace(T); + return mu * Dune::GFE::frobeniusProduct(Dune::GFE::sym(S), Dune::GFE::sym(T)) + + mu_c_ * Dune::GFE::frobeniusProduct(Dune::GFE::skew(S), Dune::GFE::skew(T)) + + lambda * mu / (lambda + 2*mu) * Dune::GFE::trace(S) * Dune::GFE::trace(T); } RT W_mp(const Dune::FieldMatrix<field_type,3,3>& S, double mu, double lambda) const { - return mu * sym(S).frobenius_norm2() + mu_c_ * skew(S).frobenius_norm2() + lambda * 0.5 * traceSquared(S); + return mu * Dune::GFE::sym(S).frobenius_norm2() + mu_c_ * Dune::GFE::skew(S).frobenius_norm2() + lambda * 0.5 * Dune::GFE::traceSquared(S); } RT W_curv(const Dune::FieldMatrix<field_type,3,3>& S, double mu) const { - return mu * L_c_ * L_c_ * (b1_ * dev(sym(S)).frobenius_norm2() + b2_ * skew(S).frobenius_norm2() + b3_ * traceSquared(S)); + return mu * L_c_ * L_c_ * (b1_ * Dune::GFE::dev(Dune::GFE::sym(S)).frobenius_norm2() + + b2_ * Dune::GFE::skew(S).frobenius_norm2() + b3_ * Dune::GFE::traceSquared(S)); } private: