Uses chronos simulation model. Refactoring

This commit is contained in:
iasonmanolas 2022-07-19 14:59:05 +03:00
parent ef18646cfd
commit 7a0124155c
4 changed files with 90 additions and 74 deletions

View File

@ -331,19 +331,19 @@ ReducedModelEvaluator::Results ReducedModelEvaluator::evaluateReducedModel(
pTiledFullPattern->setLabel("Tiled_full_patterns"); pTiledFullPattern->setLabel("Tiled_full_patterns");
// pTiledFullPattern->registerForDrawing(); // pTiledFullPattern->registerForDrawing();
//Tile reduced pattern into surface //Tile reduced pattern into surface
// PatternGeometry reducedPattern;
ReducedModel reducedModel; ReducedModel reducedModel;
// reducedModel.registerForDrawing();
// polyscope::show();
reducedModel.deleteDanglingVertices(); reducedModel.deleteDanglingVertices();
// reducedPattern.interfaceNodeIndex = 1; std::unordered_map<std::string, double>
// assert(reducedPattern.interfaceNodeIndex == 1); optimalXVariables_set(optimizationResult.optimalXNameValuePairs.begin(),
optimizationResult.optimalXNameValuePairs.end());
reducedModel.updateBaseTriangleGeometry_R(optimalXVariables_set.at("R"));
reducedModel.updateBaseTriangleGeometry_theta(optimalXVariables_set.at("Theta"));
// const auto reducedPatternBaseTriangle = reducedModel.computeBaseTriangle();
// ReducedModelOptimization::Results::applyOptimizationResults_reducedModel_nonFanned(
// optimizationResult, reducedPatternBaseTriangle, reducedModel);
std::vector<PatternGeometry> reducedPatterns(1); std::vector<PatternGeometry> reducedPatterns(1);
reducedPatterns[0].copy(reducedModel); reducedPatterns[0].copy(reducedModel);
const auto reducedPatternBaseTriangle = reducedModel.computeBaseTriangle();
ReducedModelOptimization::Results::applyOptimizationResults_reducedModel_nonFanned(
optimizationResult, reducedPatternBaseTriangle, reducedPatterns[0]);
std::vector<std::vector<size_t>> perPatternIndexTiledReducedPatternEdgeIndices; std::vector<std::vector<size_t>> perPatternIndexTiledReducedPatternEdgeIndices;
std::vector<size_t> tileIntoEdgeToTiledReducedVi; std::vector<size_t> tileIntoEdgeToTiledReducedVi;
std::shared_ptr<PatternGeometry> pTiledReducedPattern std::shared_ptr<PatternGeometry> pTiledReducedPattern
@ -354,8 +354,9 @@ ReducedModelEvaluator::Results ReducedModelEvaluator::evaluateReducedModel(
tileIntoEdgeToTiledReducedVi, tileIntoEdgeToTiledReducedVi,
perPatternIndexTiledReducedPatternEdgeIndices); perPatternIndexTiledReducedPatternEdgeIndices);
pTiledReducedPattern->setLabel("Tiled_reduced_patterns"); pTiledReducedPattern->setLabel("Tiled_reduced_patterns");
// pTiledReducedPattern->registerForDrawing(); #ifdef POLYSCOPE_DEFINED
// polyscope::show(); pTiledReducedPattern->registerForDrawing();
#endif
std::unordered_map<FullPatternVertexIndex, ReducedPatternVertexIndex> std::unordered_map<FullPatternVertexIndex, ReducedPatternVertexIndex>
fullToReducedViMap; //of only the common vertices fullToReducedViMap; //of only the common vertices
@ -379,9 +380,10 @@ ReducedModelEvaluator::Results ReducedModelEvaluator::evaluateReducedModel(
std::shared_ptr<SimulationMesh> pTiledFullPattern_simulationMesh; std::shared_ptr<SimulationMesh> pTiledFullPattern_simulationMesh;
pTiledFullPattern_simulationMesh = std::make_shared<SimulationMesh>(*pTiledFullPattern); pTiledFullPattern_simulationMesh = std::make_shared<SimulationMesh>(*pTiledFullPattern);
//NOTE: Those should be derived from the optimization results instead of hardcoding them //NOTE: Those should be derived from the optimization results instead of hardcoding them
constexpr double beamWidth = 0.001; // const double beamWidth = optimizationResult.settings.patternBeamDimensions.getWidth();
constexpr double beamHeight = 0.001; // const double beamHeight = optimizationResult.settings.patternBeamDimensions.getHeight();
pTiledFullPattern_simulationMesh->setBeamCrossSection(CrossSectionType{beamWidth, beamHeight}); pTiledFullPattern_simulationMesh->setBeamCrossSection(
optimizationResult.settings.patternBeamDimensions);
if (optimizationResult.fullPatternYoungsModulus == 0) { if (optimizationResult.fullPatternYoungsModulus == 0) {
std::cerr << "Full pattern's young modulus not found." << std::endl; std::cerr << "Full pattern's young modulus not found." << std::endl;
std::terminate(); std::terminate();
@ -419,7 +421,7 @@ ReducedModelEvaluator::Results ReducedModelEvaluator::evaluateReducedModel(
#endif #endif
constexpr bool shouldRerunFullPatternSimulation = false; constexpr bool shouldRerunFullPatternSimulation = false;
enum PatternSimulationModelTag { DRM, Chronos }; enum PatternSimulationModelTag { DRM, Chronos };
const PatternSimulationModelTag simulationModelTag{DRM}; const PatternSimulationModelTag simulationModelTag{Chronos};
const std::string simulationModelLabel = [&]() { const std::string simulationModelLabel = [&]() {
switch (simulationModelTag) { switch (simulationModelTag) {
case DRM: case DRM:
@ -431,7 +433,7 @@ ReducedModelEvaluator::Results ReducedModelEvaluator::evaluateReducedModel(
// for (int jobIndex = 0; jobIndex < scenariosTestSetLabels.size(); jobIndex++) { // for (int jobIndex = 0; jobIndex < scenariosTestSetLabels.size(); jobIndex++) {
std::for_each( std::for_each(
//#ifndef POLYSCOPE_DEFINED //#ifndef POLYSCOPE_DEFINED
std::execution::par_unseq, // std::execution::par_unseq,
//#endif //#endif
scenariosTestSetLabels.begin(), scenariosTestSetLabels.begin(),
scenariosTestSetLabels.end(), scenariosTestSetLabels.end(),
@ -460,9 +462,9 @@ ReducedModelEvaluator::Results ReducedModelEvaluator::evaluateReducedModel(
pJob_tiledFullPattern = std::make_shared<SimulationJob>(SimulationJob()); pJob_tiledFullPattern = std::make_shared<SimulationJob>(SimulationJob());
pJob_tiledFullPattern->pMesh = pTiledFullPattern_simulationMesh; pJob_tiledFullPattern->pMesh = pTiledFullPattern_simulationMesh;
pJob_tiledReducedPattern->remap(reducedToFullViMap, *pJob_tiledFullPattern); pJob_tiledReducedPattern->remap(reducedToFullViMap, *pJob_tiledFullPattern);
// pJob_tiledReducedPattern->registerForDrawing(pTiledReducedPattern->getLabel()); // pJob_tiledReducedPattern->registerForDrawing(pTiledReducedPattern->getLabel());
// pJob_tiledFullPattern->registerForDrawing(pTiledFullPattern->getLabel()); // pJob_tiledFullPattern->registerForDrawing(pTiledFullPattern->getLabel());
// polyscope::show(); // polyscope::show();
const std::filesystem::path surfaceFolderPath const std::filesystem::path surfaceFolderPath
= std::filesystem::path(fullPatternTessellatedResultsDirectoryPath) = std::filesystem::path(fullPatternTessellatedResultsDirectoryPath)
.append(simulationModelLabel + "_" + pTileIntoSurface->getLabel()); .append(simulationModelLabel + "_" + pTileIntoSurface->getLabel());
@ -501,12 +503,12 @@ ReducedModelEvaluator::Results ReducedModelEvaluator::evaluateReducedModel(
scenarioDirectoryPath) scenarioDirectoryPath)
.append(patternLabel) .append(patternLabel)
.append("SimulationJob"); .append("SimulationJob");
SimulationResults simulationResults_tiledPattern; SimulationResults simulationResults_tilledPattern;
if (std::filesystem::exists(tilledPatternResultsFolderPath)) { if (std::filesystem::exists(tilledPatternResultsFolderPath)) {
//Load full pattern results //Load full pattern results
assert(std::filesystem::exists(fullPatternJobFolderPath)); assert(std::filesystem::exists(fullPatternJobFolderPath));
simulationResults_tiledPattern.load(tilledPatternResultsFolderPath, simulationResults_tilledPattern.load(tilledPatternResultsFolderPath,
fullPatternJobFolderPath); fullPatternJobFolderPath);
//#ifdef POLYSCOPE_DEFINED //#ifdef POLYSCOPE_DEFINED
// std::array<double, 3> resultsColor({28.0, 99.0, 227.0}); // std::array<double, 3> resultsColor({28.0, 99.0, 227.0});
// simulationResults_tiledFullPattern_drm.registerForDrawing(resultsColor); // simulationResults_tiledFullPattern_drm.registerForDrawing(resultsColor);
@ -532,7 +534,7 @@ ReducedModelEvaluator::Results ReducedModelEvaluator::evaluateReducedModel(
// simulationResults_tiledFullPattern_drm.unregister(); // simulationResults_tiledFullPattern_drm.unregister();
//#endif //#endif
simulationResults_tiledPattern.converged = true; simulationResults_tilledPattern.converged = true;
} else { } else {
std::cout << "Tilled pattern simulation results not found in:" std::cout << "Tilled pattern simulation results not found in:"
<< tilledPatternResultsFolderPath << std::endl; << tilledPatternResultsFolderPath << std::endl;
@ -541,20 +543,20 @@ ReducedModelEvaluator::Results ReducedModelEvaluator::evaluateReducedModel(
switch (simulationModelTag) { switch (simulationModelTag) {
case DRM: { case DRM: {
DRMSimulationModel drmSimulationModel; DRMSimulationModel drmSimulationModel;
simulationResults_tiledPattern = drmSimulationModel simulationResults_tilledPattern = drmSimulationModel
.executeSimulation(pJob_tiledFullPattern, .executeSimulation(pJob_tiledFullPattern,
drmSimulationSettings); drmSimulationSettings);
break; break;
} }
case Chronos: { case Chronos: {
ChronosEulerSimulationModel chronosSimulationModel; ChronosEulerSimulationModel chronosSimulationModel;
simulationResults_tiledPattern = chronosSimulationModel.executeSimulation( simulationResults_tilledPattern = chronosSimulationModel.executeSimulation(
pJob_tiledFullPattern); pJob_tiledFullPattern);
break; break;
} }
} }
} }
if (!simulationResults_tiledPattern.converged) { if (!simulationResults_tilledPattern.converged) {
std::cerr << "Full pattern simulation failed." << std::endl; std::cerr << "Full pattern simulation failed." << std::endl;
std::cerr << "Not saving results" << std::endl; std::cerr << "Not saving results" << std::endl;
// continue; // continue;
@ -563,22 +565,25 @@ ReducedModelEvaluator::Results ReducedModelEvaluator::evaluateReducedModel(
std::filesystem::create_directories(tilledPatternResultsFolderPath); std::filesystem::create_directories(tilledPatternResultsFolderPath);
const std::filesystem::path drmResultsOutputPath const std::filesystem::path drmResultsOutputPath
= std::filesystem::path(scenarioDirectoryPath).append(patternLabel); = std::filesystem::path(scenarioDirectoryPath).append(patternLabel);
simulationResults_tiledPattern.save(drmResultsOutputPath); simulationResults_tilledPattern.save(drmResultsOutputPath);
LinearSimulationModel linearSimulationModel; LinearSimulationModel linearSimulationModel;
SimulationResults simulationResults_tiledReducedPattern SimulationResults simulationResults_tiledReducedModel
= linearSimulationModel.executeSimulation(pJob_tiledReducedPattern); = linearSimulationModel.executeSimulation(pJob_tiledReducedPattern);
// simulationResults_tiledReducedPattern.registerForDrawing(); #ifdef POLYSCOPE_DEFINED
// simulationResults_tiledFullPattern_drm.registerForDrawing(); simulationResults_tiledReducedModel.registerForDrawing();
// polyscope::show(); simulationResults_tilledPattern.registerForDrawing();
polyscope::show();
#endif
//compute the full2reduced distance //compute the full2reduced distance
const double distance_patternToReduced = simulationResults_tiledPattern.computeDistance( const double distance_patternToReduced
simulationResults_tiledReducedPattern, fullToReducedViMap); = simulationResults_tilledPattern
.computeDistance(simulationResults_tiledReducedModel, fullToReducedViMap);
double distance_patternSumOfAllVerts = 0; double distance_patternSumOfAllVerts = 0;
for (std::pair<size_t, size_t> fullToReducedPair : fullToReducedViMap) { for (std::pair<size_t, size_t> fullToReducedPair : fullToReducedViMap) {
distance_patternSumOfAllVerts += simulationResults_tiledPattern distance_patternSumOfAllVerts += simulationResults_tilledPattern
.displacements[fullToReducedPair.first] .displacements[fullToReducedPair.first]
.getTranslation() .getTranslation()
.norm(); .norm();

View File

@ -362,8 +362,9 @@ double ReducedModelOptimizer::objective(const std::vector<double> &x,
} }
void ReducedModelOptimizer::createSimulationMeshes( void ReducedModelOptimizer::createSimulationMeshes(
PatternGeometry &fullModel, PatternGeometry &pattern,
PatternGeometry &reducedModel, PatternGeometry &reducedModel,
const RectangularBeamDimensions &beamDimensions,
std::shared_ptr<SimulationMesh> &pFullPatternSimulationMesh, std::shared_ptr<SimulationMesh> &pFullPatternSimulationMesh,
std::shared_ptr<SimulationMesh> &pReducedPatternSimulationMesh) std::shared_ptr<SimulationMesh> &pReducedPatternSimulationMesh)
{ {
@ -373,23 +374,25 @@ void ReducedModelOptimizer::createSimulationMeshes(
} }
// Full pattern // Full pattern
pFullPatternSimulationMesh = std::make_shared<SimulationMesh>(fullModel); pFullPatternSimulationMesh = std::make_shared<SimulationMesh>(pattern);
pFullPatternSimulationMesh->setBeamCrossSection(CrossSectionType{beamWidth, beamHeight}); pFullPatternSimulationMesh->setBeamCrossSection(beamDimensions);
pFullPatternSimulationMesh->setBeamMaterial(0.3, youngsModulus); pFullPatternSimulationMesh->setBeamMaterial(0.3, youngsModulus);
pFullPatternSimulationMesh->reset(); pFullPatternSimulationMesh->reset();
// Reduced pattern // Reduced pattern
pReducedPatternSimulationMesh = std::make_shared<SimulationMesh>(reducedModel); pReducedPatternSimulationMesh = std::make_shared<SimulationMesh>(reducedModel);
pReducedPatternSimulationMesh->setBeamCrossSection(CrossSectionType{beamWidth, beamHeight}); pReducedPatternSimulationMesh->setBeamCrossSection(beamDimensions);
pReducedPatternSimulationMesh->setBeamMaterial(0.3, youngsModulus); pReducedPatternSimulationMesh->setBeamMaterial(0.3, youngsModulus);
pReducedPatternSimulationMesh->reset(); pReducedPatternSimulationMesh->reset();
} }
void ReducedModelOptimizer::createSimulationMeshes(PatternGeometry &fullModel, void ReducedModelOptimizer::createSimulationMeshes(PatternGeometry &fullModel,
PatternGeometry &reducedModel) PatternGeometry &reducedModel,
const RectangularBeamDimensions &beamDimensions)
{ {
ReducedModelOptimizer::createSimulationMeshes(fullModel, ReducedModelOptimizer::createSimulationMeshes(fullModel,
reducedModel, reducedModel,
beamDimensions,
m_pFullPatternSimulationMesh, m_pFullPatternSimulationMesh,
m_pReducedModelSimulationMesh); m_pReducedModelSimulationMesh);
} }
@ -558,9 +561,11 @@ ReducedModelOptimizer::ReducedModelOptimizer()
void ReducedModelOptimizer::initializePatterns( void ReducedModelOptimizer::initializePatterns(
PatternGeometry &fullPattern, PatternGeometry &fullPattern,
ReducedModel &reducedModel, ReducedModel &reducedModel,
const std::array<xRange, NumberOfOptimizationVariables> &optimizationParameters) const ReducedModelOptimization::Settings &optimizationSettings)
{ {
assert(fullPattern.VN() == reducedModel.VN() && fullPattern.EN() >= reducedModel.EN()); assert(fullPattern.VN() == reducedModel.VN() && fullPattern.EN() >= reducedModel.EN());
const std::array<xRange, NumberOfOptimizationVariables> &optimizationParameters
= optimizationSettings.variablesRanges;
#ifdef POLYSCOPE_DEFINED #ifdef POLYSCOPE_DEFINED
polyscope::removeAllStructures(); polyscope::removeAllStructures();
@ -580,7 +585,9 @@ void ReducedModelOptimizer::initializePatterns(
optimizationState.fullPatternOppositeInterfaceViPairs = m_fullPatternOppositeInterfaceViPairs; optimizationState.fullPatternOppositeInterfaceViPairs = m_fullPatternOppositeInterfaceViPairs;
g_baseScenarioMaxDisplacementHelperData.fullPatternOppositeInterfaceViPairs g_baseScenarioMaxDisplacementHelperData.fullPatternOppositeInterfaceViPairs
= m_fullPatternOppositeInterfaceViPairs; = m_fullPatternOppositeInterfaceViPairs;
createSimulationMeshes(copyFullPattern, copyReducedModel); createSimulationMeshes(copyFullPattern,
copyReducedModel,
optimizationSettings.patternBeamDimensions);
initializeUpdateReducedPatternFunctions(); initializeUpdateReducedPatternFunctions();
initializeOptimizationParameters(m_pFullPatternSimulationMesh, optimizationParameters); initializeOptimizationParameters(m_pFullPatternSimulationMesh, optimizationParameters);
} }
@ -596,7 +603,7 @@ void ReducedModelOptimizer::optimize(ConstPatternGeometry &fullPattern,
auto start = std::chrono::system_clock::now(); auto start = std::chrono::system_clock::now();
optimizationResults.label = fullPattern.getLabel(); optimizationResults.label = fullPattern.getLabel();
optimizationResults.baseTriangleFullPattern.copy(fullPattern); optimizationResults.baseTriangleFullPattern.copy(fullPattern);
initializePatterns(fullPattern, reducedModel, optimizationSettings.variablesRanges); initializePatterns(fullPattern, reducedModel, optimizationSettings);
optimize(optimizationSettings, optimizationResults); optimize(optimizationSettings, optimizationResults);
optimizationResults.settings optimizationResults.settings
= optimizationSettings; //NOTE: currently I set the max force base magn in optimize thus this must be called after the optimize function = optimizationSettings; //NOTE: currently I set the max force base magn in optimize thus this must be called after the optimize function
@ -668,7 +675,7 @@ void ReducedModelOptimizer::initializeUpdateReducedPatternFunctions()
const double beamHeight = beamWidth; const double beamHeight = beamWidth;
for (EdgeIndex ei = 0; ei < pReducedPatternSimulationMesh->EN(); ei++) { for (EdgeIndex ei = 0; ei < pReducedPatternSimulationMesh->EN(); ei++) {
Element &e = pReducedPatternSimulationMesh->elements[ei]; Element &e = pReducedPatternSimulationMesh->elements[ei];
e.setDimensions(RectangularBeamDimensions(beamWidth, beamHeight)); e.setDimensions(CrossSectionType(beamWidth, beamHeight));
} }
}; };

View File

@ -90,8 +90,8 @@ private:
std::vector<bool> scenarioIsSymmetrical; std::vector<bool> scenarioIsSymmetrical;
int fullPatternNumberOfEdges; int fullPatternNumberOfEdges;
constexpr static double youngsModulus{1 * 1e9}; constexpr static double youngsModulus{1 * 1e9};
constexpr static double beamWidth{0.001}; constexpr static double defaultBeamWidth{0.002};
constexpr static double beamHeight{0.001}; constexpr static double defaultBeamHeight{0.002};
std::string fullPatternLabel; std::string fullPatternLabel;
// ReducedModelOptimization::Settings optimizationSettings; // ReducedModelOptimization::Settings optimizationSettings;
@ -147,8 +147,9 @@ public:
const std::unordered_map<size_t, size_t> &fullPatternOppositeInterfaceViMap); const std::unordered_map<size_t, size_t> &fullPatternOppositeInterfaceViMap);
static void createSimulationMeshes( static void createSimulationMeshes(
PatternGeometry &fullModel, PatternGeometry &pattern,
PatternGeometry &reducedModel, PatternGeometry &reducedModel,
const RectangularBeamDimensions &beamDimensions,
std::shared_ptr<SimulationMesh> &pFullPatternSimulationMesh, std::shared_ptr<SimulationMesh> &pFullPatternSimulationMesh,
std::shared_ptr<SimulationMesh> &pReducedPatternSimulationMesh); std::shared_ptr<SimulationMesh> &pReducedPatternSimulationMesh);
void computeMaps(const std::unordered_map<size_t, std::unordered_set<size_t>> &slotToNode, void computeMaps(const std::unordered_map<size_t, std::unordered_set<size_t>> &slotToNode,
@ -288,10 +289,8 @@ private:
ReducedModelOptimization::S})); ReducedModelOptimization::S}));
void initializePatterns(PatternGeometry &fullPattern, void initializePatterns(PatternGeometry &fullPattern,
ReducedModel &reducedPattern, ReducedModel &reducedModel,
const std::array<ReducedModelOptimization::xRange, const ReducedModelOptimization::Settings &optimizationSettings);
ReducedModelOptimization::NumberOfOptimizationVariables>
&optimizationParameters);
static void computeDesiredReducedModelDisplacements( static void computeDesiredReducedModelDisplacements(
const SimulationResults &fullModelResults, const SimulationResults &fullModelResults,
const std::unordered_map<size_t, size_t> &displacementsReducedToFullMap, const std::unordered_map<size_t, size_t> &displacementsReducedToFullMap,
@ -299,7 +298,9 @@ private:
void runOptimization(const ReducedModelOptimization::Settings &settings, void runOptimization(const ReducedModelOptimization::Settings &settings,
ReducedModelOptimization::Results &results); ReducedModelOptimization::Results &results);
void computeMaps(PatternGeometry &fullModel, ReducedModel &reducedModel); void computeMaps(PatternGeometry &fullModel, ReducedModel &reducedModel);
void createSimulationMeshes(PatternGeometry &fullModel, PatternGeometry &reducedModel); void createSimulationMeshes(PatternGeometry &fullModel,
PatternGeometry &reducedModel,
const RectangularBeamDimensions &beamDimensions);
void initializeOptimizationParameters( void initializeOptimizationParameters(
const std::shared_ptr<SimulationMesh> &mesh, const std::shared_ptr<SimulationMesh> &mesh,
const std::array<ReducedModelOptimization::xRange, const std::array<ReducedModelOptimization::xRange,

View File

@ -116,15 +116,11 @@ struct Settings
// 0.0127508, // 0.0127508,
// 1.18079, // 1.18079,
// 0}; //final // 0}; //final
std::array<double, NumberOfBaseSimulationScenarios> baseScenarioMaxMagnitudes{ // std::array<double, NumberOfBaseSimulationScenarios> baseScenarioMaxMagnitudes{
0.590241 / 6, 0.588372 / 6, 0.368304 / 2, 0.05, 1.18 / 4, 0}; //final b,h= 0.001 // 0.590241 / 6, 0.588372 / 6, 0.368304 / 2, 0.05, 1.18 / 4, 0}; //final b,h= 0.001
// std::array<double, NumberOfBaseSimulationScenarios> baseScenarioMaxMagnitudes{0.590241 / 3, std::array<double, NumberOfBaseSimulationScenarios> baseScenarioMaxMagnitudes{
// 0.588372 / 3, 0.590241 / 3, 0.588372 / 3, 0.368304, 0.1, 1.18 / 2, 0}; //final b,h= 0.002
// 0.368304,
// 0.1,
// 1.18 / 2,
// 0}; //final b,h= 0.002
// std::array<double, NumberOfBaseSimulationScenarios> baseScenarioMaxMagnitudes{0, 0, 0, 0.1, 0}; // std::array<double, NumberOfBaseSimulationScenarios> baseScenarioMaxMagnitudes{0, 0, 0, 0.1, 0};
// std::array<double, NumberOfBaseSimulationScenarios> // std::array<double, NumberOfBaseSimulationScenarios>
@ -233,6 +229,7 @@ struct Settings
// double angularDistanceEpsilon{vcg::math::ToRad(2.0)}; // double angularDistanceEpsilon{vcg::math::ToRad(2.0)};
double angularDistanceEpsilon{vcg::math::ToRad(0.0)}; double angularDistanceEpsilon{vcg::math::ToRad(0.0)};
double targetBaseTriangleSize{0.03}; double targetBaseTriangleSize{0.03};
RectangularBeamDimensions patternBeamDimensions{0.002, 0.002};
std::filesystem::path intermediateResultsDirectoryPath; std::filesystem::path intermediateResultsDirectoryPath;
struct ObjectiveWeights struct ObjectiveWeights
{ {
@ -310,6 +307,9 @@ struct Settings
json[GET_VARIABLE_NAME(angularDistanceEpsilon)] = vcg::math::ToDeg(angularDistanceEpsilon); json[GET_VARIABLE_NAME(angularDistanceEpsilon)] = vcg::math::ToDeg(angularDistanceEpsilon);
json[GET_VARIABLE_NAME(targetBaseTriangleSize)] = targetBaseTriangleSize; json[GET_VARIABLE_NAME(targetBaseTriangleSize)] = targetBaseTriangleSize;
json[GET_VARIABLE_NAME(baseScenarioMaxMagnitudes)] = baseScenarioMaxMagnitudes; json[GET_VARIABLE_NAME(baseScenarioMaxMagnitudes)] = baseScenarioMaxMagnitudes;
nlohmann::json json_dimensions;
patternBeamDimensions.to_json(json_dimensions, patternBeamDimensions);
json.update(json_dimensions);
#ifdef USE_ENSMALLEN #ifdef USE_ENSMALLEN
#ifdef USE_PSO #ifdef USE_PSO
@ -412,6 +412,8 @@ struct Settings
pso.numberOfParticles = static_cast<int>(json[GET_VARIABLE_NAME(pso.numberOfParticles)]); pso.numberOfParticles = static_cast<int>(json[GET_VARIABLE_NAME(pso.numberOfParticles)]);
} }
patternBeamDimensions.from_json(json, patternBeamDimensions);
// perBaseScenarioObjectiveWeights = json.at(JsonKeys::ObjectiveWeights); // perBaseScenarioObjectiveWeights = json.at(JsonKeys::ObjectiveWeights);
// objectiveWeights.translational = json.at(JsonKeys::ObjectiveWeights); // objectiveWeights.translational = json.at(JsonKeys::ObjectiveWeights);
// objectiveWeights.rotational = 2 - objectiveWeights.translational; // objectiveWeights.rotational = 2 - objectiveWeights.translational;
@ -555,6 +557,7 @@ struct Settings
std::vector<std::shared_ptr<SimulationJob>> reducedPatternSimulationJobs; std::vector<std::shared_ptr<SimulationJob>> reducedPatternSimulationJobs;
double fullPatternYoungsModulus{0}; double fullPatternYoungsModulus{0};
//Full pattern
PatternGeometry baseTriangleFullPattern; //non-fanned,non-tiled full pattern PatternGeometry baseTriangleFullPattern; //non-fanned,non-tiled full pattern
vcg::Triangle3<double> baseTriangle; vcg::Triangle3<double> baseTriangle;
// std::string notes; // std::string notes;
@ -808,9 +811,9 @@ struct Settings
JsonKeys::FullPatternLabel); JsonKeys::FullPatternLabel);
if (!baseTriangleFullPattern.load( if (!baseTriangleFullPattern.load(
std::filesystem::path(loadFromPath).append(fullPatternLabel + ".ply").string())) { std::filesystem::path(loadFromPath).append(fullPatternLabel + ".ply").string())) {
!baseTriangleFullPattern.load(std::filesystem::path(loadFromPath) baseTriangleFullPattern.load(std::filesystem::path(loadFromPath)
.append(loadFromPath.stem().string() + ".ply") .append(loadFromPath.stem().string() + ".ply")
.string()); .string());
} }
std::vector<double> baseTriangleVertices = json_optimizationResults.at( std::vector<double> baseTriangleVertices = json_optimizationResults.at(
@ -872,7 +875,7 @@ struct Settings
static void applyOptimizationResults_reducedModel_nonFanned( static void applyOptimizationResults_reducedModel_nonFanned(
const ReducedModelOptimization::Results &reducedPattern_optimizationResults, const ReducedModelOptimization::Results &reducedPattern_optimizationResults,
const vcg::Triangle3<double> &patternBaseTriangle, const vcg::Triangle3<double> &patternBaseTriangle,
MeshType &reducedPattern) MeshType &reducedModel)
{ {
std::unordered_map<std::string, double> std::unordered_map<std::string, double>
optimalXVariables(reducedPattern_optimizationResults.optimalXNameValuePairs.begin(), optimalXVariables(reducedPattern_optimizationResults.optimalXNameValuePairs.begin(),
@ -884,13 +887,13 @@ struct Settings
applyOptimizationResults_reducedModel_nonFanned(optimalXVariables.at("HexSize"), applyOptimizationResults_reducedModel_nonFanned(optimalXVariables.at("HexSize"),
optimalXVariables.at("HexAngle"), optimalXVariables.at("HexAngle"),
patternBaseTriangle, patternBaseTriangle,
reducedPattern); reducedModel);
return; return;
} }
applyOptimizationResults_reducedModel_nonFanned(optimalXVariables.at("R"), applyOptimizationResults_reducedModel_nonFanned(optimalXVariables.at("R"),
optimalXVariables.at("Theta"), optimalXVariables.at("Theta"),
patternBaseTriangle, patternBaseTriangle,
reducedPattern); reducedModel);
} }
template<typename MeshType> template<typename MeshType>
@ -898,7 +901,7 @@ struct Settings
const double &hexSize, const double &hexSize,
const double &hexAngle, const double &hexAngle,
const vcg::Triangle3<double> &patternBaseTriangle, const vcg::Triangle3<double> &patternBaseTriangle,
MeshType &reducedPattern) MeshType &reducedModel)
{ {
//Set optimal geometrical params of the reduced pattern //Set optimal geometrical params of the reduced pattern
// CoordType center_barycentric(1, 0, 0); // CoordType center_barycentric(1, 0, 0);
@ -907,13 +910,13 @@ struct Settings
// (center_barycentric * (1 - hexSize) + interfaceEdgeMiddle_barycentric)); // (center_barycentric * (1 - hexSize) + interfaceEdgeMiddle_barycentric));
CoordType movableVertex_barycentric(1 - hexSize, hexSize / 2, hexSize / 2); CoordType movableVertex_barycentric(1 - hexSize, hexSize / 2, hexSize / 2);
reducedPattern.vert[0].P() = patternBaseTriangle.cP(0) * movableVertex_barycentric[0] reducedModel.vert[0].P() = patternBaseTriangle.cP(0) * movableVertex_barycentric[0]
+ patternBaseTriangle.cP(1) * movableVertex_barycentric[1] + patternBaseTriangle.cP(1) * movableVertex_barycentric[1]
+ patternBaseTriangle.cP(2) * movableVertex_barycentric[2]; + patternBaseTriangle.cP(2) * movableVertex_barycentric[2];
if (hexAngle != 0) { if (hexAngle != 0) {
reducedPattern.vert[0].P() = vcg::RotationMatrix(CoordType{0, 0, 1}, reducedModel.vert[0].P() = vcg::RotationMatrix(CoordType{0, 0, 1},
vcg::math::ToRad(hexAngle)) vcg::math::ToRad(hexAngle))
* reducedPattern.vert[0].cP(); * reducedModel.vert[0].cP();
} }
// for (int rotationCounter = 0; // for (int rotationCounter = 0;
// rotationCounter < ReducedModelOptimizer::fanSize; rotationCounter++) { // rotationCounter < ReducedModelOptimizer::fanSize; rotationCounter++) {