diff --git a/dune/microstructure/matrix_operations.hh b/dune/microstructure/matrix_operations.hh index 1796b1b2ffcf1686ba58b552c376b7d38331f20f..59224003ec84df61f6de1c1c19be766679d62981 100644 --- a/dune/microstructure/matrix_operations.hh +++ b/dune/microstructure/matrix_operations.hh @@ -143,6 +143,22 @@ namespace MatrixOperations { }; } + + /** + * @brief Scale last three columns of stiffness matrix by a factor of 2. + * Inserting this facotr in the stiffness matrix allows to use the + * same Matrix-to-Vector mapping for both the stress and the strain. + * + * @param S Stiffness matrix + */ + static void scaleStiffnessMatrix(Dune::FieldMatrix<double,6,6>& S){ + for(size_t i = 0; i<6; i++) + for(size_t j = 3; j<6; j++) + { + S[i][j] = 2.0*S[i][j]; + } + } + // static double linearizedStVenantKirchhoffDensity(double mu, double lambda, MatrixRT E1, MatrixRT E2){ // ?? Check with Robert // E1= sym(E1); // E2 = sym(E2); diff --git a/dune/microstructure/prestrainedMaterial.hh b/dune/microstructure/prestrainedMaterial.hh index 4574cafab436b2cea03ee4e98b46ff13d9e5672d..deae82234e1553f7c3c0646f9e11b854e3b4fe01 100644 --- a/dune/microstructure/prestrainedMaterial.hh +++ b/dune/microstructure/prestrainedMaterial.hh @@ -395,15 +395,15 @@ Dune::FieldMatrix<double,6,6> setupPhase(Python::Module module, int phase) // MATERIAL CLASSES DEFINITIONS: //////////////////////////////////////////////////////// - //--- Definition of isotropic elasticity tensor (stiffness matrix in voigt notation) + /** \brief Isotropic stiffness matrix in Voigt notation but scaled by a factor of 2 in the last three columns. */ Dune::FieldMatrix<double,6,6> isotropic(const double& mu, const double& lambda) { - return {{lambda+2.0*mu, lambda , lambda , 0.0 , 0.0 , 0.0 }, - {lambda , lambda+2.0*mu, lambda , 0.0 , 0.0 , 0.0 }, - {lambda , lambda , lambda+2.0*mu, 0.0 , 0.0 , 0.0 }, - { 0.0 , 0.0 , 0.0 , mu , 0.0 , 0.0 }, - { 0.0 , 0.0 , 0.0 , 0.0 , mu , 0.0 }, - { 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , mu } + return {{lambda+2.0*mu, lambda , lambda , 0.0 , 0.0 , 0.0 }, + {lambda , lambda+2.0*mu, lambda , 0.0 , 0.0 , 0.0 }, + {lambda , lambda , lambda+2.0*mu, 0.0 , 0.0 , 0.0 }, + { 0.0 , 0.0 , 0.0 , 2.0*mu, 0.0 , 0.0 }, + { 0.0 , 0.0 , 0.0 , 0.0 , 2.0*mu, 0.0 }, + { 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 2.0*mu } }; } //------------------------------------------------------------------------------- @@ -476,12 +476,14 @@ Dune::FieldMatrix<double,6,6> setupPhase(Python::Module module, int phase) (Compliance.leftmultiply(C_rot)).rightmultiply(C_rot.transposed()); } - printmatrix(std::cout, Compliance, "Compliance matrix used:", "--"); - // invert to obtain elasticity/stiffness-Tensor + // invert Compliance matrix to obtain elasticity/stiffness matrix Compliance.invert(); // printmatrix(std::cout, Compliance, "Stiffness Tensor", "--"); + scaleStiffnessMatrix(Compliance); + // printmatrix(std::cout, Compliance, "Stiffness Tensor scaled", "--"); + // printmatrix(std::cout, Compliance, "Stiffness Tensor", "--"); return Compliance; } //------------------------------------------------------------------------------- @@ -548,7 +550,10 @@ Dune::FieldMatrix<double,6,6> setupPhase(Python::Module module, int phase) //--- return elasticity tensor Compliance.invert(); - // printmatrix(std::cout, C, "C after .invert()", "--"); + // printmatrix(std::cout, Compliance, "Stiffness Tensor", "--"); + + scaleStiffnessMatrix(Compliance); + return Compliance; } //------------------------------------------------------------------------------- @@ -588,9 +593,15 @@ Dune::FieldMatrix<double,6,6> setupPhase(Python::Module module, int phase) } printmatrix(std::cout, Compliance, "Compliance matrix used:", "--"); - //--- return elasticity tensor (in Voigt notation) + + + + //--- return stiffness/elasticity tensor (in Voigt notation) Compliance.invert(); - // printmatrix(std::cout, C, "C after .invert()", "--"); + // printmatrix(std::cout, Compliance, "Stiffness Tensor", "--"); + + scaleStiffnessMatrix(Compliance); + return Compliance; } //------------------------------------------------------------------------------- diff --git a/dune/microstructure/voigthelper.hh b/dune/microstructure/voigthelper.hh index 05668a29891b7106b7420242e168964c753e1ec4..5058f710ec2b21a535b8da7f51aec7082d498646 100644 --- a/dune/microstructure/voigthelper.hh +++ b/dune/microstructure/voigthelper.hh @@ -16,16 +16,26 @@ template<typename T, int dim> using VoigtMatrix = Dune::FieldMatrix<T,dim*(dim+1)/2,dim*(dim+1)/2>; +/** + * @brief Voigt-notation(https://de.wikipedia.org/wiki/Voigtsche_Notation) distinguishes + * in the transformation from Matrix to Vector between stresses and strains. The transformation + * for strains features an additional factor 2 for the non-diagonal entries. In order to avoid + * the use of different data structures for both stresses & strains we use the same Matrix-to-Vector + * mapping ('matrixToVoigt') and incorporate the factors in suitable places. namely: + * - The Stiffness matrix of the constitutive relation get scaled by a factor of 2 in the last three columns + * - The 'voigtScalarProduct' scales the lase three products by a factor of 2 + */ + template<typename T> VoigtVector<T,3> matrixToVoigt(const Dune::FieldMatrix<T,3,3>& matrix) { - return {matrix[0][0], matrix[1][1], matrix[2][2], 2.0*matrix[1][2], 2.0*matrix[0][2], 2.0*matrix[0][1]}; + return {matrix[0][0], matrix[1][1], matrix[2][2], matrix[1][2], matrix[0][2], matrix[0][1]}; } template<typename T> Dune::FieldMatrix<T,3,3> voigtToMatrix(const VoigtVector<T,3>& v) { - return {{v[0], v[5]/2.0, v[4]/2.0}, {v[5]/2.0, v[1], v[3]/2.0}, {v[4]/2.0, v[3]/2.0, v[2]}}; + return {{v[0], v[5], v[4]}, {v[5], v[1], v[3]}, {v[4], v[3], v[2]}}; } /** \brief Interpret Voigt vectors as symmetric matrices and compute their Frobenius scalar voigtScalarProduct @@ -33,7 +43,7 @@ Dune::FieldMatrix<T,3,3> voigtToMatrix(const VoigtVector<T,3>& v) template<typename T> T voigtScalarProduct(const VoigtVector<T,3>& a, const VoigtVector<T,3>& b) { - return a[0]*b[0] + a[1]*b[1] + a[2]*b[2] + 2*a[3]*b[3] + 2*a[4]*b[4] + 2*a[5]*b[5]; + return a[0]*b[0] + a[1]*b[1] + a[2]*b[2] + 2.0*a[3]*b[3] + 2.0*a[4]*b[4] + 2.0*a[5]*b[5]; } /** \brief Return the symmetric part of a matrix, in Voigt notation */ @@ -44,9 +54,9 @@ VoigtVector<T,3> symVoigt(const Dune::FieldMatrix<T,3,3>& matrix) matrix[1][1], matrix[2][2], // The 0.5 is part of the sym operator, the 2.0 is from the conversion to Voigt notation - 2 * 0.5 * (matrix[1][2] + matrix[2][1]), - 2 * 0.5 * (matrix[0][2] + matrix[2][0]), - 2 * 0.5 * (matrix[0][1] + matrix[1][0])}; + 0.5 * (matrix[1][2] + matrix[2][1]), + 0.5 * (matrix[0][2] + matrix[2][0]), + 0.5 * (matrix[0][1] + matrix[1][0])}; return result; }