From 274ab1abf0c6499177115bf6e6cd7cdae438de48 Mon Sep 17 00:00:00 2001
From: Klaus <klaus.boehnlein@tu-dresden.de>
Date: Mon, 29 Aug 2022 10:27:00 +0200
Subject: [PATCH] Add more material definitions

---
 dune/microstructure/CorrectorComputer.hh   | 20 ++++----
 dune/microstructure/prestrainedMaterial.hh | 59 +++++++++++++++++++++-
 inputs/cellsolver.parset                   |  8 ++-
 src/Cell-Problem-New.cc                    | 31 +++++++-----
 4 files changed, 90 insertions(+), 28 deletions(-)

diff --git a/dune/microstructure/CorrectorComputer.hh b/dune/microstructure/CorrectorComputer.hh
index 323ddbc8..f4b52c9c 100644
--- a/dune/microstructure/CorrectorComputer.hh
+++ b/dune/microstructure/CorrectorComputer.hh
@@ -350,14 +350,14 @@ public:
               // double energyDensity= scalarProduct(etmp,defGradientV);
               // double energyDensity= scalarProduct(material_.applyElasticityTensor(defGradientU,element.geometry().global(quadPos)),defGradientV);
 
-              // double energyDensity= scalarProduct(elasticityTensor(defGradientU,indicatorFunction(element.geometry().global(quadPos))),sym(defGradientV));
+              double energyDensity= scalarProduct(elasticityTensor(defGradientU,indicatorFunction(element.geometry().global(quadPos))),sym(defGradientV));
               // double energyDensity= scalarProduct(elasticityTensor(defGradientU,indicatorFunction(quadPos)),sym(defGradientV));
               // double energyDensity= scalarProduct(material_.applyElasticityTensor(defGradientU,element.geometry().global(quadPos)),sym(defGradientV));
               // double energyDensity= scalarProduct(material_.applyElasticityTensor(defGradientU,quadPos),sym(defGradientV));
               // double energyDensity= scalarProduct(material_.applyElasticityTensorLocal(defGradientU,quadPos),defGradientV);
 
             
-              double energyDensity = linearizedStVenantKirchhoffDensity(mu(quadPos), lambda(quadPos), defGradientU, defGradientV);
+              // 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..
 
