diff --git a/dune/microstructure/CorrectorComputer.hh b/dune/microstructure/CorrectorComputer.hh index d81552408b56790f2e5a3ae0a1584916f22360b8..8d8c53e716cfd48de33612313846ee798ae1a342 100644 --- a/dune/microstructure/CorrectorComputer.hh +++ b/dune/microstructure/CorrectorComputer.hh @@ -12,6 +12,8 @@ #include <dune/istl/eigenvalue/test/matrixinfo.hh> // TEST: compute condition Number #include <dune/solvers/solvers/umfpacksolver.hh> +#include <dune/microstructure/voigthelper.hh> + using namespace MatrixOperations; using std::shared_ptr; @@ -298,7 +300,7 @@ public: jacobians[i] = jacobians[i] * geometryJacobianInverse; // Compute the scaled deformation gradient for each shape function - std::vector<std::array<MatrixRT,dimworld> > deformationGradient(nSf); + std::vector<std::array<VoigtVector<double,dim>,dimworld> > deformationGradient(nSf); for (size_t i=0; i < nSf; i++) { @@ -307,7 +309,7 @@ public: MatrixRT defGradientV(0); defGradientV[k] = jacobians[i][0]; - deformationGradient[i][k] = sym(crossSectionDirectionScaling((1.0/gamma_),defGradientV)); + deformationGradient[i][k] = matrixToVoigt(sym(crossSectionDirectionScaling((1.0/gamma_),defGradientV))); } } @@ -365,7 +367,7 @@ public: // printmatrix(std::cout, material_.ElasticityTensor(defGradientU,localIndicatorFunction(quadPos)), "material_.ElasticityTensor(defGradientU,localIndicatorFunction(quadPos)", "--"); - double energyDensity= scalarProduct(material_.applyElasticityTensor(deformationGradient[i][k],phase),deformationGradient[j][l]); + double energyDensity= voigtScalarProduct(material_.applyElasticityTensor(deformationGradient[i][k],phase),deformationGradient[j][l]); // double energyDensity= scalarProduct(material_.ElasticityTensor(defGradientU,localIndicatorFunction(quadPos)),sym(defGradientV)); // double energyDensity= scalarProduct(elasticityTensor(defGradientU,localIndicatorFunction(quadPos)),sym(defGradientV)); // double energyDensity= scalarProduct(elasticityTensor(defGradientU,indicatorFunction(element.geometry().global(quadPos))),sym(defGradientV)); @@ -406,7 +408,7 @@ public: - double energyDensityGphi = scalarProduct(material_.applyElasticityTensor(matrixBasis_[m],phase),deformationGradient[j][l]); + double energyDensityGphi = voigtScalarProduct(material_.applyElasticityTensor(matrixToVoigt(matrixBasis_[m]),phase),deformationGradient[j][l]); // double energyDensityGphi = scalarProduct(material_.ElasticityTensor(basisContainer[m],localIndicatorFunction(quadPos)),sym(defGradientV)); // double energyDensityGphi= scalarProduct(elasticityTensor(basisContainer[m],localIndicatorFunction(quadPos)),sym(defGradientV)); // std::cout << "scalarProduct(elasticityTensor(basisContainer[m],indicatorFunction(element.geometry().global(quadPos))),sym(defGradientV))" << scalarProduct(elasticityTensor(basisContainer[m],indicatorFunction(element.geometry().global(quadPos))),sym(defGradientV)) <<std::endl; @@ -455,7 +457,7 @@ public: - double energyDensityGG = scalarProduct(material_.applyElasticityTensor(matrixBasis_[m],phase),matrixBasis_[n]); + double energyDensityGG = voigtScalarProduct(material_.applyElasticityTensor(matrixToVoigt(matrixBasis_[m]),phase),matrixToVoigt(matrixBasis_[n])); // double energyDensityGG = scalarProduct(material_.ElasticityTensor(basisContainer[m],localIndicatorFunction(quadPos)),sym(basisContainer[n])); // double energyDensityGG= scalarProduct(elasticityTensor(basisContainer[m],localIndicatorFunction(quadPos)),sym(basisContainer[n])); // double energyDensityGG= scalarProduct(elasticityTensor(basisContainer[m],indicatorFunction(element.geometry().global(quadPos))),sym(basisContainer[n])); @@ -580,19 +582,19 @@ public: for (size_t k=0; k < dimworld; k++) { // Deformation gradient of the ansatz basis function - MatrixRT defGradientV(0); - defGradientV[k][0] = jacobians[i][0][0]; // Y - defGradientV[k][1] = jacobians[i][0][1]; // X2 - // defGradientV[k][2] = (1.0/gamma_)*jacobians[i][0][2]; // - defGradientV[k][2] = jacobians[i][0][2]; // X3 + MatrixRT tmpDefGradientV(0); + tmpDefGradientV[k][0] = jacobians[i][0][0]; // Y + tmpDefGradientV[k][1] = jacobians[i][0][1]; // X2 + // tmpDefGradientV[k][2] = (1.0/gamma_)*jacobians[i][0][2]; // + tmpDefGradientV[k][2] = jacobians[i][0][2]; // X3 - defGradientV = sym(crossSectionDirectionScaling((1.0/gamma_),defGradientV)); + VoigtVector<double,3> defGradientV = matrixToVoigt(sym(crossSectionDirectionScaling((1.0/gamma_),tmpDefGradientV))); // double energyDensity= scalarProduct(material_.ElasticityTensorGlobal((-1.0)*forceTerm(quadPos),element.geometry().global(quadPos)),sym(defGradientV)); - double energyDensity= scalarProduct(material_.applyElasticityTensor((-1.0)*forceTerm(quadPos),localIndicatorFunction(quadPos)),sym(defGradientV)); + double energyDensity= voigtScalarProduct(material_.applyElasticityTensor((-1.0)*matrixToVoigt(forceTerm(quadPos)),localIndicatorFunction(quadPos)),defGradientV); // double energyDensity= scalarProduct(material_.ElasticityTensor((-1.0)*forceTerm(quadPos),localIndicatorFunction(quadPos)),sym(defGradientV)); // double energyDensity= scalarProduct(elasticityTensor((-1.0)*forceTerm(quadPos),localIndicatorFunction(quadPos)),sym(defGradientV)); // double energyDensity= scalarProduct(elasticityTensor((-1.0)*forceTerm(quadPos),indicatorFunction(element.geometry().global(quadPos))),sym(defGradientV)); @@ -618,7 +620,7 @@ public: // double energyDensityfG= scalarProduct(material_.ElasticityTensorGlobal((-1.0)*forceTerm(quadPos),element.geometry().global(quadPos)),sym(basisContainer[m])); - double energyDensityfG= scalarProduct(material_.applyElasticityTensor((-1.0)*forceTerm(quadPos),localIndicatorFunction(quadPos)),sym(basisContainer[m])); + double energyDensityfG= voigtScalarProduct(material_.applyElasticityTensor((-1.0)*matrixToVoigt(forceTerm(quadPos)),localIndicatorFunction(quadPos)),matrixToVoigt(basisContainer[m])); // double energyDensityfG= scalarProduct(material_.ElasticityTensor((-1.0)*forceTerm(quadPos),localIndicatorFunction(quadPos)),sym(basisContainer[m])); // double energyDensityfG= scalarProduct(elasticityTensor((-1.0)*forceTerm(quadPos),localIndicatorFunction(quadPos)),sym(basisContainer[m])); // double energyDensityfG= scalarProduct(elasticityTensor((-1.0)*forceTerm(quadPos),indicatorFunction(element.geometry().global(quadPos))),sym(basisContainer[m])); @@ -1378,19 +1380,15 @@ public: auto Chi = sym(crossSectionDirectionScaling(1.0/gamma_, DerPhi2(quadPos))) + mContainer[b]; - auto strain1 = DerPhi1(quadPos); - - - strain1 = crossSectionDirectionScaling(1.0/gamma_, strain1); - strain1 = sym(strain1); + const auto strain1 = matrixToVoigt(sym(crossSectionDirectionScaling(1.0/gamma_, DerPhi1(quadPos)))); auto G = matrixFieldG(quadPos); // auto G = matrixFieldG(e.geometry().global(quadPos)); //TEST - auto tmp = G + mContainer[a] + strain1; + auto tmp = matrixToVoigt(G + mContainer[a]) + strain1; - double energyDensity= scalarProduct(material_.applyElasticityTensor(tmp,localIndicatorFunction(quadPos)),sym(Chi)); + double energyDensity= voigtScalarProduct(material_.applyElasticityTensor(tmp,localIndicatorFunction(quadPos)),matrixToVoigt(sym(Chi))); // double energyDensity= scalarProduct(material_.ElasticityTensor(tmp,localIndicatorFunction(quadPos)),sym(Chi)); // double energyDensity = linearizedStVenantKirchhoffDensity(mu(quadPos), lambda(quadPos), tmp, Chi); diff --git a/dune/microstructure/EffectiveQuantitiesComputer.hh b/dune/microstructure/EffectiveQuantitiesComputer.hh index b6f3e8aff123858541694bd5eaa089bedcc79ac7..c6e358d4c796396fba5d84d5371d5a975eda3457 100644 --- a/dune/microstructure/EffectiveQuantitiesComputer.hh +++ b/dune/microstructure/EffectiveQuantitiesComputer.hh @@ -170,10 +170,10 @@ public: // auto G1 = matrixFieldG1(e.geometry().global(quadPos)); //TEST // auto G2 = matrixFieldG2(e.geometry().global(quadPos)); //TEST - auto X1 = G1 + Chi1; + auto X1 = matrixToVoigt(G1 + Chi1); // auto X2 = G2 + Chi2; - double energyDensity= scalarProduct(material_.applyElasticityTensor(X1,localIndicatorFunction(quadPos)),sym(G2)); + double energyDensity= voigtScalarProduct(material_.applyElasticityTensor(X1,localIndicatorFunction(quadPos)), matrixToVoigt(sym(G2))); // double energyDensity= scalarProduct(material_.ElasticityTensor(X1,localIndicatorFunction(quadPos)),sym(G2)); // double energyDensity = linearizedStVenantKirchhoffDensity(mu(quadPos), lambda(quadPos), X1, G2); elementEnergy += energyDensity * quadPoint.weight() * integrationElement; // quad[quadPoint].weight() ??? @@ -188,7 +188,7 @@ public: // printmatrix(std::cout, prestrainPhaseValue_old, "prestrainPhaseValue_old", "--"); // printmatrix(std::cout, prestrainPhaseValue, "prestrainPhaseValue", "--"); // } - auto value = scalarProduct(material_.applyElasticityTensor(X1,localIndicatorFunction(quadPos)),sym(prestrainPhaseValue)); + auto value = voigtScalarProduct(material_.applyElasticityTensor(X1,localIndicatorFunction(quadPos)),matrixToVoigt(sym(prestrainPhaseValue))); elementPrestrain += value * quadPoint.weight() * integrationElement; // elementPrestrain += scalarProduct(material_.ElasticityTensor(X1,localIndicatorFunction(quadPos)),sym(prestrainPhaseValue)) * quadPoint.weight() * integrationElement; diff --git a/dune/microstructure/prestrainedMaterial.hh b/dune/microstructure/prestrainedMaterial.hh index 16e43bff33a63940e9cd500300c8405e5410a7df..4574cafab436b2cea03ee4e98b46ff13d9e5672d 100644 --- a/dune/microstructure/prestrainedMaterial.hh +++ b/dune/microstructure/prestrainedMaterial.hh @@ -596,17 +596,15 @@ Dune::FieldMatrix<double,6,6> setupPhase(Python::Module module, int phase) //------------------------------------------------------------------------------- - MatrixRT applyElasticityTensor(const MatrixRT& G, const int& phase) const + VoigtVector<double,3> applyElasticityTensor(const VoigtVector<double,3>& G, const int& phase) const { - - VoigtVector<double,3> G_tmp = strainToVoigt(G); VoigtVector<double,3> out(0); // printmatrix(std::cout, L_[0], "L_[0]", "--"); - L_[phase-1].mv(G_tmp,out); + L_[phase-1].mv(G,out); - return voigtToStress(out); - } + return out; + } //////////////////////////////////////////////////////////////////////////////////////// diff --git a/dune/microstructure/voigthelper.hh b/dune/microstructure/voigthelper.hh index cf5063a64c151cc9a9a2ee24f28ca585a10b0cdd..24984e84f870ad001924a89421198dbeaba1558e 100644 --- a/dune/microstructure/voigthelper.hh +++ b/dune/microstructure/voigthelper.hh @@ -28,28 +28,12 @@ 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]}}; } +/** \brief Interpret Voigt vectors as symmetric matrices and compute their Frobenius scalar voigtScalarProduct + */ template<typename T> -VoigtVector<T,3> strainToVoigt(const Dune::FieldMatrix<T,3,3>& G) -{ - return {G[0][0], G[1][1], G[2][2], 2.0*G[1][2], 2.0*G[0][2], 2.0*G[0][1]}; -} - -template<typename T> -VoigtVector<T,3> stressToVoigt(const Dune::FieldMatrix<T,3,3>& G) -{ - return {G[0][0], G[1][1], G[2][2], G[1][2], G[0][2], G[0][1]}; -} - -template<typename T> -Dune::FieldMatrix<T,3,3> voigtToStress(const VoigtVector<T,3>& v) -{ - return {{v[0], v[5], v[4]}, {v[5], v[1], v[3]}, {v[4], v[3], v[2]}}; -} - -template<typename T> -Dune::FieldMatrix<T,3,3> voigtToStrain(const Dune::FieldVector<T,6>& v) +T voigtScalarProduct(const VoigtVector<T,3>& a, const VoigtVector<T,3>& b) { - 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 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]; } #endif // DUNE_MICROSTRUCTURE_VOIGTHELPER_HH