diff --git a/dune/microstructure/prestrain_material_geometry.hh b/dune/microstructure/prestrain_material_geometry.hh index 092fa5474c74e9cc72e6ab4ad89121e77c67dbbf..ae4560d6e10c7a366d09b772eee5324544f1e208 100644 --- a/dune/microstructure/prestrain_material_geometry.hh +++ b/dune/microstructure/prestrain_material_geometry.hh @@ -1,5 +1,5 @@ -#ifndef DUNE_MICROSTRUCTURE_PRESTRAI_MATERIAL_GEOMETRY_HH -#define DUNE_MICROSTRUCTURE_PRESTRAI_MATERIAL_GEOMETRY_HH +#ifndef DUNE_MICROSTRUCTURE_PRESTRAIN_MATERIAL_GEOMETRY_HH +#define DUNE_MICROSTRUCTURE_PRESTRAIN_MATERIAL_GEOMETRY_HH #include <dune/grid/uggrid.hh> @@ -18,16 +18,14 @@ using std::cos; - +template <int dim> class IsotropicMaterialImp { public: - static const int dim = 3; - static const int dimWorld = 3; + static const int dimWorld = dim; using CellGridType = YaspGrid< dim, EquidistantOffsetCoordinates< double, dim>>; - using GridView = CellGridType::LeafGridView; - using Domain = GridView::Codim<0>::Geometry::GlobalCoordinate; + using Domain = typename CellGridType::LeafGridView::template Codim<0>::Geometry::GlobalCoordinate; using MatrixRT = FieldMatrix< double, dimWorld, dimWorld>; using Func2Tensor = std::function< MatrixRT(const Domain&) >; using FuncScalar = std::function< double(const Domain&) >; @@ -757,16 +755,17 @@ public: // TODO add log here? - +template <int dim> class PrestrainImp { public: - static const int dim = 3; +// static const int dim = 3; static const int dimWorld = 3; using CellGridType = YaspGrid< dim, EquidistantOffsetCoordinates< double, dim>>; - using GridView = CellGridType::LeafGridView; - using Domain = GridView::Codim<0>::Geometry::GlobalCoordinate; +// using GridView = CellGridType::LeafGridView; + using Domain = typename CellGridType::LeafGridView::template Codim<0>::Geometry::GlobalCoordinate; +// using Domain = GridView::Codim<0>::Geometry::GlobalCoordinate; using MatrixRT = FieldMatrix< double, dimWorld, dimWorld>; using ScalarRT = double; using Func2Tensor = std::function< MatrixRT(const Domain&) >; diff --git a/dune/microstructure/vtk_filler.hh b/dune/microstructure/vtk_filler.hh index 0443c078b83ec1cf155b6e6e0063874f29a6be46..aa61fb2c1c8b475338d0d9def75e57c8709180ca 100644 --- a/dune/microstructure/vtk_filler.hh +++ b/dune/microstructure/vtk_filler.hh @@ -3,7 +3,7 @@ #include <dune/functions/functionspacebases/hierarchicvectorwrapper.hh> #include <dune/functions/functionspacebases/interpolate.hh> -//#include <dune/functions/gridfunctions/gridviewfunction.hh> +//#include <dune/functions/gridfunctions/gridviewfunction.hh> #include <dune/functions/gridfunctions/discreteglobalbasisfunction.hh> #include <dune/microstructure/prestrain_material_geometry.hh> @@ -21,7 +21,7 @@ using MatrixRT = FieldMatrix< double, dimworld, dimworld>; using VectorRT = FieldVector< double, dimworld>; using ScalarRT = double; - + using ScalarCT = std::vector<double>; using VectorCT = BlockVector<FieldVector<double,1> >; @@ -30,8 +30,8 @@ */ /* template<class Basis> - static auto scalarDiscGlobalBasisFunc( - const Basis& feBasis, + static auto scalarDiscGlobalBasisFunc( + const Basis& feBasis, std::function< double(const typename Basis::GridView::template Codim<0>::Geometry::GlobalCoordinate&) >& scalarFunc) { ScalarCT values; @@ -43,7 +43,7 @@ template<class Basis> static auto vectorDiscGlobalBasisFunc( - const Basis& feBasis, + const Basis& feBasis, std::function< FieldVector< double, dimworld>(const typename Basis::GridView::template Codim<0>::Geometry::GlobalCoordinate&) >& vectorFunc) { VectorCT values; @@ -76,17 +76,17 @@ public: using VectorCT = BlockVector<FieldVector<double,1> >; using HierarchicVectorView = Dune::Functions::HierarchicVectorWrapper< VectorCT, double>; - + void vtkPrestrainNorm(const GV& gridView, const FuncMatrix& B, string filename) // Updated { VTKWriter<typename GT::LeafGridView> vtkWriter(gridView); Functions::LagrangeBasis<typename GT::LeafGridView, 1> feBasis(gridView); - FuncScalar normB = PrestrainImp().getNormPrestrain(B); - + FuncScalar normB = PrestrainImp<dim>().getNormPrestrain(B); + // auto discGlobalBasisFunc = scalarDiscGlobalBasisFunc(feBasis, normB); auto discGlobalBasisFunc = Dune::Functions::makeGridViewFunction(normB, gridView); // auto muLocal = localFunction(muGridF); - + ScalarCT values; Functions::interpolate(feBasis, values, normB); @@ -94,13 +94,13 @@ public: (feBasis, values); vtkWriter.addVertexData(normB_DGBF, VTK::FieldInfo("normB", VTK::FieldInfo::Type::scalar, 1)); vtkWriter.write(filename); - + } void vtkPrestrainDirector(const typename GT::LeafGridView& gridView, const FuncVector& b, string filename) { VTKWriter<typename GT::LeafGridView> vtkWriter(gridView); - + using namespace Functions::BasisFactory; auto basis_CE = makeBasis( @@ -118,8 +118,8 @@ public: } - void vtkMaterialCell(const GV& gridView_CE, - const FuncScalar& mu_Func, + void vtkMaterialCell(const GV& gridView_CE, + const FuncScalar& mu_Func, std::string filename) { @@ -135,15 +135,15 @@ public: auto material_DGBF = Functions::makeDiscreteGlobalBasisFunction< ScalarRT > (scalarFeBasis, material_Coeff); vtkWriter.addCellData(material_DGBF, VTK::FieldInfo("mu", VTK::FieldInfo::Type::scalar, 1)); - + vtkWriter.write(filename); std::cout << "vtkMaterialCell done.\n"; } - - void vtkMaterial3DRod(const GV& gridView_R3D, double eps, - const FuncVector& domain_Func, const FuncScalar& mu_Func, + + void vtkMaterial3DRod(const GV& gridView_R3D, double eps, + const FuncVector& domain_Func, const FuncScalar& mu_Func, std::string filename) { @@ -168,15 +168,15 @@ public: auto material_DGBF = Functions::makeDiscreteGlobalBasisFunction< ScalarRT > (scalarFeBasis, material_Coeff); vtkWriter.addVertexData(material_DGBF, VTK::FieldInfo("mu", VTK::FieldInfo::Type::scalar, 1)); - + vtkWriter.write(filename); std::cout << "vtkProblem done.\n"; } - void vtkProblemCell(const GV& gridView_CE, - const FuncMatrix& B_Func, const FuncScalar& mu_Func, + void vtkProblemCell(const GV& gridView_CE, + const FuncMatrix& B_Func, const FuncScalar& mu_Func, std::string filename) { @@ -187,7 +187,7 @@ public: // Vector data const auto basis_CE = makeBasis(gridView_CE, power<dimworld>(lagrange<1>(), flatLexicographic())); //flatInterleaved() - + FuncVector Be1_Func = [B_Func](const auto& x) { return B_Func(x)[0]; @@ -218,10 +218,10 @@ public: auto Be3_DGBF = Functions::makeDiscreteGlobalBasisFunction<VectorRT> (Functions::subspaceBasis(basis_CE), HierarchicVectorView(Be3_Coeff)); vtkWriter.addVertexData(Be3_DGBF, VTK::FieldInfo("B_e3", VTK::FieldInfo::Type::vector, 3)); - + // Scalar data Functions::LagrangeBasis<GV, 1> scalarFeBasis(gridView_CE); - FuncScalar normB_Func = PrestrainImp().getNormPrestrain(B_Func); + FuncScalar normB_Func = PrestrainImp<dim>().getNormPrestrain(B_Func); ScalarCT prestrain_Coeff; Functions::interpolate(scalarFeBasis, prestrain_Coeff, normB_Func); auto normB_DGBF = Functions::makeDiscreteGlobalBasisFunction< ScalarRT > @@ -233,14 +233,14 @@ public: auto material_DGBF = Functions::makeDiscreteGlobalBasisFunction< ScalarRT > (scalarFeBasis, material_Coeff); vtkWriter.addVertexData(material_DGBF, VTK::FieldInfo("mu", VTK::FieldInfo::Type::scalar, 1)); - + vtkWriter.write(filename); std::cout << "vtkProblem done.\n"; } - void vtkProblemCellBVec(const GV& gridView_CE, - const FuncMatrix& B_Func, const FuncVector& B_vec_Func, const FuncScalar& mu_Func, + void vtkProblemCellBVec(const GV& gridView_CE, + const FuncMatrix& B_Func, const FuncVector& B_vec_Func, const FuncScalar& mu_Func, std::string filename) { @@ -251,7 +251,7 @@ public: // Vector data const auto basis_CE = makeBasis(gridView_CE, power<dimworld>(lagrange<1>(), flatLexicographic())); //flatInterleaved() - + FuncVector Be1_Func = [B_Func](const auto& x) { return B_Func(x)[0]; @@ -289,12 +289,12 @@ public: Functions::interpolate(basis_CE, B_vec_Coeff, B_vec_Func); auto B_vec_DGBF = Functions::makeDiscreteGlobalBasisFunction< VectorRT > (basis_CE, B_vec_Coeff); vtkWriter.addVertexData(B_vec_DGBF, VTK::FieldInfo("B_vec", VTK::FieldInfo::Type::vector, dimworld)); - - + + // Scalar data Functions::LagrangeBasis<GV, 1> scalarFeBasis(gridView_CE); - FuncScalar normB_Func = PrestrainImp().getNormPrestrain(B_Func); + FuncScalar normB_Func = PrestrainImp<dim>().getNormPrestrain(B_Func); ScalarCT prestrain_Coeff; Functions::interpolate(scalarFeBasis, prestrain_Coeff, normB_Func); auto normB_DGBF = Functions::makeDiscreteGlobalBasisFunction< ScalarRT > @@ -306,15 +306,15 @@ public: auto material_DGBF = Functions::makeDiscreteGlobalBasisFunction< ScalarRT > (scalarFeBasis, material_Coeff); vtkWriter.addVertexData(material_DGBF, VTK::FieldInfo("mu", VTK::FieldInfo::Type::scalar, 1)); - + vtkWriter.write(filename); std::cout << "vtkProblem done.\n"; } - void vtkProblem3DRod(const GV& gridView_R3D, double eps, - const FuncVector& domain_Func, const FuncMatrix& B_Func, const FuncScalar& mu_Func, + void vtkProblem3DRod(const GV& gridView_R3D, double eps, + const FuncVector& domain_Func, const FuncMatrix& B_Func, const FuncScalar& mu_Func, std::string filename) { @@ -331,7 +331,7 @@ public: (Functions::subspaceBasis(basis_R3D), HierarchicVectorView(domain_Coeff)); vtkWriter.addVertexData(domain_DGBF, VTK::FieldInfo("Domain", VTK::FieldInfo::Type::vector, 3)); - + FuncVector Be1_R3D_Func = [B_Func, eps](const auto& x) { auto x_Ce = {x[0]/eps - int(x[0]/eps),x[1],x[2]}; @@ -368,11 +368,11 @@ public: vtkWriter.addVertexData(Be3_R3D_DGBF, VTK::FieldInfo("B_e3", VTK::FieldInfo::Type::vector, 3)); - + // Scalar data Functions::LagrangeBasis<GV, 1> scalarFeBasis(gridView_R3D); - FuncScalar normB_Func = PrestrainImp().getNormPrestrain(B_Func); + FuncScalar normB_Func = PrestrainImp<dim>().getNormPrestrain(B_Func); FuncScalar normB_R3D_Func = [normB_Func, eps](const auto& x) { auto x_Ce = {x[0]/eps - int(x[0]/eps),x[1],x[2]}; @@ -389,14 +389,14 @@ public: auto material_DGBF = Functions::makeDiscreteGlobalBasisFunction< ScalarRT > (scalarFeBasis, material_Coeff); vtkWriter.addVertexData(material_DGBF, VTK::FieldInfo("mu", VTK::FieldInfo::Type::scalar, 1)); - + vtkWriter.write(filename); std::cout << "vtkProblem done.\n"; } - void vtkProblem3DRodBVec(const GV& gridView_R3D, double eps, - const FuncVector& domain_Func, const FuncMatrix& B_Func, const FuncVector& B_vec_Func, const FuncScalar& mu_Func, + void vtkProblem3DRodBVec(const GV& gridView_R3D, double eps, + const FuncVector& domain_Func, const FuncMatrix& B_Func, const FuncVector& B_vec_Func, const FuncScalar& mu_Func, std::string filename) { @@ -413,7 +413,7 @@ public: (Functions::subspaceBasis(basis_R3D), HierarchicVectorView(domain_Coeff)); vtkWriter.addVertexData(domain_DGBF, VTK::FieldInfo("Domain", VTK::FieldInfo::Type::vector, 3)); - + FuncVector Be1_R3D_Func = [B_Func, eps](const auto& x) { auto x_Ce = {x[0]/eps - int(x[0]/eps),x[1],x[2]}; @@ -460,11 +460,11 @@ public: vtkWriter.addVertexData(B_vec_DGBF, VTK::FieldInfo("B_vec", VTK::FieldInfo::Type::vector, dimworld)); - + // Scalar data Functions::LagrangeBasis<GV, 1> scalarFeBasis(gridView_R3D); - FuncScalar normB_Func = PrestrainImp().getNormPrestrain(B_Func); + FuncScalar normB_Func = PrestrainImp<dim>().getNormPrestrain(B_Func); FuncScalar normB_R3D_Func = [normB_Func, eps](const auto& x) { auto x_Ce = {x[0]/eps - int(x[0]/eps),x[1],x[2]}; @@ -486,7 +486,7 @@ public: auto material_DGBF = Functions::makeDiscreteGlobalBasisFunction< ScalarRT > (scalarFeBasis, material_Coeff); vtkWriter.addVertexData(material_DGBF, VTK::FieldInfo("mu", VTK::FieldInfo::Type::scalar, 1)); - + vtkWriter.write(filename); std::cout << "vtkProblem done.\n"; @@ -496,9 +496,9 @@ public: /* template<int dim> - void vtkProblemCell(const typename UGGrid<dim>::LeafGridView& gridView_CE, - const std::function< MatrixRT(const typename UGGrid<dim>::LeafGridView::template Codim<0>::Geometry::GlobalCoordinate&)& B_Func, - const std::function< ScalarRT(const typename UGGrid<dim>::LeafGridView::template Codim<0>::Geometry::GlobalCoordinate&)& mu_Func, + void vtkProblemCell(const typename UGGrid<dim>::LeafGridView& gridView_CE, + const std::function< MatrixRT(const typename UGGrid<dim>::LeafGridView::template Codim<0>::Geometry::GlobalCoordinate&)& B_Func, + const std::function< ScalarRT(const typename UGGrid<dim>::LeafGridView::template Codim<0>::Geometry::GlobalCoordinate&)& mu_Func, std::string filename) { using GT = UGGrid<dim>; @@ -514,7 +514,7 @@ public: // Vector data const auto basis_CE = makeBasis(gridView_CE, power<dimworld>(lagrange<1>(), flatLexicographic())); //flatInterleaved() - + FuncVector Be1_Func = [B_Func](const auto& x) { return B_Func(x)[0]; @@ -547,11 +547,11 @@ public: (Functions::subspaceBasis(basis_CE), HierarchicVectorView(Be3_Coeff)); vtkWriter.addVertexData(Be3_DGBF, VTK::FieldInfo("B_e3", VTK::FieldInfo::Type::vector, 3)); - + // Scalar data Functions::LagrangeBasis<GV, 1> scalarFeBasis(gridView_CE); - FuncScalar normB_Func = getNormPrestrain(B_Func); + FuncScalar normB_Func = getNormPrestrain(B_Func); ScalarCT prestrain_Coeff; Functions::interpolate(scalarFeBasis, prestrain_Coeff, normB_Func); auto normB_DGBF = Functions::makeDiscreteGlobalBasisFunction< ScalarRT > @@ -563,14 +563,14 @@ public: auto material_DGBF = Functions::makeDiscreteGlobalBasisFunction< ScalarRT > (scalarFeBasis, material_Coeff); vtkWriter.addVertexData(material_DGBF, VTK::FieldInfo("mu", VTK::FieldInfo::Type::scalar, 1)); - + vtkWriter.write(filename); std::cout << "vtkProblem done.\n"; } - void vtkProblemCellBVec(const GV& gridView_CE, - const FuncMatrix& B_Func, const FuncVector& B_vec_Func, const FuncScalar& mu_Func, + void vtkProblemCellBVec(const GV& gridView_CE, + const FuncMatrix& B_Func, const FuncVector& B_vec_Func, const FuncScalar& mu_Func, std::string filename) { @@ -581,7 +581,7 @@ public: // Vector data const auto basis_CE = makeBasis(gridView_CE, power<dimworld>(lagrange<1>(), flatLexicographic())); //flatInterleaved() - + FuncVector Be1_Func = [B_Func](const auto& x) { return B_Func(x)[0]; @@ -619,12 +619,12 @@ public: Functions::interpolate(basis_CE, B_vec_Coeff, B_vec_Func); auto B_vec_DGBF = Functions::makeDiscreteGlobalBasisFunction< VectorRT > (basis_CE, B_vec_Coeff); vtkWriter.addVertexData(B_vec_DGBF, VTK::FieldInfo("B_vec", VTK::FieldInfo::Type::vector, dimworld)); - - + + // Scalar data Functions::LagrangeBasis<GV, 1> scalarFeBasis(gridView_CE); - FuncScalar normB_Func = getNormPrestrain(B_Func); + FuncScalar normB_Func = getNormPrestrain(B_Func); ScalarCT prestrain_Coeff; Functions::interpolate(scalarFeBasis, prestrain_Coeff, normB_Func); auto normB_DGBF = Functions::makeDiscreteGlobalBasisFunction< ScalarRT > @@ -636,15 +636,15 @@ public: auto material_DGBF = Functions::makeDiscreteGlobalBasisFunction< ScalarRT > (scalarFeBasis, material_Coeff); vtkWriter.addVertexData(material_DGBF, VTK::FieldInfo("mu", VTK::FieldInfo::Type::scalar, 1)); - + vtkWriter.write(filename); std::cout << "vtkProblem done.\n"; } - void vtkProblem3DRod(const GV& gridView_R3D, double eps, - const FuncVector& domain_Func, const FuncMatrix& B_Func, const FuncScalar& mu_Func, + void vtkProblem3DRod(const GV& gridView_R3D, double eps, + const FuncVector& domain_Func, const FuncMatrix& B_Func, const FuncScalar& mu_Func, std::string filename) { @@ -661,7 +661,7 @@ public: (Functions::subspaceBasis(basis_R3D), HierarchicVectorView(domain_Coeff)); vtkWriter.addVertexData(domain_DGBF, VTK::FieldInfo("Domain", VTK::FieldInfo::Type::vector, 3)); - + FuncVector Be1_R3D_Func = [B_Func, eps](const auto& x) { auto x_Ce = {x[0]/eps - int(x[0]/eps),x[1],x[2]}; @@ -698,11 +698,11 @@ public: vtkWriter.addVertexData(Be3_R3D_DGBF, VTK::FieldInfo("B_e3", VTK::FieldInfo::Type::vector, 3)); - + // Scalar data Functions::LagrangeBasis<GV, 1> scalarFeBasis(gridView_R3D); - FuncScalar normB_Func = getNormPrestrain(B_Func); + FuncScalar normB_Func = getNormPrestrain(B_Func); FuncScalar normB_R3D_Func = [normB_Func, eps](const auto& x) { auto x_Ce = {x[0]/eps - int(x[0]/eps),x[1],x[2]}; @@ -719,14 +719,14 @@ public: auto material_DGBF = Functions::makeDiscreteGlobalBasisFunction< ScalarRT > (scalarFeBasis, material_Coeff); vtkWriter.addVertexData(material_DGBF, VTK::FieldInfo("mu", VTK::FieldInfo::Type::scalar, 1)); - + vtkWriter.write(filename); std::cout << "vtkProblem done.\n"; } - void vtkProblem3DRodBVec(const GV& gridView_R3D, double eps, - const FuncVector& domain_Func, const FuncMatrix& B_Func, const FuncVector& B_vec_Func, const FuncScalar& mu_Func, + void vtkProblem3DRodBVec(const GV& gridView_R3D, double eps, + const FuncVector& domain_Func, const FuncMatrix& B_Func, const FuncVector& B_vec_Func, const FuncScalar& mu_Func, std::string filename) { @@ -743,7 +743,7 @@ public: (Functions::subspaceBasis(basis_R3D), HierarchicVectorView(domain_Coeff)); vtkWriter.addVertexData(domain_DGBF, VTK::FieldInfo("Domain", VTK::FieldInfo::Type::vector, 3)); - + FuncVector Be1_R3D_Func = [B_Func, eps](const auto& x) { auto x_Ce = {x[0]/eps - int(x[0]/eps),x[1],x[2]}; @@ -790,11 +790,11 @@ public: vtkWriter.addVertexData(B_vec_DGBF, VTK::FieldInfo("B_vec", VTK::FieldInfo::Type::vector, dimworld)); - + // Scalar data Functions::LagrangeBasis<GV, 1> scalarFeBasis(gridView_R3D); - FuncScalar normB_Func = getNormPrestrain(B_Func); + FuncScalar normB_Func = getNormPrestrain(B_Func); FuncScalar normB_R3D_Func = [normB_Func, eps](const auto& x) { auto x_Ce = {x[0]/eps - int(x[0]/eps),x[1],x[2]}; @@ -816,7 +816,7 @@ public: auto material_DGBF = Functions::makeDiscreteGlobalBasisFunction< ScalarRT > (scalarFeBasis, material_Coeff); vtkWriter.addVertexData(material_DGBF, VTK::FieldInfo("mu", VTK::FieldInfo::Type::scalar, 1)); - + vtkWriter.write(filename); std::cout << "vtkProblem done.\n"; diff --git a/src/Cell-Problem.cc b/src/Cell-Problem.cc index dbc2cfd525c614b7137e331113e986d0742a8796..bf2c1f8b7b83b1f1053cbfd966cbc925b08ee502 100644 --- a/src/Cell-Problem.cc +++ b/src/Cell-Problem.cc @@ -168,12 +168,16 @@ void computeElementStiffnessMatrix(const LocalView& localView, ////////////////////////////////////////////// MatrixRT G_1 {{1.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}}; - MatrixRT G_3 {{0.0, 1.0/sqrt(2), 0.0}, {1.0/sqrt(2), 0.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}; // int orderQR = 2*(dim*localFiniteElement.localBasis().order()-1)+5; // TEST int orderQR = 2*(dim*localFiniteElement.localBasis().order()-1); const auto& quad = QuadratureRules<double,dim>::rule(element.type(), orderQR); + + + +// std::cout << "Print QuadratureOrder:" << orderQR << std::endl; //TEST for (const auto& quadPoint : quad) { @@ -342,7 +346,7 @@ 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}}; MatrixRT G_2 {{0.0, 0.0, 0.0}, {0.0, 1.0, 0.0}, {0, 0.0, 0.0}}; - MatrixRT G_3 {{0.0, 1.0/sqrt(2), 0.0}, {1.0/sqrt(2), 0.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}; // int orderQR = 2*(dim*localFiniteElement.localBasis().order()-1)+5; // TEST @@ -541,7 +545,7 @@ auto energy(const Basis& basis, auto geometry = e.geometry(); 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 + 5 ); // TEST int orderQR = 2*(dim*localFiniteElement.localBasis().order()-1); const QuadratureRule<double, dim>& quad = QuadratureRules<double, dim>::rule(e.type(), orderQR); @@ -663,7 +667,8 @@ auto integralMean(const Basis& basis, localView.bind(element); localfun.bind(element); 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); const QuadratureRule<double, dim>& quad = QuadratureRules<double, dim>::rule(element.type(), orderQR); @@ -747,6 +752,7 @@ double computeL2SymError(const Basis& basis, const auto& localFiniteElement = localView.tree().child(0).finiteElement(); const auto nSf = localFiniteElement.localBasis().size(); +// int orderQR = 2*(dim*localFiniteElement.localBasis().order()-1)+5; //TEST int orderQR = 2*(dim*localFiniteElement.localBasis().order()-1 ); const auto& quad = QuadratureRules<double,dim>::rule(element.type(), orderQR); @@ -818,6 +824,8 @@ double computeL2Norm(const Basis& basis, localfun.bind(element); 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); const QuadratureRule<double, dim>& quad = QuadratureRules<double, dim>::rule(element.type(), orderQR); @@ -870,13 +878,13 @@ int main(int argc, char *argv[]) /////////////////////////////////// // Get Parameters/Data /////////////////////////////////// - double gamma = parameterSet.get<double>("gamma",3.0); // ratio dimension reduction to homogenization + double gamma = parameterSet.get<double>("gamma",1.0); // ratio dimension reduction to homogenization double alpha = parameterSet.get<double>("alpha", 2.0); double theta = parameterSet.get<double>("theta",1.0/4.0); /////////////////////////////////// // Get Material Parameters /////////////////////////////////// - std::string imp = parameterSet.get<std::string>("material_implementation", "analytical_Example"); + std::string imp = parameterSet.get<std::string>("material_prestrain_imp", "analytical_Example"); double beta = parameterSet.get<double>("beta",2.0); double mu1 = parameterSet.get<double>("mu1",10.0);; double mu2 = beta*mu1; @@ -901,7 +909,7 @@ int main(int argc, char *argv[]) - auto prestrainImp = PrestrainImp(); //NEW + auto prestrainImp = PrestrainImp<dim>(); //NEW auto B_Term = prestrainImp.getPrestrain(parameterSet); log << "----- Input Parameters -----: " << std::endl; @@ -974,7 +982,7 @@ int main(int argc, char *argv[]) // Create Lambda-Functions for material Parameters depending on microstructure /////////////////////////////////// - auto materialImp = IsotropicMaterialImp(); + auto materialImp = IsotropicMaterialImp<dim>(); auto muTerm = materialImp.getMu(parameterSet); auto lambdaTerm = materialImp.getLambda(parameterSet); @@ -1037,7 +1045,7 @@ int main(int argc, char *argv[]) // First order periodic Lagrange-Basis auto Basis_CE = makeBasis( gridView_CE, - power<dim>( + power<dim>( // eig dimworld?!?! Functions::BasisFactory::Experimental::periodic(lagrange<1>(), periodicIndices), flatLexicographic())); @@ -1062,7 +1070,7 @@ int main(int argc, char *argv[]) ///////////////////////////////////////////////////////// // Define "rhs"-functions ///////////////////////////////////////////////////////// - Func2Tensor x3G_1 = [] (const Domain& x, double sign=1.0) { + Func2Tensor x3G_1 = [] (const Domain& x) { return MatrixRT{{1.0*x[2], 0.0, 0.0}, {0.0, 0.0, 0.0}, {0.0, 0.0, 0.0}}; //TODO könnte hier sign übergeben? }; @@ -1071,7 +1079,7 @@ int main(int argc, char *argv[]) }; Func2Tensor x3G_3 = [] (const Domain& x) { - return MatrixRT{{0.0, 1.0/sqrt(2)*x[2], 0.0}, {1.0/sqrt(2)*x[2], 0.0, 0.0}, {0.0, 0.0, 0.0}}; + return MatrixRT{{0.0, 1.0/sqrt(2.0)*x[2], 0.0}, {1.0/sqrt(2.0)*x[2], 0.0, 0.0}, {0.0, 0.0, 0.0}}; }; Func2Tensor x3G_1neg = [x3G_1] (const Domain& x) {return -1.0*x3G_1(x);}; @@ -1099,7 +1107,7 @@ int main(int argc, char *argv[]) ////////////////////////////////////////////// MatrixRT G_1 {{1.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}}; - MatrixRT G_3 {{0.0, 1.0/sqrt(2), 0.0}, {1.0/sqrt(2), 0.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}; // printmatrix(std::cout, basisContainer[0] , "G_1", "--"); // printmatrix(std::cout, basisContainer[1] , "G_2", "--"); @@ -1277,7 +1285,7 @@ int main(int argc, char *argv[]) //////////////////////////////////////////////////////////////////////////// // Substract Integral-mean - //////////////////////////////////////////////////////////////////////////// // ERROR + //////////////////////////////////////////////////////////////////////////// using SolutionRange = FieldVector<double,dim>; if(write_IntegralMean) @@ -1430,7 +1438,9 @@ int main(int argc, char *argv[]) std::cout<< "q1 : " << q1 << std::endl; std::cout<< "q2 : " << q2 << std::endl; - std::cout<< "q3 : " << q3 << std::endl; + std::cout.precision(10); + std::cout << "q3 : " << std::fixed << q3 << std::endl; +// std::cout<< "q3 : " << q3 << std::endl; printvector(std::cout, B_hat, "B_hat", "--"); printvector(std::cout, Beff, "Beff", "--"); diff --git a/src/Compute_MuGamma.cc b/src/Compute_MuGamma.cc index 8482b7dbf91846cf29e968a0b42a06c72dcde7c6..ad14fab74274f0ad10e19b4be13010f1f2eaf54e 100644 --- a/src/Compute_MuGamma.cc +++ b/src/Compute_MuGamma.cc @@ -64,19 +64,6 @@ using namespace Dune; - - - - - - - - - - - - - template<class LocalView, class Matrix, class LocalFunction> void assembleElementStiffnessMatrix(const LocalView& localView, Matrix& elementMatrix, @@ -702,10 +689,6 @@ double computeMuGamma(const Basis& basis, */ - - - - // Check whether two points are equal on R/Z x R/Z auto equivalent = [](const FieldVector<double,2>& x, const FieldVector<double,2>& y) { @@ -714,19 +697,6 @@ double computeMuGamma(const Basis& basis, }; -// // Check whether two points are equal on R/Z x R/Z x R -// auto equivalent3D = [](const FieldVector<double,3>& x, const FieldVector<double,3>& y) -// { -// return ( (FloatCmp::eq(x[0],y[0]) or FloatCmp::eq(x[0]+1,y[0]) or FloatCmp::eq(x[0]-1,y[0])) -// and (FloatCmp::eq(x[1],y[1]) or FloatCmp::eq(x[1]+1,y[1]) or FloatCmp::eq(x[1]-1,y[1])) -// and (FloatCmp::eq(x[2],y[2])) -// ); -// }; -// -// - - - int main(int argc, char *argv[]) { @@ -760,21 +730,14 @@ int main(int argc, char *argv[]) // std::array<int, dim> nElements = {16,16}; // std::array<int, dim> nElements = {8,8}; - /* - FieldVector<double,dim> lower({-1.0/2.0, -1.0/2.0, -1.0/2.0}); - FieldVector<double,dim> upper({1.0/2.0, 1.0/2.0, 1.0/2.0}); - std::array<int, dim> nElements = {16,16,16};*/ using CellGridType = YaspGrid<dim, EquidistantOffsetCoordinates<double, dim> >; CellGridType grid_CE(lower,upper,nElements); using GridView = CellGridType::LeafGridView; const GridView gridView = grid_CE.leafGridView(); - - using Domain = GridView::Codim<0>::Geometry::GlobalCoordinate; - - + // ----------- INPUT PARAMETERS ----------------------------- double gamma = parameterSet.get<double>("gamma", 1.0); double theta = parameterSet.get<double>("theta", 1.0/4.0); double mu1 = parameterSet.get<double>("mu1", 10.0); @@ -797,10 +760,12 @@ int main(int argc, char *argv[]) }; -// auto materialImp = IsotropicMaterialImp(); -// auto muTermT = materialImp.getMu(parameterSet); + auto materialImp = IsotropicMaterialImp<dim>(); + auto muTermT = materialImp.getMu(parameterSet); - auto muGridF = Dune::Functions::makeGridViewFunction(muTerm, gridView); +// auto muGridF = Dune::Functions::makeGridViewFunction(muTerm, gridView); +// auto muLocal = localFunction(muGridF); + auto muGridF = Dune::Functions::makeGridViewFunction(muTermT, gridView); auto muLocal = localFunction(muGridF);