From 4a33a5aeba3876e6fb91cb9fcbadffe259ce7a20 Mon Sep 17 00:00:00 2001
From: Klaus Boehnlein <klaus.boehnlein@tu-dresden.de>
Date: Sun, 8 Aug 2021 21:30:29 +0200
Subject: [PATCH] Added Storage

---
 src/dune-microstructure.cc | 133 +++++++++++++++++++++++++++++++++----
 1 file changed, 120 insertions(+), 13 deletions(-)

diff --git a/src/dune-microstructure.cc b/src/dune-microstructure.cc
index c6fef610..dc84fa5f 100644
--- a/src/dune-microstructure.cc
+++ b/src/dune-microstructure.cc
@@ -2207,7 +2207,16 @@ int main(int argc, char *argv[])
 
 
   ///// LEVEL - APPROACH     // TODO
-  int numLevels = parameterSet.get<int>("numLevels", 1);  //besser : numLevels
+//   int numLevels = parameterSet.get<int>("numLevels", 1);
+  std::array<int,2> numLevels = parameterSet.get<std::array<int,2>>("numLevels", {1,2}); // Alternativ : Bereich z.B.  [2,4]
+
+  int levelCounter = 0;
+
+  for(const int &lev : numLevels)
+    std::cout << "value of numLevels: " << lev << std::endl;
+
+
+
 
 //    // any type
 //     std::any a = 1;
@@ -2248,21 +2257,58 @@ int main(int argc, char *argv[])
 
   std::cout << "output variant :" << std::get<std::string>(x) << std::endl;
 
-  std::vector<std::variant<std::string, int , double >> Storage;
-  Storage.push_back(5);
-  Storage.push_back("Second Entry");
-//   Storage[1] = "Second Entry";
+  std::vector<std::variant<std::string, size_t , double>> Storage;
+
+
+  // Storage:: #1 level #2 L2SymError #3 L2SymErrorOrder #4  L2Norm(sym) #5 L2Norm(sym-analytic) #6 L2Norm(phi_1)
+
+  // TODO Storage as Vectors? (q1,q2,q3) ,(b1,b2,b3) ....
+
+//   Storage.push_back(5.0);
+//   Storage.push_back("Second Entry");
+//   std::cout << "Storage[0] :" << std::get<double>(Storage[0]) << std::endl;
+//   std::cout << "Storage[0] :" << std::get<2>(Storage[0]) << std::endl;
+//   std::cout << "output variant :" << std::get<std::string>(Storage[1]) << std::endl;
+//   std::cout << "output variant :" << std::get<0>(Storage[1]) << std::endl;
+
+
+
+
+
+    // NICE TABLE
+    char buf[256];
+    char pattern[]  = "%10s %10s     %7.2f %7.2f %7.2f %7.2f %7.2f %7.2f %7.2f %7.2f %7.2f";
+    sprintf(buf, pattern, "Bob",  "Doe",     10.96,      7.61,     14.39,      2.11,     47.30,     14.21,     44.58,      5.00,     60.23);
+    std::cout << buf << std::endl;
+    sprintf(buf, pattern, "Helen", "City",     10.44,      7.78,     16.27,      1.99,     48.92,     13.93,     53.79,      5.00,     70.97);
+    std::cout << buf << std::endl;
+    sprintf(buf, pattern, "Joe", "Green",     10.90,      7.33,     14.49,      2.05,     47.91,     14.15,     44.45,      4.70,     73.98);
+    std::cout << buf << std::endl;
+
+
+
+
+
+
+
+
+
+
 
-  std::cout << "Storage[0] :" << std::get<int>(Storage[0]) << std::endl;
-  std::cout << "Storage[0] :" << std::get<1>(Storage[0]) << std::endl;
-  std::cout << "output variant :" << std::get<std::string>(Storage[1]) << std::endl;
-  std::cout << "output variant :" << std::get<0>(Storage[1]) << std::endl;
 
 
 