@@ -371,13 +371,13 @@ public:
           {
             
               // double energyDensityGphi= scalarProduct(material_.applyElasticityTensor(basisContainer[m],element.geometry().global(quadPos)),defGradientV);
-              // double energyDensityGphi= scalarProduct(elasticityTensor(basisContainer[m],indicatorFunction(element.geometry().global(quadPos))),sym(defGradientV));
+              double energyDensityGphi= scalarProduct(elasticityTensor(basisContainer[m],indicatorFunction(element.geometry().global(quadPos))),sym(defGradientV));
               // double energyDensityGphi= scalarProduct(elasticityTensor(basisContainer[m],indicatorFunction(quadPos)),sym(defGradientV));
               // double energyDensityGphi= scalarProduct(material_.applyElasticityTensor(basisContainer[m],element.geometry().global(quadPos)),sym(defGradientV));
               // double energyDensityGphi= scalarProduct(material_.applyElasticityTensor(basisContainer[m],quadPos),sym(defGradientV));
               // double energyDensityGphi= scalarProduct(elasticityTensor(basisContainer[m],element.geometry().global(quadPos)),defGradientV);
               // double energyDensityGphi= scalarProduct(material_.applyElasticityTensorLocal(basisContainer[m],quadPos),defGradientV);
-              double energyDensityGphi = linearizedStVenantKirchhoffDensity(mu(quadPos), lambda(quadPos), basisContainer[m], defGradientV);
+              // 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;
@@ -399,7 +399,7 @@ public:
   //         std::cout << "mu(quadPos): " << mu(quadPos) << std::endl;
   //         std::cout << "lambda(quadPos): " << lambda(quadPos) << std::endl;
 
-          // double energyDensityGG= scalarProduct(elasticityTensor(basisContainer[m],indicatorFunction(element.geometry().global(quadPos))),sym(basisContainer[n]));
+          double energyDensityGG= scalarProduct(elasticityTensor(basisContainer[m],indicatorFunction(element.geometry().global(quadPos))),sym(basisContainer[n]));
           // double energyDensityGG= scalarProduct(elasticityTensor(basisContainer[m],element.geometry().global(quadPos)),basisContainer[n]);
           // double energyDensityGG= scalarProduct(material_.applyElasticityTensor(basisContainer[m],element.geometry().global(quadPos)),basisContainer[n]);
           // double energyDensityGG= scalarProduct(elasticityTensor(basisContainer[m],indicatorFunction(quadPos)),sym(basisContainer[n]));
@@ -407,7 +407,7 @@ public:
           // double energyDensityGG= scalarProduct(material_.applyElasticityTensor(basisContainer[m],quadPos),sym(basisContainer[n]));
           // double energyDensityGG= scalarProduct(material_.applyElasticityTensorLocal(basisContainer[m],quadPos),basisContainer[n]);
 
-          double energyDensityGG = linearizedStVenantKirchhoffDensity(mu(quadPos), lambda(quadPos), basisContainer[m], basisContainer[n]);
+          // double energyDensityGG = linearizedStVenantKirchhoffDensity(mu(quadPos), lambda(quadPos), basisContainer[m], basisContainer[n]);
   //         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)
           
@@ -520,14 +520,14 @@ public:
           
           defGradientV = crossSectionDirectionScaling((1.0/gamma_),defGradientV);
 
-          // double energyDensity= scalarProduct(elasticityTensor((-1.0)*forceTerm(quadPos),indicatorFunction(element.geometry().global(quadPos))),sym(defGradientV));
+          double energyDensity= scalarProduct(elasticityTensor((-1.0)*forceTerm(quadPos),indicatorFunction(element.geometry().global(quadPos))),sym(defGradientV));
           // double energyDensity= scalarProduct(elasticityTensor((-1.0)*forceTerm(quadPos),indicatorFunction(quadPos)),sym(defGradientV));
           // double energyDensity= scalarProduct(material_.applyElasticityTensor((-1.0)*forceTerm(quadPos),element.geometry().global(quadPos)),sym(defGradientV));
           // double energyDensity= scalarProduct(material_.applyElasticityTensor((-1.0)*forceTerm(quadPos),quadPos),sym(defGradientV));
           // double energyDensity= scalarProduct(material_.applyElasticityTensor((-1.0)*forceTerm(quadPos),element.geometry().global(quadPos)),defGradientV);
           // double energyDensity= scalarProduct(material_.applyElasticityTensorLocal((-1.0)*forceTerm(quadPos),quadPos),defGradientV);
 
-          double energyDensity = linearizedStVenantKirchhoffDensity(mu(quadPos), lambda(quadPos),(-1.0)*forceTerm(quadPos), defGradientV ); 
+          // double energyDensity = linearizedStVenantKirchhoffDensity(mu(quadPos), lambda(quadPos),(-1.0)*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 
@@ -539,13 +539,13 @@ public:
       // "f*m"-part
       for (size_t m=0; m<3; m++)
       {
-        // double energyDensityfG= scalarProduct(elasticityTensor((-1.0)*forceTerm(quadPos),indicatorFunction(element.geometry().global(quadPos))),sym(basisContainer[m]));
+        double energyDensityfG= scalarProduct(elasticityTensor((-1.0)*forceTerm(quadPos),indicatorFunction(element.geometry().global(quadPos))),sym(basisContainer[m]));
         // double energyDensityfG= scalarProduct(elasticityTensor((-1.0)*forceTerm(quadPos),indicatorFunction(quadPos)),sym(basisContainer[m]));
         // double energyDensityfG = scalarProduct(material_.applyElasticityTensor((-1.0)*forceTerm(quadPos),element.geometry().global(quadPos)),sym(basisContainer[m]));
         // double energyDensityfG = scalarProduct(material_.applyElasticityTensor((-1.0)*forceTerm(quadPos),quadPos),sym(basisContainer[m]));
         // double energyDensityfG = scalarProduct(material_.applyElasticityTensor((-1.0)*forceTerm(quadPos),element.geometry().global(quadPos)),basisContainer[m]);
         // double energyDensityfG = scalarProduct(material_.applyElasticityTensor((-1.0)*forceTerm(quadPos),quadPos),basisContainer[m]);
-        double energyDensityfG = linearizedStVenantKirchhoffDensity(mu(quadPos), lambda(quadPos), (-1.0)*forceTerm(quadPos),basisContainer[m] );
+        // double energyDensityfG = linearizedStVenantKirchhoffDensity(mu(quadPos), lambda(quadPos), (-1.0)*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 
diff --git a/dune/microstructure/prestrainedMaterial.hh b/dune/microstructure/prestrainedMaterial.hh
index ac423af3..210d46ca 100644
--- a/dune/microstructure/prestrainedMaterial.hh
+++ b/dune/microstructure/prestrainedMaterial.hh
@@ -40,6 +40,7 @@ using std::make_shared;
     else 
         return 0;    //#Phase3
   }
+
  MatrixRT material_1(const MatrixRT& G, const int& phase)
   {
       const FieldVector<double,3> mu = {80.0, 80.0, 60.0};
@@ -53,6 +54,44 @@ using std::make_shared;
   }
 
 
+  template<class Domain>
+  int indicatorFunction_material_homogeneous(const Domain& x)
+  {
+      return 0;  
+  }
+
+
+ MatrixRT material_homogeneous(const MatrixRT& G, const int& phase)
+ {
+      const FieldVector<double,1> mu = {80.0};
+      const FieldVector<double,1> lambda = {80.0};
+      return 2.0 * mu[0] * sym(G) + lambda[0] * trace(sym(G)) * Id();
+ }
+
+
+  template<class Domain>
+  int indicatorFunction_material_2(const Domain& x)
+  {
+    double theta=0.25;
+    if(abs(x[0]) > (theta/2.0))  
+        return 1;    //#Phase1
+    else 
+        return 0;    //#Phase2
+  }
+
+ MatrixRT material_2(const MatrixRT& G, const int& phase)
+  {
+      const FieldVector<double,2> mu = {80.0, 160.0};
+      const FieldVector<double,2> lambda = {80.0, 160.0};
+      if (phase == 1)
+        return 2.0 * mu[0] * sym(G) + lambda[0] * trace(sym(G)) * Id();
+      else 
+        return 2.0 * mu[1] * sym(G) + lambda[1] * trace(sym(G)) * Id();
+  }
+
+
+
+
 
 
 
@@ -236,6 +275,22 @@ public:
           indicatorFunction_ = indicatorFunction_material_1<Domain>;
           elasticityTensor_ = material_1;
         }
