diff --git a/src/dune-microstructure.cc b/src/dune-microstructure.cc index c6fef610267878aac698b61010eff5fc604a1be0..dc84fa5ff6338239e094e343cd7c6051e7454359 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 + ///////////////////////////////////////// + }