diff --git a/reducedmodeloptimizer.cpp b/reducedmodeloptimizer.cpp index 08267f5..1ad60c3 100644 --- a/reducedmodeloptimizer.cpp +++ b/reducedmodeloptimizer.cpp @@ -61,7 +61,8 @@ struct GlobalOptimizationVariables std::vector xMax; std::vector scenarioWeights; std::vector objectiveWeights; -} global; +}; +GlobalOptimizationVariables global; double ReducedModelOptimizer::computeDisplacementError( const std::vector &fullPatternDisplacements, @@ -308,7 +309,7 @@ double ReducedModelOptimizer::objective(const std::vector &x) }); // double totalError = std::accumulate(simulationErrorsPerScenario.begin(), // simulationErrorsPerScenario.end(), - // 0); + // 0.0); const double totalError = std::reduce(std::execution::par_unseq, simulationErrorsPerScenario.begin(), simulationErrorsPerScenario.end()); @@ -524,8 +525,9 @@ void ReducedModelOptimizer::computeMaps(PatternGeometry &fullPattern, m_fullPatternOppositeInterfaceViPairs); } -ReducedModelOptimizer::ReducedModelOptimizer(const std::vector &numberOfNodesPerSlot) +ReducedModelOptimizer::ReducedModelOptimizer() { + const std::vector numberOfNodesPerSlot{1, 0, 0, 2, 1, 2, 1}; FlatPatternTopology::constructNodeToSlotMap(numberOfNodesPerSlot, nodeToSlot); FlatPatternTopology::constructSlotToNodeMap(nodeToSlot, slotToNode); interfaceNodeIndex = numberOfNodesPerSlot[0] + numberOfNodesPerSlot[3]; diff --git a/reducedmodeloptimizer.hpp b/reducedmodeloptimizer.hpp index 93a4885..c9a2648 100644 --- a/reducedmodeloptimizer.hpp +++ b/reducedmodeloptimizer.hpp @@ -42,7 +42,6 @@ class ReducedModelOptimizer std::vector scenarioIsSymmetrical; int fullPatternNumberOfEdges; constexpr static double youngsModulus{1 * 1e9}; - std::filesystem::path intermediateResultsDirectoryPath; std::string fullPatternLabel; public: @@ -82,7 +81,7 @@ public: int interfaceNodeIndex; double operator()(const Eigen::VectorXd &x, Eigen::VectorXd &) const; - ReducedModelOptimizer(const std::vector &numberOfNodesPerSlot); + ReducedModelOptimizer(); static void computeReducedModelSimulationJob( const SimulationJob &simulationJobOfFullModel, const std::unordered_map &fullToReducedMap, @@ -304,4 +303,7 @@ inline std::function &x, std::shared_ptr &m)> ReducedModelOptimizer::function_updateReducedPattern; +struct GlobalOptimizationVariables; +extern GlobalOptimizationVariables global; + #endif // REDUCEDMODELOPTIMIZER_HPP diff --git a/reducedmodeloptimizer_structs.hpp b/reducedmodeloptimizer_structs.hpp index fa620de..53cb520 100644 --- a/reducedmodeloptimizer_structs.hpp +++ b/reducedmodeloptimizer_structs.hpp @@ -126,6 +126,8 @@ struct Settings double solverAccuracy{1e-3}; double translationEpsilon{3e-3}; double angularDistanceEpsilon{vcg::math::ToRad(0.0)}; + double targetBaseTriangleSize{0.03}; + std::filesystem::path intermediateResultsDirectoryPath; struct ObjectiveWeights { double translational{1.2}; @@ -206,6 +208,7 @@ struct Settings json[GET_VARIABLE_NAME(translationEpsilon)] = translationEpsilon; json[GET_VARIABLE_NAME(angularDistanceEpsilon)] = vcg::math::ToDeg( angularDistanceEpsilon); + json[GET_VARIABLE_NAME(targetBaseTriangleSize)] = targetBaseTriangleSize; std::filesystem::path jsonFilePath( std::filesystem::path(saveToPath).append(defaultFilename)); @@ -214,20 +217,17 @@ struct Settings jsonFile.close(); } - bool load(const std::filesystem::path &jsonFilepath) + bool load(const std::filesystem::path &jsonFilePath) { - assert(std::filesystem::is_directory(loadFromPath)); - //Load optimal X - nlohmann::json json; - std::filesystem::path jsonFilepath( - std::filesystem::path(loadFromPath).append(JsonKeys::filename)); - if (!std::filesystem::exists(jsonFilepath)) { + if (!std::filesystem::exists(jsonFilePath)) { std::cerr << "Optimization settings could not be loaded because input filepath does " "not exist:" - << jsonFilepath << std::endl; + << jsonFilePath << std::endl; + assert(false); return false; } - std::ifstream ifs(jsonFilepath); + std::ifstream ifs(jsonFilePath); + nlohmann::json json; ifs >> json; if (json.contains(GET_VARIABLE_NAME(optimizationStrategy))) { @@ -288,6 +288,11 @@ struct Settings static_cast(json[GET_VARIABLE_NAME(angularDistanceEpsilon)])); } + if (json.contains(GET_VARIABLE_NAME(targetBaseTriangleSize))) { + targetBaseTriangleSize = static_cast( + json[GET_VARIABLE_NAME(targetBaseTriangleSize)]); + } + // perBaseScenarioObjectiveWeights = json.at(JsonKeys::ObjectiveWeights); // objectiveWeights.translational = json.at(JsonKeys::ObjectiveWeights); // objectiveWeights.rotational = 2 - objectiveWeights.translational; @@ -603,6 +608,7 @@ struct Settings std::filesystem::path jsonFilepath( std::filesystem::path(loadFromPath).append(JsonKeys::filename)); if (!std::filesystem::exists(jsonFilepath)) { + std::cerr << "Input path does not exist:" << loadFromPath << std::endl; return false; } //Load optimal X @@ -670,7 +676,7 @@ struct Settings continue; } // Load full pattern files - for (const auto &fileEntry : filesystem::directory_iterator( + for (const auto &fileEntry : std::filesystem::directory_iterator( std::filesystem::path(simulationScenarioPath).append("Full"))) { const auto filepath = fileEntry.path(); if (filepath.extension() == ".json") { @@ -781,8 +787,8 @@ struct Settings const double beamWidth = std::sqrt(A); const double beamHeight = beamWidth; CrossSectionType elementDimensions(beamWidth, beamHeight); - for (int ei = 0; ei < pTiledReducedPattern_simulationMesh->EN(); ei++) { - Element &e = pTiledReducedPattern_simulationMesh->elements[ei]; + for (int ei = 0; ei < pReducedPattern_simulationMesh->EN(); ei++) { + Element &e = pReducedPattern_simulationMesh->elements[ei]; e.setDimensions(elementDimensions); } } @@ -792,8 +798,8 @@ struct Settings if (optimalXVariables.contains(ymLabel)) { const double E = optimalXVariables.at(ymLabel); const ElementMaterial elementMaterial(poissonsRatio, E); - for (int ei = 0; ei < pTiledReducedPattern_simulationMesh->EN(); ei++) { - Element &e = pTiledReducedPattern_simulationMesh->elements[ei]; + for (int ei = 0; ei < pReducedPattern_simulationMesh->EN(); ei++) { + Element &e = pReducedPattern_simulationMesh->elements[ei]; e.setMaterial(elementMaterial); } } @@ -801,8 +807,8 @@ struct Settings const std::string JLabel = "J"; if (optimalXVariables.contains(JLabel)) { const double J = optimalXVariables.at(JLabel); - for (int ei = 0; ei < pTiledReducedPattern_simulationMesh->EN(); ei++) { - Element &e = pTiledReducedPattern_simulationMesh->elements[ei]; + for (int ei = 0; ei < pReducedPattern_simulationMesh->EN(); ei++) { + Element &e = pReducedPattern_simulationMesh->elements[ei]; e.dimensions.inertia.J = J; } } @@ -810,8 +816,8 @@ struct Settings const std::string I2Label = "I2"; if (optimalXVariables.contains(I2Label)) { const double I2 = optimalXVariables.at(I2Label); - for (int ei = 0; ei < pTiledReducedPattern_simulationMesh->EN(); ei++) { - Element &e = pTiledReducedPattern_simulationMesh->elements[ei]; + for (int ei = 0; ei < pReducedPattern_simulationMesh->EN(); ei++) { + Element &e = pReducedPattern_simulationMesh->elements[ei]; e.dimensions.inertia.I2 = I2; } } @@ -819,12 +825,12 @@ struct Settings const std::string I3Label = "I3"; if (optimalXVariables.contains(I3Label)) { const double I3 = optimalXVariables.at(I3Label); - for (int ei = 0; ei < pTiledReducedPattern_simulationMesh->EN(); ei++) { - Element &e = pTiledReducedPattern_simulationMesh->elements[ei]; + for (int ei = 0; ei < pReducedPattern_simulationMesh->EN(); ei++) { + Element &e = pReducedPattern_simulationMesh->elements[ei]; e.dimensions.inertia.I3 = I3; } } - pTiledReducedPattern_simulationMesh->reset(); + pReducedPattern_simulationMesh->reset(); } #if POLYSCOPE_DEFINED