diff --git a/src/main.cpp b/src/main.cpp index d41cf81..475892f 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -47,11 +47,13 @@ int main(int argc, char *argv[]) { ReducedModelOptimizer::xRange beamDimensionsRatio{"bOverh", 0.7, 1.3}; ReducedModelOptimizer::xRange beamE{"E", 0.1, 1.9}; // Test set of full patterns - std::string fullPatternsTestSetDirectory = "TestSet"; - if (!std::filesystem::exists(std::filesystem::path(fullPatternsTestSetDirectory))) { - std::cerr << "Full pattern directory does not exist:" << fullPatternsTestSetDirectory << std::endl; - return 1; - } + std::string fullPatternsTestSetDirectory = "../TestSet"; + if (!std::filesystem::exists( + std::filesystem::path(fullPatternsTestSetDirectory))) { + std::cerr << "Full pattern directory does not exist: " + << fullPatternsTestSetDirectory << std::endl; + return 1; + } // "/home/iason/Documents/PhD/Research/Approximating shapes with flat " // "patterns/Pattern_enumerator/Results/1v_0v_2e_1e_1c_6fan/3/Valid"; std::vector> patternPairs; @@ -100,7 +102,7 @@ int main(int argc, char *argv[]) { resultsPerPattern(patternPairs.size()); auto start = std::chrono::high_resolution_clock::now(); - #pragma omp parallel for +#pragma omp parallel for for (int patternPairIndex = 0; patternPairIndex < patternPairs.size(); patternPairIndex++) { // const auto filepathString = filepath.string(); @@ -125,14 +127,15 @@ int main(int argc, char *argv[]) { ReducedModelOptimizer optimizer(numberOfNodesPerSlot); optimizer.initializePatterns(*patternPairs[patternPairIndex].first, *patternPairs[patternPairIndex].second, - optimizationExcludedEi); + optimizationExcludedEi); // optimizer.optimize({ReducedModelOptimizer::Axial}); ReducedModelOptimizer::Results optimizationResults = optimizer.optimize(settings); totalError += optimizationResults.objectiveValue; resultsPerPattern[patternPairIndex] = - std::make_pair(patternPairs[patternPairIndex].first->getLabel(), optimizationResults); + std::make_pair(patternPairs[patternPairIndex].first->getLabel(), + optimizationResults); totalNumberOfSimulationCrashes += optimizationResults.numberOfSimulationCrashes; // std::cout << "Have optimized " << ++patternsOptimized << "/" @@ -157,8 +160,10 @@ int main(int argc, char *argv[]) { // resultsPerPattern[patternPairIndex].second.save(saveToPath); // } - if (!std::filesystem::exists(std::filesystem::path("OptimizationResults/"))) { - std::filesystem::create_directory(std::filesystem::path("OptimizationResults")); + if (!std::filesystem::exists( + std::filesystem::path("OptimizationResults/"))) { + std::filesystem::create_directory( + std::filesystem::path("OptimizationResults")); } csvfile statistics(std::filesystem::path("OptimizationResults") diff --git a/src/reducedmodeloptimizer.cpp b/src/reducedmodeloptimizer.cpp index ba914f2..a8c751a 100644 --- a/src/reducedmodeloptimizer.cpp +++ b/src/reducedmodeloptimizer.cpp @@ -23,7 +23,7 @@ struct GlobalOptimizationVariables { std::vector g_simulationScenarioIndices; std::vector g_innerHexagonVectors{6, VectorType(0, 0, 0)}; - double g_innerHexagonInitialPos{0}; + double g_innerHexagonInitialPos{0}; bool g_optimizeInnerHexagonSize{false}; std::vector firstOptimizationRoundResults; int g_firstRoundIterationIndex{0}; @@ -32,20 +32,16 @@ struct GlobalOptimizationVariables { std::vector> failedSimulationsXRatio; int numOfSimulationCrashes{false}; int numberOfFunctionCalls{0}; -} ; - -//static GlobalOptimizationVariables global; - -const static int MAX_THREAD = 64; - -struct MY_TLS_ITEM -{ - std::map theMap; - char padding[64 - sizeof(theMap)]; }; -__declspec(align(64)) GlobalOptimizationVariables tls[MAX_THREAD]; +// static GlobalOptimizationVariables global; +const static int MAX_THREAD = 64; +#if defined(_MSC_VER) +__declspec(align(64)) GlobalOptimizationVariables tls[MAX_THREAD]; +#elif defined(__GNUC__) +GlobalOptimizationVariables tls[MAX_THREAD] __attribute__((aligned(64))); +#endif //#pragma omp threadprivate(global) // struct OptimizationCallback { @@ -129,7 +125,7 @@ double ReducedModelOptimizer::computeError( const SimulationResults &reducedPatternResults, const Eigen::MatrixX3d &optimalReducedPatternDisplacements) { double error = 0; - auto& global = tls[omp_get_thread_num()]; + auto &global = tls[omp_get_thread_num()]; for (const auto reducedFullViPair : global.g_reducedToFullViMap) { VertexIndex reducedModelVi = reducedFullViPair.first; // const auto pos = @@ -156,7 +152,7 @@ double ReducedModelOptimizer::computeError( } void updateMesh(long n, const double *x) { - auto& global = tls[omp_get_thread_num()]; + auto &global = tls[omp_get_thread_num()]; std::shared_ptr &pReducedPatternSimulationMesh = global .g_reducedPatternSimulationJob[global.g_simulationScenarioIndices[0]] @@ -230,7 +226,7 @@ double ReducedModelOptimizer::objective(double x0, double x1, double x2, } double ReducedModelOptimizer::objective(long n, const double *x) { - auto& global = tls[omp_get_thread_num()]; + auto &global = tls[omp_get_thread_num()]; // std::cout.precision(17); // for (size_t parameterIndex = 0; parameterIndex < n; parameterIndex++) { @@ -373,7 +369,7 @@ void ReducedModelOptimizer::computeMaps( // std::endl; // Save excluded edges - auto& global = tls[omp_get_thread_num()]; + auto &global = tls[omp_get_thread_num()]; global.g_reducedPatternExludedEdges.clear(); const size_t fanSize = 6; const size_t reducedBaseTriangleNumberOfEdges = reducedPattern.EN(); @@ -509,7 +505,7 @@ void ReducedModelOptimizer::initializePatterns( FlatPattern copyReducedPattern; copyFullPattern.copy(fullPattern); copyReducedPattern.copy(reducedPattern); - auto& global = tls[omp_get_thread_num()]; + auto &global = tls[omp_get_thread_num()]; global.g_optimizeInnerHexagonSize = copyReducedPattern.EN() == 2; if (global.g_optimizeInnerHexagonSize) { const double h = copyReducedPattern.getBaseTriangleHeight(); @@ -540,7 +536,7 @@ void ReducedModelOptimizer::initializePatterns( void ReducedModelOptimizer::initializeOptimizationParameters( const std::shared_ptr &mesh) { - auto& global = tls[omp_get_thread_num()]; + auto &global = tls[omp_get_thread_num()]; const int numberOfOptimizationParameters = 3; global.g_initialParameters.resize(global.g_optimizeInnerHexagonSize ? numberOfOptimizationParameters + 1 @@ -633,7 +629,7 @@ void ReducedModelOptimizer::computeDesiredReducedModelDisplacements( ReducedModelOptimizer::Results ReducedModelOptimizer::runOptimization( const Settings &settings, double (*pObjectiveFunction)(long, const double *)) { - auto& global = tls[omp_get_thread_num()]; + auto &global = tls[omp_get_thread_num()]; global.gObjectiveValueHistory.clear(); @@ -1002,7 +998,7 @@ void ReducedModelOptimizer::visualizeResults( simulator.executeSimulation(pFullPatternSimulationJob); fullModelResults.registerForDrawing(); fullModelResults.saveDeformedModel(); - auto& global = tls[omp_get_thread_num()]; + auto &global = tls[omp_get_thread_num()]; const std::shared_ptr &pReducedPatternSimulationJob = global.g_reducedPatternSimulationJob[simulationScenarioIndex]; SimulationResults reducedModelResults = @@ -1033,7 +1029,7 @@ void ReducedModelOptimizer::visualizeResults( ReducedModelOptimizer::Results ReducedModelOptimizer::optimize( const Settings &xRanges, const std::vector &simulationScenarios) { - auto& global = tls[omp_get_thread_num()]; + auto &global = tls[omp_get_thread_num()]; global.g_simulationScenarioIndices = simulationScenarios; if (global.g_simulationScenarioIndices.empty()) { @@ -1046,7 +1042,7 @@ ReducedModelOptimizer::Results ReducedModelOptimizer::optimize( std::vector> simulationJobs = createScenarios(m_pFullPatternSimulationMesh); global.g_optimalReducedModelDisplacements.resize(6); - global.g_reducedPatternSimulationJob.resize(6); + global.g_reducedPatternSimulationJob.resize(6); global.g_firstRoundIterationIndex = 0; global.minY = std::numeric_limits::max(); global.numOfSimulationCrashes = 0; @@ -1069,8 +1065,8 @@ ReducedModelOptimizer::Results ReducedModelOptimizer::optimize( computeReducedModelSimulationJob(*pFullPatternSimulationJob, m_fullToReducedInterfaceViMap, reducedPatternSimulationJob); - global.g_reducedPatternSimulationJob[simulationScenarioIndex] = - std::make_shared(reducedPatternSimulationJob); + global.g_reducedPatternSimulationJob[simulationScenarioIndex] = + std::make_shared(reducedPatternSimulationJob); } Results optResults = runOptimization(xRanges, &objective); updateMesh(optResults.x.size(), optResults.x.data());