-  for(size_t level = 0; level < numLevels; level++)
+
+//   for(int level = 0; level < numLevels; level++)
+//   for(const size_t &level : numLevels)                             // explixite Angabe der levels.. {2,4}
+  for(size_t level = numLevels[0] ; level <= numLevels[1]; level++)    // levels von bis.. [2,4]
   {
 
+    std::cout << " ----------------------------------" << std::endl;
+    std::cout << "Level: " << level << std::endl;
+    std::cout << " ----------------------------------" << std::endl;
+
+    Storage.push_back(level);
 
     std::array<int, dim> nElements = { (int)std::pow(2,level) , (int)std::pow(2,level) , (int)std::pow(2,level) };
 
@@ -2885,17 +2931,54 @@ int main(int argc, char *argv[])
         log << "L2-Error (symmetric Gradient phi_1):" << L2SymError << std::endl;
 
         //TEST
+        auto L2Norm = computeL2NormCoeff(Basis_CE,phi_1);
+        std::cout << "L2Norm(phi_1) - coeff: "   << L2Norm << std::endl;
+//         std::cout << "L2Norm(phi_1) - coeff: "   << computeL2NormCoeff(Basis_CE,phi_1) << std::endl;
         std::cout << "L2Norm(phi_1) - GVfunc: "  << computeL2NormFunc(Basis_CE,phi_1) << std::endl;
-        std::cout << "L2Norm(phi_1) - coeff: "   << computeL2NormCoeff(Basis_CE,phi_1) << std::endl;
         std::cout << "L2Norm(phi_1) - coeffV2: " << computeL2NormCoeffV2(Basis_CE,phi_1) << std::endl;
         std::cout << "L2Norm(phi_1) - coeffV3: " << computeL2NormCoeffV3(Basis_CE,phi_1) << std::endl;
 
         std::cout << "L2ErrorOld:" << computeL2ErrorOld(Basis_CE,phi_1,gamma,symPhi_1_analytic) << std::endl;
-    }
 
 
+        double EOC = 0.0;
+        Storage.push_back(L2SymError);
+
+        //Compute Experimental order of convergence (EOC)
+        if(levelCounter > 0)
+        {
+            // Storage:: #1 level #2 L2SymError #3 L2SymErrorOrder #4  L2Norm(sym) #5 L2Norm(sym-analytic) #6 L2Norm(phi_1)
+            // TODO Storage as Vectors? (q1,q2,q3) ,(b1,b2,b3) ....
+
+            //   Storage.push_back(5);
+            //   Storage.push_back("Second Entry");
+            std::cout << " ((levelCounter-1)*6)+1: " << ((levelCounter-1)*6)+1 << std::endl;              // Besser std::map ???
+            std::cout << " ((levelCounter-1)*6)+1: " << ((levelCounter)*6)+1 << std::endl;             // muss Storage[idx] muss idx zur compile time feststehen?!
+
+            auto ErrorOld = std::get<double>(Storage[((levelCounter-1)*6)+1]);
+            auto ErrorNew = std::get<double>(Storage[(levelCounter*6)+1]);
+//
+            EOC = std::log(ErrorNew/ErrorOld)/(-1*std::log(2));
+            //   std::cout << "Storage[0] :" << std::get<1>(Storage[0]) << std::endl;
+            //   std::cout << "output variant :" << std::get<std::string>(Storage[1]) << std::endl;
+            //   std::cout << "output variant :" << std::get<0>(Storage[1]) << std::endl;
+
+        }
+
 
 
+//         Storage.push_back(level);
+        Storage.push_back(EOC);
+        Storage.push_back(L2Norm_Symphi);
+        Storage.push_back(L2Norm_SymAnalytic);
+        Storage.push_back(L2Norm);
+//         Storage.push_back();
+//         Storage.push_back();
+//         Storage.push_back();
+//         Storage.push_back();
+
+
+    }
 
 
   //////////////////////////////////////////////////////////////////////////////////////////////
@@ -2913,7 +2996,7 @@ int main(int argc, char *argv[])
 
   vtkWriter.addVertexData(
     correctorFunction_1,
-    VTK::FieldInfo("corrector phi_1", VTK::FieldInfo::Type::vector, dim));
+    VTK::FieldInfo("corrector phi_1", VTK::FieldInfo::Type::vector, dim));      //TODO FOR EACH LEVEL!
   vtkWriter.addVertexData(
     correctorFunction_2,
     VTK::FieldInfo("corrector phi_2", VTK::FieldInfo::Type::vector, dim));
@@ -2925,6 +3008,30 @@ int main(int argc, char *argv[])
 
   log.close();
 
+
+  levelCounter++; //TODO
+
   }
 
+    /////////////////////////////////////////
+    // Print Storage
+    /////////////////////////////////////////
+    std::cout << "PRINT STORAGE: " << std::endl;
+    int StorageCount = 0;
+    for(auto& v: Storage) {
+
+    if(StorageCount % 6 == 0 )
+        std::cout<< "Level: ";
+
+
+    std::visit([](auto&& arg){std::cout << arg;}, v);
+    std::cout << "-----" << std::endl;
+    StorageCount++;
+    }
+
+
+    /////////////////////////////////////////
+    // Output Table
+    /////////////////////////////////////////
+
 }
-- 
GitLab