+        else if(name == "homogeneous")
+        {
+          // indicatorFunctionGVF_ = Dune::Functions::makeGridViewFunction(indicatorFunction_material_1, gridView_);
+          // indicatorFunction_ = indicatorFunction_material_1;
+          indicatorFunctionGVF_ = Dune::Functions::makeGridViewFunction(indicatorFunction_material_1<Domain>, gridView_);
+          indicatorFunction_ = indicatorFunction_material_homogeneous<Domain>;
+          elasticityTensor_ = material_homogeneous;
+        }
+        else if(name == "material_2")
+        {
+          // indicatorFunctionGVF_ = Dune::Functions::makeGridViewFunction(indicatorFunction_material_1, gridView_);
+          // indicatorFunction_ = indicatorFunction_material_1;
+          indicatorFunctionGVF_ = Dune::Functions::makeGridViewFunction(indicatorFunction_material_2<Domain>, gridView_);
+          indicatorFunction_ = indicatorFunction_material_2<Domain>;
+          elasticityTensor_ = material_2;
+        }
         else
          DUNE_THROW(Exception, "There exists no material in materialDefinitions.hh with this name "); 
     }
@@ -252,8 +307,8 @@ public:
     // auto tmp = Dune::Functions::makeGridViewFunction(indicatorFunction_material_1, gridView_);
     // auto tmpLocal = LocalF
     // return elasticityTensor_(G,IFunction(x));
-    // return elasticityTensor_(G,indicatorFunction_(x));
-    return elasticityTensor_(G,indicatorFunctionGVF_(x));
+    return elasticityTensor_(G,indicatorFunction_(x));
+    // return elasticityTensor_(G,indicatorFunctionGVF_(x));
     // int phase = indicatorFunction_(x);
     // auto tmp = elasticityTensor_(G,phase);
     // auto tmp = material_1(G,indicatorFunction_(x));
diff --git a/inputs/cellsolver.parset b/inputs/cellsolver.parset
index 4fac1d02..3dcbfe05 100644
--- a/inputs/cellsolver.parset
+++ b/inputs/cellsolver.parset
@@ -56,6 +56,10 @@ rho1=1.0
 alpha=8.0
 
 
+#materialFunction = "homogeneous"
+#materialFunction = "material"
+materialFunction = "material_2"
+
 #--- Lame-Parameters
 mu1=80.0
 lambda1=80.0
