From 7d499416292aa0a38a20d5a65af08055812438f8 Mon Sep 17 00:00:00 2001
From: Klaus <klaus.boehnlein@tu-dresden.de>
Date: Wed, 23 Feb 2022 23:10:53 +0100
Subject: [PATCH] Check Cell-Solver

---
 .../prestrain_material_geometry.hh            |   3 +-
 src/Cell-Problem.cc                           | 106 +++++++++++++++---
 2 files changed, 92 insertions(+), 17 deletions(-)

diff --git a/dune/microstructure/prestrain_material_geometry.hh b/dune/microstructure/prestrain_material_geometry.hh
index 4522baef..c023fe6a 100644
--- a/dune/microstructure/prestrain_material_geometry.hh
+++ b/dune/microstructure/prestrain_material_geometry.hh
@@ -457,7 +457,8 @@ public:
     
             auto lambdaTerm = [lambda1,lambda2, theta] (const Domain& z) {
                 
-//                  std::cout << "Analytical-LAMBDA is used" << std::endl;  //TEST
+//             std::cout << "Analytical-LAMBDA is used" << std::endl;  //TEST
+//             std::cout << "Lambda1:" << lambda1  << std::endl;
 //                     if (abs(z[0]) > (theta/2.0))
                     if (abs(z[0]) > (theta/2.0))
                         return lambda1;
diff --git a/src/Cell-Problem.cc b/src/Cell-Problem.cc
index b64396b1..d05eb93b 100644
--- a/src/Cell-Problem.cc
+++ b/src/Cell-Problem.cc
@@ -861,7 +861,7 @@ int main(int argc, char *argv[])
   // Output setter
 //   std::string outputPath = parameterSet.get("outputPath", "../../outputs/output.txt");
 //   std::string outputPath = parameterSet.get("outputPath", "/home/klaus/Desktop/DUNE/dune-microstructure/outputs/output.txt");
-  std::string outputPath = parameterSet.get("outputPath", " /home/klaus/Desktop/DUNE/dune-microstructure/outputs");
+  std::string outputPath = parameterSet.get("outputPath", "/home/klaus/Desktop/DUNE/dune-microstructure/outputs");
 //   std::string MatlabPath = parameterSet.get("MatlabPath", "/home/klaus/Desktop/DUNE/dune-microstructure/Matlab-Programs");
 //     std::string outputPath = "/home/klaus/Desktop/DUNE/dune-microstructure/outputs/output.txt";
   std::fstream log;
@@ -887,7 +887,7 @@ int main(int argc, char *argv[])
   std::string imp = parameterSet.get<std::string>("material_prestrain_imp", "analytical_Example");
   log << "material_prestrain used: "<< imp  << std::endl;
   double beta = parameterSet.get<double>("beta",2.0); 
-  double mu1 = parameterSet.get<double>("mu1",10.0);;
+  double mu1 = parameterSet.get<double>("mu1",1.0);;
   double mu2 = beta*mu1;
   double lambda1 = parameterSet.get<double>("lambda1",0.0);;
   double lambda2 = beta*lambda1;
@@ -1447,6 +1447,7 @@ int main(int argc, char *argv[])
     std::cout << "q3 : " << std::fixed << q3 << std::endl;
 //     std::cout<< "q3 : " << q3 << std::endl;
     std::cout<< std::fixed << std::setprecision(6) << "q_onetwo=" << Q[0][1] << std::endl;
+//     std::cout<< std::fixed << std::setprecision(6) << "q_onetwo=" << Q[1][0] << std::endl; //TEST 
     printvector(std::cout, B_hat, "B_hat", "--");
     printvector(std::cout, Beff, "Beff", "--");
     
@@ -1472,20 +1473,7 @@ int main(int argc, char *argv[])
     //////////////////////////////////////////////////////////////
     // Define Analytic Solutions
     //////////////////////////////////////////////////////////////
-    // double b1 = (mu1*p1/4)*(beta/(theta+(1-theta)*beta))*(1-theta*(1+alpha));
-    // double b2 = (mu1*p1/8)*(1-theta*(1+beta*alpha));
-    double b1_hat_ana = (-(theta/4.0)*mu1*mu2)/(theta*mu1+(1.0-theta)*mu2);
-    double b2_hat_ana = -(theta/4.0)*mu2;
-    double b3_hat_ana = 0.0;
-   
-    double b1_eff_ana = (-3.0/2.0)*theta;
-    double b2_eff_ana = (-3.0/2.0)*(theta*mu2)/(mu1*(1-theta)+mu2*theta);
-    double b3_eff_ana = 0.0;
-    
-//     double q1_ana = ((mu1*mu2)/6.0)/(theta*mu1+ (1.0- theta)*mu2);
-//     double q2_ana = ((1.0-theta)*mu1+theta*mu2)/6.0;
-    double q1_ana = mu1*(beta/(theta+(1-theta)*beta)) *(1.0/6.0);  // 1/6 * harmonicMean
-    double q2_ana = mu1*((1-theta)+theta*beta)        *(1.0/6.0);     // 1/6 * arithmeticMean
+
     
     
     
@@ -1495,12 +1483,76 @@ int main(int argc, char *argv[])
      double p1 = parameterSet.get<double>("rho1", 1.0);
      double alpha = parameterSet.get<double>("alpha", 2.0);
      double p2 = alpha*p1;
+     
+    if (imp == "parametrized_Laminate")   // print Errors only for analytical_Example
+    {
+
+        double rho1 = parameterSet.get<double>("rho1", 1.0);
+//         double b1_hat_ana = (-(theta/4.0)*mu1*mu2)/(theta*mu1+(1.0-theta)*mu2);
+//         double b2_hat_ana = -(theta/4.0)*mu2;
+//         double b3_hat_ana = 0.0;
+    
+        double b1_eff_ana = (3.0/2.0)*rho1*(1-theta*(1+alpha));
+        double b2_eff_ana = (3.0/2.0)*rho1*((1-theta*(1+beta*alpha))/(1-theta+theta*beta));
+        double b3_eff_ana = 0.0;
+        
+    //     double q1_ana = ((mu1*mu2)/6.0)/(theta*mu1+ (1.0- theta)*mu2);
+    //     double q2_ana = ((1.0-theta)*mu1+theta*mu2)/6.0;
+        double q1_ana = mu1*(beta/(theta+(1-theta)*beta)) *(1.0/6.0);  // 1/6 * harmonicMean
+        double q2_ana = mu1*((1-theta)+theta*beta)        *(1.0/6.0);     // 1/6 * arithmeticMean
+
+        std::cout << "----- print analytic solutions -----" << std::endl;
+//         std::cout << "b1_hat_ana : " << b1_hat_ana << std::endl;
+//         std::cout << "b2_hat_ana : " << b2_hat_ana << std::endl;
+//         std::cout << "b3_hat_ana : " << b3_hat_ana << std::endl;
+        std::cout << "b1_eff_ana : " << b1_eff_ana << std::endl;
+        std::cout << "b2_eff_ana : " << b2_eff_ana << std::endl;
+        std::cout << "b3_eff_ana : " << b3_eff_ana << std::endl;
+        
+        std::cout << "q1_ana : "     << q1_ana << std::endl;
+        std::cout << "q2_ana : "     << q2_ana << std::endl;
+        std::cout << "q3 should be between q1 and q2"  << std::endl;
+        log << "----- print analytic solutions -----" << std::endl;
+//         log << "b1_hat_ana : " << b1_hat_ana << std::endl;
+//         log << "b2_hat_ana : " << b2_hat_ana << std::endl;
+//         log << "b3_hat_ana : " << b3_hat_ana << std::endl;
+        log << "b1_eff_ana : " << b1_eff_ana << std::endl;
+        log << "b2_eff_ana : " << b2_eff_ana << std::endl;
+        log << "b3_eff_ana : " << b3_eff_ana << std::endl;
+        log << "q1_ana : "     << q1_ana << std::endl;
+        log << "q2_ana : "     << q2_ana << std::endl;
+        log << "q3 should be between q1 and q2"  << std::endl;
+        
+        Storage_Quantities.push_back(std::abs(q1_ana - q1));
+        Storage_Quantities.push_back(std::abs(q2_ana - q2));
+        Storage_Quantities.push_back(q3);
+        Storage_Quantities.push_back(std::abs(b1_eff_ana - Beff[0]));
+        Storage_Quantities.push_back(std::abs(b2_eff_ana - Beff[1]));
+        Storage_Quantities.push_back(std::abs(b3_eff_ana - Beff[2]));
+    }
+     
+     
     
 
     
     if (imp == "analytical_Example")   // print Errors only for analytical_Example
     {
         std::cout << ((3.0*p1)/2.0)*beta*(1-(theta*(1+alpha)))   << std::endl;  // TODO ERROR in paper ?? 
+        
+        // double b1 = (mu1*p1/4)*(beta/(theta+(1-theta)*beta))*(1-theta*(1+alpha));
+        // double b2 = (mu1*p1/8)*(1-theta*(1+beta*alpha));
+        double b1_hat_ana = (-(theta/4.0)*mu1*mu2)/(theta*mu1+(1.0-theta)*mu2);
+        double b2_hat_ana = -(theta/4.0)*mu2;
+        double b3_hat_ana = 0.0;
+    
+        double b1_eff_ana = (-3.0/2.0)*theta;
+        double b2_eff_ana = (-3.0/2.0)*(theta*mu2)/(mu1*(1-theta)+mu2*theta);
+        double b3_eff_ana = 0.0;
+        
+    //     double q1_ana = ((mu1*mu2)/6.0)/(theta*mu1+ (1.0- theta)*mu2);
+    //     double q2_ana = ((1.0-theta)*mu1+theta*mu2)/6.0;
+        double q1_ana = mu1*(beta/(theta+(1-theta)*beta)) *(1.0/6.0);  // 1/6 * harmonicMean
+        double q2_ana = mu1*((1-theta)+theta*beta)        *(1.0/6.0);     // 1/6 * arithmeticMean
 
         std::cout << "----- print analytic solutions -----" << std::endl;
         std::cout << "b1_hat_ana : " << b1_hat_ana << std::endl;
@@ -1700,6 +1752,28 @@ int main(int argc, char *argv[])
     
     // WORKS Too 
     VTKFiller.vtkProblemCell(gridView_VTK, B_Term, muLocal,"VTKProblemCell");;
+    
+    
+    // TEST 
+    auto scalarP0FeBasis = makeBasis(gridView_VTK,lagrange<0>());
+    auto scalarP1FeBasis = makeBasis(gridView_VTK,lagrange<1>());
+
+    std::vector<double> B_CoeffP0;
+    Functions::interpolate(scalarP0FeBasis, B_CoeffP0, B_Term);
+    auto B_DGBF_P0 = Functions::makeDiscreteGlobalBasisFunction<double>(scalarP0FeBasis, B_CoeffP0);
+        
+
+        
+    VTKWriter<GridView> PrestrainVtkWriter(gridView_VTK);
+         
+    PrestrainVtkWriter.addCellData(
+            B_DGBF_P0,
+            VTK::FieldInfo("B_P0", VTK::FieldInfo::Type::scalar, 1));     
+        
+    PrestrainVtkWriter.write(outputPath + "/PrestrainFunctions-level"+ std::to_string(level) );
+    std::cout << "wrote data to file:" + outputPath +"/PrestrainFunctions-level" + std::to_string(level) << std::endl; 
+
+    
    }
   
   
-- 
GitLab