diff --git a/polymesh.hpp b/polymesh.hpp index 60ef843..6a673d1 100755 --- a/polymesh.hpp +++ b/polymesh.hpp @@ -163,7 +163,7 @@ public: mask |= vcg::tri::io::Mask::IOM_VERTNORMAL; mask |= vcg::tri::io::Mask::IOM_FACEINDEX; mask |= vcg::tri::io::Mask::IOM_FACECOLOR; - if (vcg::tri::io::ExporterOBJ::Save(*this, filePath.c_str(), mask) != 0) { + if (vcg::tri::io::ExporterOBJ::Save(*this, filePath.string().c_str(), mask) != 0) { return false; } return true; @@ -184,7 +184,7 @@ public: mask |= vcg::tri::io::Mask::IOM_VERTNORMAL; mask |= vcg::tri::io::Mask::IOM_FACEINDEX; mask |= vcg::tri::io::Mask::IOM_FACECOLOR; - if (vcg::tri::io::ExporterPLY::Save(*this, filePath.c_str(), mask, false) != 0) { + if (vcg::tri::io::ExporterPLY::Save(*this, filePath.string().c_str(), mask, false) != 0) { return false; } return true; diff --git a/reducedmodeloptimizer_structs.hpp b/reducedmodeloptimizer_structs.hpp index 0882f76..fa620de 100644 --- a/reducedmodeloptimizer_structs.hpp +++ b/reducedmodeloptimizer_structs.hpp @@ -161,75 +161,6 @@ struct Settings inline static std::string ObjectiveWeights{"ObjectiveWeight"}; }; - void setDefault() - { - // ReducedPatternOptimization::xRange beamE{"E", 0.001, 1000}; - // ReducedPatternOptimization::xRange beamA{"A", 0.001, 1000}; - // ReducedPatternOptimization::xRange beamI2{"I2", 0.001, 1000}; - // ReducedPatternOptimization::xRange beamI3{"I3", 0.001, 1000}; - // ReducedPatternOptimization::xRange beamJ{"J", 0.001, 1000}; - // ReducedPatternOptimization::xRange innerHexagonSize{"R", 0.05, 0.95}; - // ReducedPatternOptimization::xRange innerHexagonAngle{"Theta", -30.0, 30.0}; - // variablesRanges = {beamE, beamA, beamI2, beamI3, beamJ, innerHexagonSize, innerHexagonAngle}; - // numberOfFunctionCalls = 100000; - - enum OptimizationParameterComparisonScenarioIndex { - AllVar, - GeoYM, - MatGeo, - YMMat_Geo, - YM_MatGeo, - MatGeo_YM, - Geo_YM_Mat, - YM_Geo_Mat, - Geo_Mat, - YMGeo_Mat, - NumberOfScenarios - }; - const std::vector< - std::vector>> - optimizationParameters = [&]() { - std::vector< - std::vector>> - optimizationParameters(NumberOfScenarios); - using namespace ReducedModelOptimization; - optimizationParameters[AllVar] = {{E, A, I2, I3, J, R, Theta}}; - optimizationParameters[GeoYM] = {{R, Theta, E}}; - optimizationParameters[MatGeo] = {{A, I2, I3, J, R, Theta}}; - optimizationParameters[YMMat_Geo] = {{E, A, I2, I3, J}, {R, Theta}}; - optimizationParameters[YM_MatGeo] = {{E}, {A, I2, I3, J, R, Theta}}; - optimizationParameters[MatGeo_YM] = {{A, I2, I3, J, R, Theta}, {E}}; - optimizationParameters[Geo_YM_Mat] = {{R, Theta}, {E}, {A, I2, I3, J}}; - optimizationParameters[YM_Geo_Mat] = {{E}, {R, Theta}, {A, I2, I3, J}}; - optimizationParameters[Geo_Mat] = {{R, Theta}, {A, I2, I3, J}}; - optimizationParameters[YMGeo_Mat] = {{E, R, Theta}, {A, I2, I3, J}}; - return optimizationParameters; - }(); - - constexpr OptimizationParameterComparisonScenarioIndex scenario = AllVar; - optimizationStrategy = optimizationParameters[scenario]; - if (scenario == YMGeo_Mat) { - optimizationVariablesGroupsWeights = {0.15, 0.85}; - } - - // normalizationStrategy = ReducedPatternOptimization::Settings::NormalizationStrategy::Epsilon; - // translationNormalizationEpsilon = 0; - // rotationNormalizationEpsilon = vcg::math::ToRad(0.0); - // solverAccuracy = 1e-2; - - // perBaseScenarioObjectiveWeights[ReducedPatternOptimization::Axial].translational = 1.174011; - // perBaseScenarioObjectiveWeights[ReducedPatternOptimization::Shear].translational = 1.690460; - // perBaseScenarioObjectiveWeights[ReducedPatternOptimization::Bending].translational = 1.812089; - // perBaseScenarioObjectiveWeights[ReducedPatternOptimization::Dome].translational = 0.127392; - // perBaseScenarioObjectiveWeights[ReducedPatternOptimization::Saddle].translational = 0.503043; - - // for (int baseScenario = Axial; baseScenario != NumberOfBaseSimulationScenarios; - // baseScenario++) { - // perBaseScenarioObjectiveWeights[baseScenario].rotational - // = 2 - perBaseScenarioObjectiveWeights[baseScenario].translational; - // } - } - void save(const std::filesystem::path &saveToPath) { assert(std::filesystem::is_directory(saveToPath)); @@ -285,7 +216,11 @@ struct Settings 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)) { std::cerr << "Optimization settings could not be loaded because input filepath does " "not exist:" @@ -734,6 +669,17 @@ struct Settings if (!std::filesystem::is_directory(simulationScenarioPath)) { continue; } + // Load full pattern files + for (const auto &fileEntry : filesystem::directory_iterator( + std::filesystem::path(simulationScenarioPath).append("Full"))) { + const auto filepath = fileEntry.path(); + if (filepath.extension() == ".json") { + SimulationJob job; + job.load(filepath.string()); + job.pMesh->setBeamMaterial(0.3, fullPatternYoungsModulus); + fullPatternSimulationJobs.push_back(std::make_shared(job)); + } + } const auto fullJobFilepath = Utilities::getFilepathWithExtension( std::filesystem::path(simulationScenarioPath).append("Full"), ".json"); @@ -830,37 +776,55 @@ struct Settings reducedPattern_optimizationResults.optimalXNameValuePairs.end()); const std::string ALabel = "A"; - assert(optimalXVariables.contains(ALabel)); - const double A = optimalXVariables.at(ALabel); - const double beamWidth = std::sqrt(A); - const double beamHeight = beamWidth; - CrossSectionType elementDimensions(beamWidth, beamHeight); + if (optimalXVariables.contains(ALabel)) { + const double A = optimalXVariables.at(ALabel); + 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]; + e.setDimensions(elementDimensions); + } + } const double poissonsRatio = 0.3; const std::string ymLabel = "E"; - assert(optimalXVariables.contains(ymLabel)); - const double E = optimalXVariables.at(ymLabel); - const ElementMaterial elementMaterial(poissonsRatio, E); + 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]; + e.setMaterial(elementMaterial); + } + } const std::string JLabel = "J"; - assert(optimalXVariables.contains(JLabel)); - const double J = optimalXVariables.at(JLabel); + 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]; + e.dimensions.inertia.J = J; + } + } const std::string I2Label = "I2"; - assert(optimalXVariables.contains(I2Label)); - const double I2 = optimalXVariables.at(I2Label); + 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]; + e.dimensions.inertia.I2 = I2; + } + } const std::string I3Label = "I3"; - assert(optimalXVariables.contains(I3Label)); - const double I3 = optimalXVariables.at(I3Label); - for (int ei = 0; ei < pReducedPattern_simulationMesh->EN(); ei++) { - Element &e = pReducedPattern_simulationMesh->elements[ei]; - e.setDimensions(elementDimensions); - e.setMaterial(elementMaterial); - e.dimensions.inertia.J = J; - e.dimensions.inertia.I2 = I2; - e.dimensions.inertia.I3 = 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]; + e.dimensions.inertia.I3 = I3; + } } + pTiledReducedPattern_simulationMesh->reset(); } #if POLYSCOPE_DEFINED