@@ -86,10 +90,10 @@ theta=0.25
 #--- choose composite-Implementation:
 #geometryFunctionPath = /home/stefan/DUNE/dune-microstructure/geometries
 geometryFunctionPath = /home/klaus/Desktop/Dune-Testing/dune-microstructure/geometries
-material_prestrain_imp= "material_neukamm"   #(Python-indicator-function with same name determines material phases)
+#material_prestrain_imp= "material_neukamm"   #(Python-indicator-function with same name determines material phases)
 #material_prestrain_imp= "two_phase_material_2"  #(Python-indicator-function with same name determines material phases)
 #material_prestrain_imp= "two_phase_material_3"  #(Python-indicator-function with same name determines material phases)
-#material_prestrain_imp= "parametrized_Laminate"
+material_prestrain_imp= "parametrized_Laminate"
 #material_prestrain_imp= "homogeneous"
 #material_prestrain_imp= "analytical_Example"
 #material_prestrain_imp="isotropic_bilayer"
diff --git a/src/Cell-Problem-New.cc b/src/Cell-Problem-New.cc
index 4b024380..537c9c44 100644
--- a/src/Cell-Problem-New.cc
+++ b/src/Cell-Problem-New.cc
@@ -306,29 +306,32 @@ int main(int argc, char *argv[])
     // int Phases = parameterSet.get<int>("Phases", 3);
 
 
-    std::string materialFunctionName = parameterSet.get<std::string>("materialFunction", "material");
-    Python::Module module = Python::import(materialFunctionName);
+    // std::string materialFunctionName = parameterSet.get<std::string>("materialFunction", "material");
+    // Python::Module module = Python::import(materialFunctionName);
+
+
+
     // auto indicatorFunction = Python::make_function<double>(module.get("f"));
     // Func2Tensor indicatorFunction = Python::make_function<double>(module.get("f"));
     // auto materialFunction_ = Python::make_function<double>(module.get("f"));
     // auto materialFunction_ = Python::make_function<double>(module.get("f"));
     // auto materialFunction_ = Python::make_function<FieldVector<double,2>>(module.get("f"));
 
-    int Phases;
-    module.get("Phases").toC<int>(Phases);
-    std::cout << "Number of Phases used:" << Phases << std::endl;
+    // int Phases;
+    // module.get("Phases").toC<int>(Phases);
+    // std::cout << "Number of Phases used:" << Phases << std::endl;
 
 
     // std::cout << typeid(mu_).name() << '\n';
 
 
     //---- Get mu/lambda values (for isotropic material) from Material-file
-    FieldVector<double,3> mu_(0);
-    module.get("mu_").toC<FieldVector<double,3>>(mu_);
-    printvector(std::cout, mu_ , "mu_", "--");
-    FieldVector<double,3> lambda_(0);
-    module.get("lambda_").toC<FieldVector<double,3>>(lambda_);
-    printvector(std::cout, lambda_ , "lambda_", "--");
+    // FieldVector<double,3> mu_(0);
+    // module.get("mu_").toC<FieldVector<double,3>>(mu_);
+    // printvector(std::cout, mu_ , "mu_", "--");
+    // FieldVector<double,3> lambda_(0);
+    // module.get("lambda_").toC<FieldVector<double,3>>(lambda_);
+    // printvector(std::cout, lambda_ , "lambda_", "--");
 
 
     //////////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -341,13 +344,13 @@ int main(int argc, char *argv[])
     // Func2TensorParam elasticityTensor_ = *material_.getElasticityTensor();
     auto elasticityTensor_ = material_.getElasticityTensor();
 
-    Func2TensorParam TestTensor = Python::make_function<MatrixRT>(module.get("H"));
+    // Func2TensorParam TestTensor = Python::make_function<MatrixRT>(module.get("H"));
 
     // std::cout << "decltype(elasticityTensor_) " << decltype(elasticityTensor_) << std::endl;
 
 
-    std::cout << "typeid(elasticityTensor).name() :" <<  typeid(elasticityTensor_).name() << '\n';
-    std::cout << "typeid(TestTensor).name() :" << typeid(TestTensor).name() << '\n';
+    // std::cout << "typeid(elasticityTensor).name() :" <<  typeid(elasticityTensor_).name() << '\n';
+    // std::cout << "typeid(TestTensor).name() :" << typeid(TestTensor).name() << '\n';
 
     using MatrixFunc = std::function< MatrixRT(const MatrixRT&) >;
     // std::cout << "Import NOW:" << std::endl;
-- 
GitLab