From 74509e93101b54648133ac2aa2cf98f7f1a4cf1e Mon Sep 17 00:00:00 2001 From: Klaus <klaus.boehnlein@tu-dresden.de> Date: Sun, 31 Jul 2022 19:38:51 +0200 Subject: [PATCH] FIX BUG: (+)= Missing in ElementAssembly m*m-part --- dune/microstructure/matrix_operations.hh | 25 +++--- inputs/cellsolver.parset | 7 +- src/CMakeLists.txt | 2 +- src/Cell-Problem.cc | 110 ++++++++++++++++------- 4 files changed, 96 insertions(+), 48 deletions(-) diff --git a/dune/microstructure/matrix_operations.hh b/dune/microstructure/matrix_operations.hh index a4a563bc..1c89d36f 100644 --- a/dune/microstructure/matrix_operations.hh +++ b/dune/microstructure/matrix_operations.hh @@ -83,7 +83,7 @@ namespace MatrixOperations { } static double scalarProduct (MatrixRT M1, MatrixRT M2){ - double sum = 0; + double sum = 0.0; for (int i=0; i<3; i++) for (int j=0; j<3; j++) sum += M1[i][j] * M2[i][j]; @@ -99,7 +99,7 @@ namespace MatrixOperations { // t2 *= lambda; // return t1 + t2; // } - +// // static double linearizedStVenantKirchhoffDensity(double mu, double lambda, MatrixRT E1, MatrixRT E2) // CHANGED // { // auto t1 = 2.0 * mu * sym(E1) + lambda * trace(sym(E1)) * Id(); @@ -111,15 +111,15 @@ namespace MatrixOperations { auto t1 = 2.0 * mu * sym(E1) + lambda * trace(sym(E1)) * Id(); auto tmp1 = scalarProduct(t1,sym(E2)); - auto t2 = 2.0 * mu * sym(E2) + lambda * trace(sym(E2)) * Id(); - auto tmp2 = scalarProduct(t2,sym(E1)); - - if(abs(tmp1-tmp2) > 1e-8 ) - { - std::cout << "linearizedStVenantKirchhoffDensity NOT Symmetric!" << std::endl; - std::cout << "tmp1: " << tmp1 << std::endl; - std::cout << "tmp2: " << tmp2 << std::endl; - } +// auto t2 = 2.0 * mu * sym(E2) + lambda * trace(sym(E2)) * Id(); +// auto tmp2 = scalarProduct(t2,sym(E1)); +// +// if(abs(tmp1-tmp2) > 1e-8 ) +// { +// std::cout << "linearizedStVenantKirchhoffDensity NOT Symmetric!" << std::endl; +// std::cout << "tmp1: " << tmp1 << std::endl; +// std::cout << "tmp2: " << tmp2 << std::endl; +// } return tmp1; } @@ -130,7 +130,8 @@ namespace MatrixOperations { auto tmp1 = sym(M); double tmp2 = norm(tmp1); - return lambda*std::pow(trace(M),2) + 2*mu*pow( tmp2 ,2); +// double tmp2 = norm(M); //TEST + return lambda*std::pow(trace(M),2) + 2.0*mu*pow( tmp2 ,2); // return lambda*std::pow(trace(M),2) + 2*mu*pow( norm( sym(M) ),2); } diff --git a/inputs/cellsolver.parset b/inputs/cellsolver.parset index a16cca4f..afc14b79 100644 --- a/inputs/cellsolver.parset +++ b/inputs/cellsolver.parset @@ -27,7 +27,7 @@ cellDomain=1 ## {start,finish} computes on all grid from 2^(start) to 2^finish refinement #---------------------------------------------------- -numLevels= 2 4 +numLevels= 2 4 #numLevels = 0 0 # computes all levels from first to second entry #numLevels = 2 2 # computes all levels from first to second entry #numLevels = 1 3 # computes all levels from first to second entry @@ -113,8 +113,9 @@ write_VTK = true ############################################# # Assembly options ############################################# -set_IntegralZero = true -#set_IntegralZero = false +#set_IntegralZero = true +set_IntegralZero = false +#set_oneBasisFunction_Zero = true #arbitraryLocalIndex = 7 #arbitraryElementNumber = 3 diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 3264ac4d..f3f3b05f 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -16,4 +16,4 @@ foreach(_program ${programs}) endforeach() -#set(CMAKE_BUILD_TYPE Debug) +set(CMAKE_BUILD_TYPE Debug) diff --git a/src/Cell-Problem.cc b/src/Cell-Problem.cc index 3b81eed9..787eb9d0 100644 --- a/src/Cell-Problem.cc +++ b/src/Cell-Problem.cc @@ -232,14 +232,17 @@ void computeElementStiffnessMatrix(const LocalView& localView, // int orderQR = 0; // int orderQR = 1; // int orderQR = 2; +// int orderQR = 3; const auto& quad = QuadratureRules<double,dim>::rule(element.type(), orderQR); - +// double elementContribution = 0.0; // std::cout << "Print QuadratureOrder:" << orderQR << std::endl; //TEST` + int QPcounter= 0; for (const auto& quadPoint : quad) { + QPcounter++; const auto& quadPos = quadPoint.position(); const auto jacobianInverseTransposed = geometry.jacobianInverseTransposed(quadPos); const auto integrationElement = geometry.integrationElement(quadPos); @@ -254,8 +257,8 @@ void computeElementStiffnessMatrix(const LocalView& localView, jacobianInverseTransposed.mv(referenceGradients[i][0], gradients[i]); for (size_t l=0; l< dimWorld; l++) - for (size_t j=0; j < nSf; j++ ) - { + for (size_t j=0; j < nSf; j++ ) + { size_t row = localView.tree().child(l).localIndex(j); // (scaled) Deformation gradient of the test basis function MatrixRT defGradientV(0); @@ -264,7 +267,7 @@ void computeElementStiffnessMatrix(const LocalView& localView, // defGradientV[l][2] = (1.0/gamma)*gradients[j][2]; //X3 defGradientV[l][2] = gradients[j][2]; //X3 - defGradientV = crossSectionDirectionScaling((1/gamma),defGradientV); + defGradientV = crossSectionDirectionScaling((1.0/gamma),defGradientV); // "phi*phi"-part for (size_t k=0; k < dimWorld; k++) for (size_t i=0; i < nSf; i++) @@ -276,9 +279,10 @@ void computeElementStiffnessMatrix(const LocalView& localView, // defGradientU[k][2] = (1.0/gamma)*gradients[i][2]; //X3 defGradientU[k][2] = gradients[i][2]; //X3 // printmatrix(std::cout, defGradientU , "defGradientU", "--"); - defGradientU = crossSectionDirectionScaling((1/gamma),defGradientU); + defGradientU = crossSectionDirectionScaling((1.0/gamma),defGradientU); double energyDensity = linearizedStVenantKirchhoffDensity(mu(quadPos), lambda(quadPos), defGradientU, defGradientV); +// double energyDensity = linearizedStVenantKirchhoffDensity(mu(element.geometry().global(quadPos)), lambda(element.geometry().global(quadPos)), defGradientU, defGradientV); //TEST // double energyDensity = generalizedDensity(mu(quadPos), lambda(quadPos), defGradientU, defGradientV); // also works.. size_t col = localView.tree().child(k).localIndex(i); @@ -290,20 +294,41 @@ void computeElementStiffnessMatrix(const LocalView& localView, for( size_t m=0; m<3; m++) { double energyDensityGphi = linearizedStVenantKirchhoffDensity(mu(quadPos), lambda(quadPos), basisContainer[m], defGradientV); +// double energyDensityGphi = linearizedStVenantKirchhoffDensity(mu(element.geometry().global(quadPos)), lambda(element.geometry().global(quadPos)), basisContainer[m], defGradientV); //TEST auto value = energyDensityGphi * quadPoint.weight() * integrationElement; elementMatrix[row][localPhiOffset+m] += value; elementMatrix[localPhiOffset+m][row] += value; } - } + } // "m*m"-part - for(size_t m=0; m<3; m++) + for(size_t m=0; m<3; m++) //TODO ist symmetric.. reicht die hälfte zu berechnen!!! for(size_t n=0; n<3; n++) { + +// std::cout << "QPcounter: " << QPcounter << std::endl; +// std::cout << "m= " << m << " n = " << n << std::endl; +// printmatrix(std::cout, basisContainer[m] , "basisContainer[m]", "--"); +// printmatrix(std::cout, basisContainer[n] , "basisContainer[n]", "--"); +// std::cout << "integrationElement:" << integrationElement << std::endl; +// std::cout << "quadPoint.weight(): "<< quadPoint.weight() << std::endl; +// std::cout << "mu(quadPos): " << mu(quadPos) << std::endl; +// std::cout << "lambda(quadPos): " << lambda(quadPos) << std::endl; + + double energyDensityGG = linearizedStVenantKirchhoffDensity(mu(quadPos), lambda(quadPos), basisContainer[m], basisContainer[n]); - elementMatrix[localPhiOffset+m][localPhiOffset+n]= energyDensityGG * quadPoint.weight() * integrationElement; +// double energyDensityGG = linearizedStVenantKirchhoffDensity(mu(element.geometry().global(quadPos)), lambda(element.geometry().global(quadPos)), basisContainer[m], basisContainer[n]); //TEST + elementMatrix[localPhiOffset+m][localPhiOffset+n] += energyDensityGG * quadPoint.weight() * integrationElement; // += !!!!! (Fixed-Bug) + +// std::cout << "energyDensityGG:" << energyDensityGG<< std::endl; +// std::cout << "product " << energyDensityGG * quadPoint.weight() * integrationElement << std::endl; +// printmatrix(std::cout, elementMatrix, "elementMatrix", "--"); + } } + +// std::cout << "Number of QuadPoints:" << QPcounter << std::endl; +// printmatrix(std::cout, elementMatrix, "elementMatrix", "--"); } @@ -411,7 +436,6 @@ void computeElementLoadVector( const LocalView& localView, ////////////////////////////////////////////// MatrixRT G_1 {{1.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, {0.0, 0.0, 0.0}}; MatrixRT G_2 {{0.0, 0.0, 0.0}, {0.0, 1.0, 0.0}, {0.0, 0.0, 0.0}}; - MatrixRT G_3 {{0.0, 1.0/sqrt(2.0), 0.0}, {1.0/sqrt(2.0), 0.0, 0.0}, {0.0, 0.0, 0.0}}; std::array<MatrixRT,3 > basisContainer = {G_1, G_2, G_3}; @@ -419,8 +443,8 @@ void computeElementLoadVector( const LocalView& localView, // int orderQR = 0; // int orderQR = 1; // int orderQR = 2; - int orderQR = 3; -// int orderQR = 2*(dim*localFiniteElement.localBasis().order()-1); +// int orderQR = 3; + int orderQR = 2*(dim*localFiniteElement.localBasis().order()-1); const auto& quad = QuadratureRules<double,dim>::rule(element.type(), orderQR); // std::cout << "Quad-Rule order used: " << orderQR << std::endl; @@ -445,11 +469,11 @@ void computeElementLoadVector( const LocalView& localView, // // //TEST QUadrature // std::cout << "quadPos:" << quadPos << std::endl; -// // std::cout << "element.geometry().global(quadPos):" << element.geometry().global(quadPos) << std::endl; -// // -// // +// std::cout << "element.geometry().global(quadPos):" << element.geometry().global(quadPos) << std::endl; +// // // +// // // // std::cout << "quadPoint.weight() :" << quadPoint.weight() << std::endl; -// // std::cout << "integrationElement(quadPos):" << integrationElement << std::endl; +// std::cout << "integrationElement(quadPos):" << integrationElement << std::endl; // std::cout << "mu(quadPos) :" << mu(quadPos) << std::endl; // std::cout << "lambda(quadPos) :" << lambda(quadPos) << std::endl; @@ -465,9 +489,10 @@ void computeElementLoadVector( const LocalView& localView, // defGradientV[k][2] = (1.0/gamma)*gradients[i][2]; // defGradientV[k][2] = gradients[i][2]; // X3 - defGradientV = crossSectionDirectionScaling((1/gamma),defGradientV); + defGradientV = crossSectionDirectionScaling((1.0/gamma),defGradientV); - double energyDensity = linearizedStVenantKirchhoffDensity(mu(quadPos), lambda(quadPos),forceTerm(quadPos), defGradientV ); + double energyDensity = linearizedStVenantKirchhoffDensity(mu(quadPos), lambda(quadPos),forceTerm(quadPos), defGradientV ); +// double energyDensity = linearizedStVenantKirchhoffDensity(mu(element.geometry().global(quadPos)), lambda(element.geometry().global(quadPos)),forceTerm(quadPos), defGradientV ); //TEST // double energyDensity = linearizedStVenantKirchhoffDensity(mu(quadPos), lambda(quadPos),(-1.0)*forceTerm(quadPos), defGradientV ); //TEST // double energyDensity = linearizedStVenantKirchhoffDensity(mu(quadPos), lambda(quadPos),forceTerm(element.geometry().global(quadPos)), defGradientV ); //TEST @@ -479,6 +504,7 @@ void computeElementLoadVector( const LocalView& localView, for (size_t m=0; m<3; m++) { double energyDensityfG = linearizedStVenantKirchhoffDensity(mu(quadPos), lambda(quadPos), forceTerm(quadPos),basisContainer[m] ); +// double energyDensityfG = linearizedStVenantKirchhoffDensity(mu(element.geometry().global(quadPos)), lambda(element.geometry().global(quadPos)), forceTerm(quadPos),basisContainer[m] ); //TEST // double energyDensityfG = linearizedStVenantKirchhoffDensity(mu(quadPos), lambda(quadPos), (-1.0)*forceTerm(quadPos),basisContainer[m] ); //TEST // double energyDensityfG = linearizedStVenantKirchhoffDensity(mu(quadPos), lambda(quadPos), forceTerm(element.geometry().global(quadPos)),basisContainer[m] );//TEST elementRhs[localPhiOffset+m] += energyDensityfG * quadPoint.weight() * integrationElement; @@ -526,7 +552,7 @@ void assembleCellStiffness(const Basis& basis, //std::cout << "elementMatrix.M() : " << elementMatrix.M() << std::endl; //TEST - //Check Symmetry: + //Check Element-Stiffness-Symmetry: for (size_t i=0; i<localPhiOffset; i++) for (size_t j=0; j<localPhiOffset; j++ ) { @@ -579,7 +605,7 @@ void assembleCellLoad(const Basis& basis, auto loadGVF = Dune::Functions::makeGridViewFunction(forceTerm, basis.gridView()); auto loadFunctional = localFunction(loadGVF); - int counter = 1; +// int counter = 1; for (const auto& element : elements(basis.gridView())) { localView.bind(element); @@ -592,7 +618,7 @@ void assembleCellLoad(const Basis& basis, BlockVector<FieldVector<double,1> > elementRhs; // std::cout << "----------------------------------Element : " << counter << std::endl; //TEST - counter++; +// counter++; computeElementLoadVector(localView, muLocal, lambdaLocal, gamma, elementRhs, loadFunctional); // computeElementLoadVector(localView, muLocal, lambdaLocal, gamma, elementRhs, forceTerm); //TEST // printvector(std::cout, elementRhs, "elementRhs", "--"); @@ -657,11 +683,11 @@ auto energy(const Basis& basis, const auto& localFiniteElement = localView.tree().child(0).finiteElement(); // int orderQR = 2*(dim*localFiniteElement.localBasis().order()-1 + 5 ); // TEST -// int orderQR = 2*(dim*localFiniteElement.localBasis().order()-1); + int orderQR = 2*(dim*localFiniteElement.localBasis().order()-1); // int orderQR = 0; // int orderQR = 1; // int orderQR = 2; - int orderQR = 3; +// int orderQR = 3; const QuadratureRule<double, dim>& quad = QuadratureRules<double, dim>::rule(e.type(), orderQR); for (const auto& quadPoint : quad) @@ -1011,8 +1037,8 @@ auto test_derivative(const Basis& basis, // int orderQR = 0; // int orderQR = 1; // int orderQR = 2; - int orderQR = 3; -// int orderQR = 2*(dim*localFiniteElement.localBasis().order()-1); +// int orderQR = 3; + int orderQR = 2*(dim*localFiniteElement.localBasis().order()-1); const QuadratureRule<double, dim>& quad = QuadratureRules<double, dim>::rule(e.type(), orderQR); for (const auto& quadPoint : quad) @@ -1037,7 +1063,8 @@ auto test_derivative(const Basis& basis, - double energyDensity = linearizedStVenantKirchhoffDensity(mu(quadPos), lambda(quadPos), strain1, strain2); +// double energyDensity = linearizedStVenantKirchhoffDensity(mu(quadPos), lambda(quadPos), strain1, strain2); + double energyDensity = linearizedStVenantKirchhoffDensity(mu(quadPos), lambda(quadPos), test, strain2); elementEnergy += energyDensity * quadPoint.weight() * integrationElement; @@ -1168,6 +1195,10 @@ auto check_Orthogonality(const Basis& basis, using GridView = typename Basis::GridView; using Domain = typename GridView::template Codim<0>::Geometry::GlobalCoordinate; using MatrixRT = FieldMatrix< double, dimWorld, dimWorld>; + +// std::cout << "Press key.." << std::endl; +// std::cin.get(); + // TEST // FieldVector<double,3> testvector = {1.0 , 1.0 , 1.0}; // printmatrix(std::cout, matrixFieldFuncB(testvector) , "matrixFieldB(testvector) ", "--"); @@ -1189,11 +1220,11 @@ auto check_Orthogonality(const Basis& basis, const auto& localFiniteElement = localView.tree().child(0).finiteElement(); // int orderQR = 2*(dim*localFiniteElement.localBasis().order()-1 + 5 ); // TEST -// int orderQR = 2*(dim*localFiniteElement.localBasis().order()-1); + int orderQR = 2*(dim*localFiniteElement.localBasis().order()-1); // int orderQR = 0; // int orderQR = 1; // int orderQR = 2; - int orderQR = 3; +// int orderQR = 3; const QuadratureRule<double, dim>& quad = QuadratureRules<double, dim>::rule(e.type(), orderQR); for (const auto& quadPoint : quad) @@ -1304,11 +1335,11 @@ auto computeFullQ(const Basis& basis, const auto& localFiniteElement = localView.tree().child(0).finiteElement(); // int orderQR = 2*(dim*localFiniteElement.localBasis().order()-1 + 5 ); // TEST -// int orderQR = 2*(dim*localFiniteElement.localBasis().order()-1); + int orderQR = 2*(dim*localFiniteElement.localBasis().order()-1); // int orderQR = 0; // int orderQR = 1; // int orderQR = 2; - int orderQR = 3; +// int orderQR = 3; const QuadratureRule<double, dim>& quad = QuadratureRules<double, dim>::rule(e.type(), orderQR); for (const auto& quadPoint : quad) @@ -1341,10 +1372,11 @@ auto computeFullQ(const Basis& basis, auto X1 = G1 + Chi1; auto X2 = G2 + Chi2; - + + double energyDensity = linearizedStVenantKirchhoffDensity(mu(quadPos), lambda(quadPos), X1, X2); - elementEnergy += energyDensity * quadPoint.weight() * integrationElement; + elementEnergy += energyDensity * quadPoint.weight() * integrationElement; // quad[quadPoint].weight() ??? // elementEnergy += strain1 * quadPoint.weight() * integrationElement; @@ -1644,7 +1676,8 @@ int main(int argc, char *argv[]) MatrixCT stiffnessMatrix_CE; bool set_IntegralZero = parameterSet.get<bool>("set_IntegralZero", false); - bool set_oneBasisFunction_Zero = false; + bool set_oneBasisFunction_Zero = parameterSet.get<bool>("set_oneBasisFunction_Zero", false); +// bool set_oneBasisFunction_Zero = false; bool substract_integralMean = false; if(set_IntegralZero) { @@ -1737,6 +1770,13 @@ int main(int argc, char *argv[]) assembleCellLoad(Basis_CE, muLocal, lambdaLocal,gamma, load_alpha1 ,x3G_1neg); assembleCellLoad(Basis_CE, muLocal, lambdaLocal,gamma, load_alpha2 ,x3G_2neg); assembleCellLoad(Basis_CE, muLocal, lambdaLocal,gamma, load_alpha3 ,x3G_3neg); + //TEST +// assembleCellStiffness(Basis_CE, muTerm, lambdaTerm, gamma, stiffnessMatrix_CE, parameterSet); +// std::cout << "Stiffness assembly Timer: " << StiffnessTimer.elapsed() << std::endl; +// assembleCellLoad(Basis_CE, muTerm, lambdaTerm,gamma, load_alpha1 ,x3G_1neg); +// assembleCellLoad(Basis_CE, muTerm, lambdaTerm,gamma, load_alpha2 ,x3G_2neg); +// assembleCellLoad(Basis_CE, muTerm, lambdaTerm,gamma, load_alpha3 ,x3G_3neg); + //TEST // assembleCellLoad(Basis_CE, muLocal, lambdaLocal,gamma, load_alpha1 ,x3G_1); // assembleCellLoad(Basis_CE, muLocal, lambdaLocal,gamma, load_alpha2 ,x3G_2); @@ -1958,6 +1998,9 @@ int main(int argc, char *argv[]) log << " --------------------" << std::endl; log << "Corrector-Matrix M_3: \n" << M_3 << std::endl; log << " --------------------" << std::endl; + + + //////////////////////////////////////////////////////////////////////////// // Substract Integral-mean @@ -2085,6 +2128,9 @@ int main(int argc, char *argv[]) // std::cout << "evaluate derivative " << output_der << std::endl; + + + // TODO : MOVE All of this into a separate class : 'computeEffectiveQuantities' ///////////////////////////////////////////////////////// // Compute effective quantities: Elastic law & Prestrain ///////////////////////////////////////////////////////// -- GitLab