Refactoring. Replaced PatternGeometry with ReducedModel everywhere
This commit is contained in:
parent
7f11ea8a47
commit
90dc2ac081
|
@ -4,14 +4,17 @@
|
||||||
#include "simulationhistoryplotter.hpp"
|
#include "simulationhistoryplotter.hpp"
|
||||||
#include "trianglepatterngeometry.hpp"
|
#include "trianglepatterngeometry.hpp"
|
||||||
#include "trianglepattterntopology.hpp"
|
#include "trianglepattterntopology.hpp"
|
||||||
#include <armadillo>
|
#ifdef USE_ENSMALLEN
|
||||||
|
#include "ensmallen.hpp"
|
||||||
|
#endif
|
||||||
#include <atomic>
|
#include <atomic>
|
||||||
#include <chrono>
|
#include <chrono>
|
||||||
#include <execution>
|
#include <execution>
|
||||||
#include <experimental/numeric>
|
#include <experimental/numeric>
|
||||||
#include <functional>
|
#include <functional>
|
||||||
#include <parallel/parallel.h>
|
//#include <parallel/parallel.h>
|
||||||
//#define USE_SCENARIO_WEIGHTS
|
//#define USE_SCENARIO_WEIGHTS
|
||||||
|
#include <armadillo>
|
||||||
|
|
||||||
using namespace ReducedModelOptimization;
|
using namespace ReducedModelOptimization;
|
||||||
|
|
||||||
|
@ -233,6 +236,7 @@ double ReducedModelOptimizer::objective(const std::vector<double> &x,
|
||||||
// for (const int simulationScenarioIndex : optimizationState.simulationScenarioIndices) {
|
// for (const int simulationScenarioIndex : optimizationState.simulationScenarioIndices) {
|
||||||
const std::shared_ptr<SimulationJob> &reducedJob
|
const std::shared_ptr<SimulationJob> &reducedJob
|
||||||
= optimizationState.reducedPatternSimulationJobs[simulationScenarioIndex];
|
= optimizationState.reducedPatternSimulationJobs[simulationScenarioIndex];
|
||||||
|
|
||||||
//#ifdef POLYSCOPE_DEFINED
|
//#ifdef POLYSCOPE_DEFINED
|
||||||
// std::cout << reducedJob->getLabel() << ":" << std::endl;
|
// std::cout << reducedJob->getLabel() << ":" << std::endl;
|
||||||
//#endif
|
//#endif
|
||||||
|
@ -243,7 +247,19 @@ double ReducedModelOptimizer::objective(const std::vector<double> &x,
|
||||||
= std::numeric_limits<double>::max();
|
= std::numeric_limits<double>::max();
|
||||||
optimizationState.numOfSimulationCrashes++;
|
optimizationState.numOfSimulationCrashes++;
|
||||||
#ifdef POLYSCOPE_DEFINED
|
#ifdef POLYSCOPE_DEFINED
|
||||||
std::cout << "Failed simulation" << std::endl;
|
std::cout << "Failed simulation with x:" << std::endl;
|
||||||
|
std::cout.precision(17);
|
||||||
|
for (int i = 0; i < x.size(); i++) {
|
||||||
|
std::cout << x[i] << " ";
|
||||||
|
}
|
||||||
|
std::cout << std::endl;
|
||||||
|
// pReducedPatternSimulationMesh->registerForDrawing();
|
||||||
|
// polyscope::show();
|
||||||
|
// pReducedPatternSimulationMesh->unregister();
|
||||||
|
// std::filesystem::create_directories("failedJob");
|
||||||
|
// reducedJob->save("failedJob");
|
||||||
|
// Results debugRes;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
} else {
|
} else {
|
||||||
// const double simulationScenarioError_PE = std::abs(
|
// const double simulationScenarioError_PE = std::abs(
|
||||||
|
@ -380,7 +396,7 @@ void ReducedModelOptimizer::createSimulationMeshes(PatternGeometry &fullModel,
|
||||||
void ReducedModelOptimizer::computeMaps(
|
void ReducedModelOptimizer::computeMaps(
|
||||||
const std::unordered_map<size_t, std::unordered_set<size_t>> &slotToNode,
|
const std::unordered_map<size_t, std::unordered_set<size_t>> &slotToNode,
|
||||||
PatternGeometry &fullPattern,
|
PatternGeometry &fullPattern,
|
||||||
PatternGeometry &reducedPattern,
|
ReducedModel &reducedPattern,
|
||||||
std::unordered_map<ReducedPatternVertexIndex, FullPatternVertexIndex>
|
std::unordered_map<ReducedPatternVertexIndex, FullPatternVertexIndex>
|
||||||
&reducedToFullInterfaceViMap,
|
&reducedToFullInterfaceViMap,
|
||||||
std::unordered_map<FullPatternVertexIndex, ReducedPatternVertexIndex>
|
std::unordered_map<FullPatternVertexIndex, ReducedPatternVertexIndex>
|
||||||
|
@ -427,11 +443,11 @@ void ReducedModelOptimizer::computeMaps(
|
||||||
const size_t reducedModelBaseTriangleInterfaceVi = pu_reducedModel.remap[baseTriangleInterfaceVi];
|
const size_t reducedModelBaseTriangleInterfaceVi = pu_reducedModel.remap[baseTriangleInterfaceVi];
|
||||||
const size_t reducedModelInterfaceVertexOffset
|
const size_t reducedModelInterfaceVertexOffset
|
||||||
= reducedPattern.VN() /*- 1*/ /*- reducedModelBaseTriangleInterfaceVi*/;
|
= reducedPattern.VN() /*- 1*/ /*- reducedModelBaseTriangleInterfaceVi*/;
|
||||||
Results::applyOptimizationResults_innerHexagon(initialHexagonSize,
|
Results::applyOptimizationResults_reducedModel_nonFanned(initialHexagonSize,
|
||||||
0,
|
0,
|
||||||
baseTriangle,
|
baseTriangle,
|
||||||
reducedPattern);
|
reducedPattern);
|
||||||
reducedPattern.createFan({0}); //TODO: should be an input parameter from main
|
reducedPattern.createFan(); //TODO: should be an input parameter from main
|
||||||
for (size_t fanIndex = 0; fanIndex < fanSize; fanIndex++) {
|
for (size_t fanIndex = 0; fanIndex < fanSize; fanIndex++) {
|
||||||
reducedToFullInterfaceViMap[reducedModelInterfaceVertexOffset * fanIndex
|
reducedToFullInterfaceViMap[reducedModelInterfaceVertexOffset * fanIndex
|
||||||
+ reducedModelBaseTriangleInterfaceVi]
|
+ reducedModelBaseTriangleInterfaceVi]
|
||||||
|
@ -503,12 +519,11 @@ void ReducedModelOptimizer::computeMaps(
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void ReducedModelOptimizer::computeMaps(PatternGeometry &fullPattern,
|
void ReducedModelOptimizer::computeMaps(PatternGeometry &fullPattern, ReducedModel &reducedModel)
|
||||||
PatternGeometry &reducedPattern)
|
|
||||||
{
|
{
|
||||||
ReducedModelOptimizer::computeMaps(slotToNode,
|
ReducedModelOptimizer::computeMaps(slotToNode,
|
||||||
fullPattern,
|
fullPattern,
|
||||||
reducedPattern,
|
reducedModel,
|
||||||
optimizationState.reducedToFullInterfaceViMap,
|
optimizationState.reducedToFullInterfaceViMap,
|
||||||
m_fullToReducedInterfaceViMap,
|
m_fullToReducedInterfaceViMap,
|
||||||
m_fullPatternOppositeInterfaceViPairs);
|
m_fullPatternOppositeInterfaceViPairs);
|
||||||
|
@ -529,38 +544,42 @@ ReducedModelOptimizer::ReducedModelOptimizer()
|
||||||
scenarioIsSymmetrical[BaseSimulationScenario::Shear] = false;
|
scenarioIsSymmetrical[BaseSimulationScenario::Shear] = false;
|
||||||
constructBaseScenarioFunctions[BaseSimulationScenario::Bending]
|
constructBaseScenarioFunctions[BaseSimulationScenario::Bending]
|
||||||
= &constructBendingSimulationScenario;
|
= &constructBendingSimulationScenario;
|
||||||
scenarioIsSymmetrical[BaseSimulationScenario::Bending] = false;
|
scenarioIsSymmetrical[BaseSimulationScenario::Bending] = true;
|
||||||
constructBaseScenarioFunctions[BaseSimulationScenario::Dome] = &constructDomeSimulationScenario;
|
constructBaseScenarioFunctions[BaseSimulationScenario::Dome] = &constructDomeSimulationScenario;
|
||||||
scenarioIsSymmetrical[BaseSimulationScenario::Dome] = false;
|
scenarioIsSymmetrical[BaseSimulationScenario::Dome] = true;
|
||||||
constructBaseScenarioFunctions[BaseSimulationScenario::Saddle]
|
constructBaseScenarioFunctions[BaseSimulationScenario::Saddle]
|
||||||
= &constructSaddleSimulationScenario;
|
= &constructSaddleSimulationScenario;
|
||||||
scenarioIsSymmetrical[BaseSimulationScenario::Saddle] = false;
|
scenarioIsSymmetrical[BaseSimulationScenario::Saddle] = true;
|
||||||
constructBaseScenarioFunctions[BaseSimulationScenario::S] = &constructSSimulationScenario;
|
constructBaseScenarioFunctions[BaseSimulationScenario::S] = &constructSSimulationScenario;
|
||||||
scenarioIsSymmetrical[BaseSimulationScenario::S] = false;
|
scenarioIsSymmetrical[BaseSimulationScenario::S] = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ReducedModelOptimizer::initializePatterns(
|
void ReducedModelOptimizer::initializePatterns(
|
||||||
PatternGeometry &fullPattern,
|
PatternGeometry &fullPattern,
|
||||||
PatternGeometry &reducedPattern,
|
ReducedModel &reducedModel,
|
||||||
const std::array<xRange, NumberOfOptimizationVariables> &optimizationParameters)
|
const std::array<xRange, NumberOfOptimizationVariables> &optimizationParameters)
|
||||||
{
|
{
|
||||||
assert(fullPattern.VN() == reducedPattern.VN() && fullPattern.EN() >= reducedPattern.EN());
|
assert(fullPattern.VN() == reducedModel.VN() && fullPattern.EN() >= reducedModel.EN());
|
||||||
|
|
||||||
#if POLYSCOPE_DEFINED
|
#ifdef POLYSCOPE_DEFINED
|
||||||
polyscope::removeAllStructures();
|
polyscope::removeAllStructures();
|
||||||
#endif
|
#endif
|
||||||
// Create copies of the input models
|
// Create copies of the input models
|
||||||
PatternGeometry copyFullPattern;
|
PatternGeometry copyFullPattern;
|
||||||
PatternGeometry copyReducedPattern;
|
ReducedModel copyReducedModel;
|
||||||
copyFullPattern.copy(fullPattern);
|
copyFullPattern.copy(fullPattern);
|
||||||
copyReducedPattern.copy(reducedPattern);
|
copyReducedModel.copy(reducedModel);
|
||||||
|
#ifdef POLYSCOPE_DEFINED
|
||||||
copyFullPattern.updateEigenEdgeAndVertices();
|
copyFullPattern.updateEigenEdgeAndVertices();
|
||||||
copyReducedPattern.updateEigenEdgeAndVertices();
|
#endif
|
||||||
baseTriangle = copyReducedPattern.getBaseTriangle();
|
copyReducedModel.updateEigenEdgeAndVertices();
|
||||||
|
baseTriangle = copyReducedModel.getBaseTriangle();
|
||||||
|
|
||||||
computeMaps(copyFullPattern, copyReducedPattern);
|
computeMaps(copyFullPattern, copyReducedModel);
|
||||||
optimizationState.fullPatternOppositeInterfaceViPairs = m_fullPatternOppositeInterfaceViPairs;
|
optimizationState.fullPatternOppositeInterfaceViPairs = m_fullPatternOppositeInterfaceViPairs;
|
||||||
createSimulationMeshes(copyFullPattern, copyReducedPattern);
|
g_baseScenarioMaxDisplacementHelperData.fullPatternOppositeInterfaceViPairs
|
||||||
|
= m_fullPatternOppositeInterfaceViPairs;
|
||||||
|
createSimulationMeshes(copyFullPattern, copyReducedModel);
|
||||||
initializeUpdateReducedPatternFunctions();
|
initializeUpdateReducedPatternFunctions();
|
||||||
initializeOptimizationParameters(m_pFullPatternSimulationMesh, optimizationParameters);
|
initializeOptimizationParameters(m_pFullPatternSimulationMesh, optimizationParameters);
|
||||||
}
|
}
|
||||||
|
@ -570,9 +589,9 @@ void ReducedModelOptimizer::optimize(ConstPatternGeometry &fullPattern,
|
||||||
ReducedModelOptimization::Results &optimizationResults)
|
ReducedModelOptimization::Results &optimizationResults)
|
||||||
{
|
{
|
||||||
//scale pattern and reduced model
|
//scale pattern and reduced model
|
||||||
fullPattern.scale(optimizationSettings.targetBaseTriangleSize, interfaceNodeIndex);
|
fullPattern.scale(optimizationSettings.targetBaseTriangleSize);
|
||||||
ReducedModel reducedModel;
|
ReducedModel reducedModel;
|
||||||
reducedModel.scale(optimizationSettings.targetBaseTriangleSize, interfaceNodeIndex);
|
reducedModel.scale(optimizationSettings.targetBaseTriangleSize);
|
||||||
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);
|
||||||
|
@ -589,18 +608,23 @@ void ReducedModelOptimizer::initializeUpdateReducedPatternFunctions()
|
||||||
{
|
{
|
||||||
const vcg::Triangle3<double> &baseTriangle = this->baseTriangle;
|
const vcg::Triangle3<double> &baseTriangle = this->baseTriangle;
|
||||||
optimizationState.functions_updateReducedPatternParameter[R] =
|
optimizationState.functions_updateReducedPatternParameter[R] =
|
||||||
[=](const double &newR, std::shared_ptr<SimulationMesh> &pReducedPatternSimulationMesh) {
|
[=](const double &newR, std::shared_ptr<SimulationMesh> &pReducedModelSimulationMesh) {
|
||||||
|
// std::shared_ptr<VCGEdgeMesh> pReducedModel_edgeMesh = std::dynamic_pointer_cast<VCGEdgeMesh>(
|
||||||
|
// pReducedModelSimulationMesh);
|
||||||
|
// ReducedModel::updateFannedGeometry_R(newR, pReducedModel_edgeMesh);
|
||||||
const CoordType barycentricCoordinates_hexagonBaseTriangleVertex(1 - newR,
|
const CoordType barycentricCoordinates_hexagonBaseTriangleVertex(1 - newR,
|
||||||
newR / 2,
|
newR / 2,
|
||||||
newR / 2);
|
newR / 2);
|
||||||
|
// const vcg::Triangle3<double> &baseTriangle = getBaseTriangle();
|
||||||
const CoordType hexagonBaseTriangleVertexPosition
|
const CoordType hexagonBaseTriangleVertexPosition
|
||||||
= baseTriangle.cP(0) * barycentricCoordinates_hexagonBaseTriangleVertex[0]
|
= baseTriangle.cP(0) * barycentricCoordinates_hexagonBaseTriangleVertex[0]
|
||||||
+ baseTriangle.cP(1) * barycentricCoordinates_hexagonBaseTriangleVertex[1]
|
+ baseTriangle.cP(1) * barycentricCoordinates_hexagonBaseTriangleVertex[1]
|
||||||
+ baseTriangle.cP(2) * barycentricCoordinates_hexagonBaseTriangleVertex[2];
|
+ baseTriangle.cP(2) * barycentricCoordinates_hexagonBaseTriangleVertex[2];
|
||||||
|
|
||||||
|
// constexpr int fanSize = 6;
|
||||||
for (int rotationCounter = 0; rotationCounter < ReducedModelOptimizer::fanSize;
|
for (int rotationCounter = 0; rotationCounter < ReducedModelOptimizer::fanSize;
|
||||||
rotationCounter++) {
|
rotationCounter++) {
|
||||||
pReducedPatternSimulationMesh->vert[2 * rotationCounter].P()
|
pReducedModelSimulationMesh->vert[2 * rotationCounter].P()
|
||||||
= vcg::RotationMatrix(PatternGeometry::DefaultNormal,
|
= vcg::RotationMatrix(PatternGeometry::DefaultNormal,
|
||||||
vcg::math::ToRad(60.0 * rotationCounter))
|
vcg::math::ToRad(60.0 * rotationCounter))
|
||||||
* hexagonBaseTriangleVertexPosition;
|
* hexagonBaseTriangleVertexPosition;
|
||||||
|
@ -608,17 +632,21 @@ void ReducedModelOptimizer::initializeUpdateReducedPatternFunctions()
|
||||||
};
|
};
|
||||||
|
|
||||||
optimizationState.functions_updateReducedPatternParameter[Theta] =
|
optimizationState.functions_updateReducedPatternParameter[Theta] =
|
||||||
[](const double &newTheta, std::shared_ptr<SimulationMesh> &pReducedPatternSimulationMesh) {
|
[](const double &newTheta_degrees,
|
||||||
const CoordType baseTriangleHexagonVertexPosition
|
std::shared_ptr<SimulationMesh> &pReducedModelSimulationMesh) {
|
||||||
= pReducedPatternSimulationMesh->vert[0].cP();
|
// std::shared_ptr<VCGEdgeMesh> pReducedModel_edgeMesh
|
||||||
|
// = std::dynamic_pointer_cast<VCGEdgeMesh>(pReducedModelSimulationMesh);
|
||||||
|
// ReducedModel::updateFannedGeometry_theta(newTheta_degrees, pReducedModel_edgeMesh);
|
||||||
|
|
||||||
|
const CoordType baseTriangleHexagonVertexPosition = pReducedModelSimulationMesh->vert[0]
|
||||||
|
.cP();
|
||||||
const CoordType thetaRotatedHexagonBaseTriangleVertexPosition
|
const CoordType thetaRotatedHexagonBaseTriangleVertexPosition
|
||||||
= vcg::RotationMatrix(PatternGeometry::DefaultNormal, vcg::math::ToRad(newTheta))
|
= vcg::RotationMatrix(PatternGeometry::DefaultNormal,
|
||||||
|
vcg::math::ToRad(newTheta_degrees))
|
||||||
* baseTriangleHexagonVertexPosition;
|
* baseTriangleHexagonVertexPosition;
|
||||||
|
|
||||||
for (int rotationCounter = 0; rotationCounter < ReducedModelOptimizer::fanSize;
|
for (int rotationCounter = 0; rotationCounter < ReducedModelOptimizer::fanSize;
|
||||||
rotationCounter++) {
|
rotationCounter++) {
|
||||||
pReducedPatternSimulationMesh->vert[2 * rotationCounter].P()
|
pReducedModelSimulationMesh->vert[2 * rotationCounter].P()
|
||||||
= vcg::RotationMatrix(PatternGeometry::DefaultNormal,
|
= vcg::RotationMatrix(PatternGeometry::DefaultNormal,
|
||||||
vcg::math::ToRad(60.0 * rotationCounter))
|
vcg::math::ToRad(60.0 * rotationCounter))
|
||||||
* thetaRotatedHexagonBaseTriangleVertexPosition;
|
* thetaRotatedHexagonBaseTriangleVertexPosition;
|
||||||
|
@ -814,9 +842,9 @@ void ReducedModelOptimizer::getResults(const FunctionEvaluation &optimalObjectiv
|
||||||
}
|
}
|
||||||
#ifdef POLYSCOPE_DEFINED
|
#ifdef POLYSCOPE_DEFINED
|
||||||
std::cout << std::endl;
|
std::cout << std::endl;
|
||||||
|
m_pReducedPatternSimulationMesh->updateEigenEdgeAndVertices();
|
||||||
#endif
|
#endif
|
||||||
m_pReducedPatternSimulationMesh->reset();
|
m_pReducedPatternSimulationMesh->reset();
|
||||||
|
|
||||||
results.fullPatternYoungsModulus = youngsModulus;
|
results.fullPatternYoungsModulus = youngsModulus;
|
||||||
// Compute obj value per simulation scenario and the raw objective value
|
// Compute obj value per simulation scenario and the raw objective value
|
||||||
// updateMeshFunction(optimalX);
|
// updateMeshFunction(optimalX);
|
||||||
|
@ -844,8 +872,9 @@ void ReducedModelOptimizer::getResults(const FunctionEvaluation &optimalObjectiv
|
||||||
optimizationState.simulationScenarioIndices.size());
|
optimizationState.simulationScenarioIndices.size());
|
||||||
for (int i = 0; i < optimizationState.simulationScenarioIndices.size(); i++) {
|
for (int i = 0; i < optimizationState.simulationScenarioIndices.size(); i++) {
|
||||||
const int simulationScenarioIndex = optimizationState.simulationScenarioIndices[i];
|
const int simulationScenarioIndex = optimizationState.simulationScenarioIndices[i];
|
||||||
SimulationResults reducedModelResults = simulator.executeSimulation(
|
std::shared_ptr<SimulationJob> &pReducedJob
|
||||||
optimizationState.reducedPatternSimulationJobs[simulationScenarioIndex]);
|
= optimizationState.reducedPatternSimulationJobs[simulationScenarioIndex];
|
||||||
|
SimulationResults reducedModelResults = simulator.executeSimulation(pReducedJob);
|
||||||
|
|
||||||
#ifdef POLYSCOPE_DEFINED
|
#ifdef POLYSCOPE_DEFINED
|
||||||
#ifdef USE_SCENARIO_WEIGHTS
|
#ifdef USE_SCENARIO_WEIGHTS
|
||||||
|
@ -943,11 +972,12 @@ void ReducedModelOptimizer::getResults(const FunctionEvaluation &optimalObjectiv
|
||||||
<< std::endl;
|
<< std::endl;
|
||||||
std::cout << std::endl;
|
std::cout << std::endl;
|
||||||
|
|
||||||
// reducedModelResults.registerForDrawing(Colors::reducedDeformed);
|
reducedModelResults.registerForDrawing(Colors::reducedDeformed);
|
||||||
// optimizationState.fullPatternResults[simulationScenarioIndex].registerForDrawing(Colors::fullDeformed);
|
optimizationState.fullPatternResults[simulationScenarioIndex].registerForDrawing(
|
||||||
// polyscope::show();
|
Colors::fullDeformed);
|
||||||
// reducedModelResults.unregister();
|
polyscope::show();
|
||||||
// optimizationState.fullPatternResults[simulationScenarioIndex].unregister();
|
reducedModelResults.unregister();
|
||||||
|
optimizationState.fullPatternResults[simulationScenarioIndex].unregister();
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
@ -968,6 +998,7 @@ void ReducedModelOptimizer::getResults(const FunctionEvaluation &optimalObjectiv
|
||||||
// results.draw();
|
// results.draw();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef DLIB_DEFINED
|
||||||
std::array<double, NumberOfBaseSimulationScenarios>
|
std::array<double, NumberOfBaseSimulationScenarios>
|
||||||
ReducedModelOptimizer::computeFullPatternMaxSimulationForces(
|
ReducedModelOptimizer::computeFullPatternMaxSimulationForces(
|
||||||
const std::vector<BaseSimulationScenario> &desiredBaseSimulationScenario) const
|
const std::vector<BaseSimulationScenario> &desiredBaseSimulationScenario) const
|
||||||
|
@ -1028,6 +1059,7 @@ ReducedModelOptimizer::getFullPatternMaxSimulationForces(
|
||||||
|
|
||||||
return fullPatternSimulationScenarioMaxMagnitudes;
|
return fullPatternSimulationScenarioMaxMagnitudes;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
void ReducedModelOptimizer::runOptimization(const Settings &settings,
|
void ReducedModelOptimizer::runOptimization(const Settings &settings,
|
||||||
ReducedModelOptimization::Results &results)
|
ReducedModelOptimization::Results &results)
|
||||||
|
@ -1155,7 +1187,6 @@ void ReducedModelOptimizer::runOptimization(const Settings &settings,
|
||||||
std::cout << "optimal x:"
|
std::cout << "optimal x:"
|
||||||
<< "\n"
|
<< "\n"
|
||||||
<< x << std::endl;
|
<< x << std::endl;
|
||||||
std::cout << "Minima:" << minima << std::endl;
|
|
||||||
std::cout << "optimal objective:" << optimizationFunction.Evaluate(x) << std::endl;
|
std::cout << "optimal objective:" << optimizationFunction.Evaluate(x) << std::endl;
|
||||||
#endif
|
#endif
|
||||||
parameterGroup_optimalResult.x.clear();
|
parameterGroup_optimalResult.x.clear();
|
||||||
|
@ -1382,38 +1413,49 @@ void ReducedModelOptimizer::constructDomeSimulationScenario(
|
||||||
- job.pMesh->vert[viPair.second].cP());
|
- job.pMesh->vert[viPair.second].cP());
|
||||||
VectorType momentAxis = vcg::RotationMatrix(VectorType(0, 0, 1), vcg::math::ToRad(90.0))
|
VectorType momentAxis = vcg::RotationMatrix(VectorType(0, 0, 1), vcg::math::ToRad(90.0))
|
||||||
* interfaceVector.Normalize();
|
* interfaceVector.Normalize();
|
||||||
if (viPairIt == oppositeInterfaceViPairs.begin()) {
|
// if (viPairIt == oppositeInterfaceViPairs.begin()) {
|
||||||
job.nodalForcedDisplacements[viPair.first]
|
// // job.nodalForcedDisplacements[viPair.first] = Eigen::Vector3d(-interfaceVector[0],
|
||||||
= Eigen::Vector3d(-interfaceVector[0],
|
// // -interfaceVector[1],
|
||||||
-interfaceVector[1],
|
// // 0)
|
||||||
0)
|
// // * 0.01
|
||||||
* 0.001
|
// /** std::abs(
|
||||||
* std::abs(
|
// forceMagnitude)*/
|
||||||
forceMagnitude); //NOTE:Should the forced displacement change relatively to the magnitude?
|
// // ; //NOTE:Should the forced displacement change relatively to the magnitude?
|
||||||
// * std::abs(forceMagnitude / maxForceMagnitude_dome);
|
// // * std::abs(forceMagnitude / maxForceMagnitude_dome);
|
||||||
job.nodalForcedDisplacements[viPair.second] = Eigen::Vector3d(interfaceVector[0],
|
// // job.nodalForcedDisplacements[viPair.second] = Eigen::Vector3d(interfaceVector[0],
|
||||||
interfaceVector[1],
|
// // interfaceVector[1],
|
||||||
0)
|
// // 0)
|
||||||
* 0.001 * std::abs(forceMagnitude);
|
// // * 0.01 /** std::abs(forceMagnitude)*/;
|
||||||
// * std::abs(forceMagnitude / maxForceMagnitude_dome);
|
// // * std::abs(forceMagnitude / maxForceMagnitude_dome);
|
||||||
// CoordType v = (pMesh->vert[viPair.first].cP() - pMesh->vert[viPair.second].cP())
|
// // CoordType v = (pMesh->vert[viPair.first].cP() - pMesh->vert[viPair.second].cP())
|
||||||
// ^ CoordType(0, 0, -1).Normalize();
|
// // ^ CoordType(0, 0, -1).Normalize();
|
||||||
// nodalForces[viPair.first] = Vector6d({0, 0, 0, v[0], v[1], 0}) * forceMagnitude
|
// // nodalForces[viPair.first] = Vector6d({0, 0, 0, v[0], v[1], 0}) * forceMagnitude
|
||||||
// * 0.0001;
|
// // * 0.0001;
|
||||||
// nodalForces[viPair.second] = Vector6d({0, 0, 0, -v[0], -v[1], 0}) * forceMagnitude
|
// // nodalForces[viPair.second] = Vector6d({0, 0, 0, -v[0], -v[1], 0}) * forceMagnitude
|
||||||
// * 0.0001;
|
// // * 0.0001;
|
||||||
} else {
|
// job.constrainedVertices[viPair.first] = {0, 1, 2};
|
||||||
|
// job.constrainedVertices[viPair.second] = {2};
|
||||||
|
// job.constrainedVertices[viPair.first] = std::unordered_set<DoFType>{0, 1, 2};
|
||||||
|
// job.constrainedVertices[viPair.second] = std::unordered_set<DoFType>{0, 2};
|
||||||
|
// } else {
|
||||||
|
// job.nodalExternalForces[viPair.first]
|
||||||
|
// = Vector6d({0, 0, 0, momentAxis[0], momentAxis[1], momentAxis[2]}) * forceMagnitude
|
||||||
|
// / 3;
|
||||||
|
// job.nodalExternalForces[viPair.second]
|
||||||
|
// = Vector6d({0, 0, 0, -momentAxis[0], -momentAxis[1], -momentAxis[2]})
|
||||||
|
// * forceMagnitude / 3;
|
||||||
|
// job.constrainedVertices[viPair.first] = std::unordered_set<DoFType>{2};
|
||||||
|
// job.constrainedVertices[viPair.second] = std::unordered_set<DoFType>{2};
|
||||||
|
// }
|
||||||
job.nodalExternalForces[viPair.first]
|
job.nodalExternalForces[viPair.first]
|
||||||
= Vector6d({0, 0, 0, momentAxis[0], momentAxis[1], momentAxis[2]}) * forceMagnitude
|
= Vector6d({0, 0, 0, momentAxis[0], momentAxis[1], momentAxis[2]}) * forceMagnitude / 3;
|
||||||
/ 3;
|
|
||||||
job.nodalExternalForces[viPair.second]
|
job.nodalExternalForces[viPair.second]
|
||||||
= Vector6d({0, 0, 0, -momentAxis[0], -momentAxis[1], -momentAxis[2]})
|
= Vector6d({0, 0, 0, -momentAxis[0], -momentAxis[1], -momentAxis[2]}) * forceMagnitude
|
||||||
* forceMagnitude / 3;
|
/ 3;
|
||||||
job.constrainedVertices[viPair.first] = std::unordered_set<DoFType>{2};
|
job.constrainedVertices[viPair.first] = std::unordered_set<DoFType>{0, 1, 2};
|
||||||
job.constrainedVertices[viPair.second] = std::unordered_set<DoFType>{2};
|
job.constrainedVertices[viPair.second] = std::unordered_set<DoFType>{2};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
void ReducedModelOptimizer::constructSaddleSimulationScenario(
|
void ReducedModelOptimizer::constructSaddleSimulationScenario(
|
||||||
const double &forceMagnitude,
|
const double &forceMagnitude,
|
||||||
|
@ -1564,7 +1606,7 @@ double fullPatternMaxSimulationForceTranslationalObjective(const double &forceMa
|
||||||
settings.totalExternalForcesNormPercentageTermination = 1e-2;
|
settings.totalExternalForcesNormPercentageTermination = 1e-2;
|
||||||
settings.totalTranslationalKineticEnergyThreshold = 1e-8;
|
settings.totalTranslationalKineticEnergyThreshold = 1e-8;
|
||||||
settings.viscousDampingFactor = 5e-3;
|
settings.viscousDampingFactor = 5e-3;
|
||||||
settings.useKineticDamping = true;
|
settings.useTranslationalKineticEnergyForKineticDamping = true;
|
||||||
// settings.averageResidualForcesCriterionThreshold = 1e-5;
|
// settings.averageResidualForcesCriterionThreshold = 1e-5;
|
||||||
// settings.useAverage = true;
|
// settings.useAverage = true;
|
||||||
// settings.totalTranslationalKineticEnergyThreshold = 1e-10;
|
// settings.totalTranslationalKineticEnergyThreshold = 1e-10;
|
||||||
|
@ -1616,6 +1658,7 @@ struct ForceMagnitudeOptimization
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef DLIB_DEFINED
|
||||||
double ReducedModelOptimizer::computeFullPatternMaxSimulationForce(
|
double ReducedModelOptimizer::computeFullPatternMaxSimulationForce(
|
||||||
const BaseSimulationScenario &scenario) const
|
const BaseSimulationScenario &scenario) const
|
||||||
{
|
{
|
||||||
|
@ -1733,6 +1776,7 @@ double ReducedModelOptimizer::computeFullPatternMaxSimulationForce(
|
||||||
|
|
||||||
return forceMagnitude;
|
return forceMagnitude;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
void ReducedModelOptimizer::computeScenarioWeights(
|
void ReducedModelOptimizer::computeScenarioWeights(
|
||||||
const std::vector<BaseSimulationScenario> &baseSimulationScenarios,
|
const std::vector<BaseSimulationScenario> &baseSimulationScenarios,
|
||||||
|
@ -1818,7 +1862,7 @@ std::vector<std::shared_ptr<SimulationJob>> ReducedModelOptimizer::createFullPat
|
||||||
const double forceMagnitudeStep = numberOfSimulationScenarios == 1
|
const double forceMagnitudeStep = numberOfSimulationScenarios == 1
|
||||||
? maxForceMagnitude
|
? maxForceMagnitude
|
||||||
: (maxForceMagnitude - minForceMagnitude)
|
: (maxForceMagnitude - minForceMagnitude)
|
||||||
/ (numberOfSimulationScenarios);
|
/ (numberOfSimulationScenarios - 1);
|
||||||
const int baseSimulationScenarioIndexOffset
|
const int baseSimulationScenarioIndexOffset
|
||||||
= std::accumulate(simulationScenariosResolution.begin(),
|
= std::accumulate(simulationScenariosResolution.begin(),
|
||||||
simulationScenariosResolution.begin() + baseScenario,
|
simulationScenariosResolution.begin() + baseScenario,
|
||||||
|
@ -1949,11 +1993,15 @@ void ReducedModelOptimizer::optimize(
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
std::set<BaseSimulationScenario> set_desiredScenarios(desiredBaseSimulationScenarios.begin(),
|
||||||
|
desiredBaseSimulationScenarios.end());
|
||||||
|
std::set<BaseSimulationScenario> set_zeroScenarios(zeroMagnitudeScenarios.begin(),
|
||||||
|
zeroMagnitudeScenarios.end());
|
||||||
std::vector<BaseSimulationScenario> usedBaseSimulationScenarios;
|
std::vector<BaseSimulationScenario> usedBaseSimulationScenarios;
|
||||||
std::set_difference(desiredBaseSimulationScenarios.begin(),
|
std::set_difference(set_desiredScenarios.begin(),
|
||||||
desiredBaseSimulationScenarios.end(),
|
set_desiredScenarios.end(),
|
||||||
zeroMagnitudeScenarios.begin(),
|
set_zeroScenarios.begin(),
|
||||||
zeroMagnitudeScenarios.end(),
|
set_zeroScenarios.end(),
|
||||||
std::back_inserter(usedBaseSimulationScenarios));
|
std::back_inserter(usedBaseSimulationScenarios));
|
||||||
|
|
||||||
assert(!optimizationSettings.optimizationStrategy.empty());
|
assert(!optimizationSettings.optimizationStrategy.empty());
|
||||||
|
@ -1979,11 +2027,16 @@ void ReducedModelOptimizer::optimize(
|
||||||
0));
|
0));
|
||||||
}
|
}
|
||||||
|
|
||||||
// constexpr bool recomputeForceMagnitudes = true;
|
// constexpr bool recomputeForceMagnitudes = false;
|
||||||
// std::array<double, NumberOfBaseSimulationScenarios> fullPatternSimulationScenarioMaxMagnitudes
|
// std::array<double, NumberOfBaseSimulationScenarios> fullPatternSimulationScenarioMaxMagnitudes
|
||||||
// = getFullPatternMaxSimulationForces(usedBaseSimulationScenarios,
|
// = getFullPatternMaxSimulationForces(usedBaseSimulationScenarios,
|
||||||
// optimizationSettings.intermediateResultsDirectoryPath,
|
// optimizationSettings.intermediateResultsDirectoryPath,
|
||||||
// recomputeForceMagnitudes);
|
// recomputeForceMagnitudes);
|
||||||
|
// for (int baseScenario = Axial; baseScenario != NumberOfBaseSimulationScenarios; baseScenario++) {
|
||||||
|
// fullPatternSimulationScenarioMaxMagnitudes[baseScenario]
|
||||||
|
// = std::min(fullPatternSimulationScenarioMaxMagnitudes[baseScenario],
|
||||||
|
// optimizationSettings.baseScenarioMaxMagnitudes[baseScenario]);
|
||||||
|
// }
|
||||||
// optimizationSettings.baseScenarioMaxMagnitudes = fullPatternSimulationScenarioMaxMagnitudes;
|
// optimizationSettings.baseScenarioMaxMagnitudes = fullPatternSimulationScenarioMaxMagnitudes;
|
||||||
std::array<double, NumberOfBaseSimulationScenarios> fullPatternSimulationScenarioMaxMagnitudes
|
std::array<double, NumberOfBaseSimulationScenarios> fullPatternSimulationScenarioMaxMagnitudes
|
||||||
= optimizationSettings.baseScenarioMaxMagnitudes;
|
= optimizationSettings.baseScenarioMaxMagnitudes;
|
||||||
|
@ -1997,14 +2050,28 @@ void ReducedModelOptimizer::optimize(
|
||||||
|
|
||||||
results.baseTriangle = baseTriangle;
|
results.baseTriangle = baseTriangle;
|
||||||
|
|
||||||
DRMSimulationModel::Settings simulationSettings;
|
DRMSimulationModel::Settings drmSettings;
|
||||||
simulationSettings.totalExternalForcesNormPercentageTermination = 1e-5;
|
drmSettings.totalExternalForcesNormPercentageTermination = 1e-5;
|
||||||
simulationSettings.maxDRMIterations = 200000;
|
drmSettings.maxDRMIterations = 200000;
|
||||||
simulationSettings.totalTranslationalKineticEnergyThreshold = 1e-15;
|
// drmSettings.totalTranslationalKineticEnergyThreshold = 1e-10;
|
||||||
|
drmSettings.totalTranslationalKineticEnergyThreshold = 1e-9;
|
||||||
|
// drmSettings.gradualForcedDisplacementSteps = 20;
|
||||||
|
// drmSettings.linearGuessForceScaleFactor = 1;
|
||||||
|
// drmSettings.viscousDampingFactor = 5e-3;
|
||||||
|
// drmSettings.useTotalRotationalKineticEnergyForKineticDamping = true;
|
||||||
|
// drmSettings.shouldDraw = true;
|
||||||
|
|
||||||
|
// drmSettings.totalExternalForcesNormPercentageTermination = 1e-2;
|
||||||
|
drmSettings.totalTranslationalKineticEnergyThreshold = 1e-8;
|
||||||
|
// drmSettings.viscousDampingFactor = 5e-3;
|
||||||
// simulationSettings.viscousDampingFactor = 5e-3;
|
// simulationSettings.viscousDampingFactor = 5e-3;
|
||||||
// simulationSettings.debugModeStep = 100000;
|
// simulationSettings.linearGuessForceScaleFactor = 1;
|
||||||
// simulationSettings.shouldDraw = true;
|
// simulationSettings.gamma = 0.3;
|
||||||
// simulationSettings.beVerbose = true;
|
// simulationSettings.xi = 0.9999;
|
||||||
|
// drmSettings.debugModeStep = 100;
|
||||||
|
// drmSettings.shouldDraw = true;
|
||||||
|
// drmSettings.shouldCreatePlots = true;
|
||||||
|
// drmSettings.beVerbose = true;
|
||||||
// simulationSettings.useKineticDamping = true;
|
// simulationSettings.useKineticDamping = true;
|
||||||
// simulationSettings.save(std::filesystem::path(std::string(__FILE__))
|
// simulationSettings.save(std::filesystem::path(std::string(__FILE__))
|
||||||
// .parent_path()
|
// .parent_path()
|
||||||
|
@ -2019,25 +2086,24 @@ void ReducedModelOptimizer::optimize(
|
||||||
// simulationSettings.shouldDraw = true;
|
// simulationSettings.shouldDraw = true;
|
||||||
// simulationSettings.isDebugMode = true;
|
// simulationSettings.isDebugMode = true;
|
||||||
// simulationSettings.debugModeStep = 100000;
|
// simulationSettings.debugModeStep = 100000;
|
||||||
#ifdef POLYSCOPE_DEFINED
|
//#ifdef POLYSCOPE_DEFINED
|
||||||
constexpr bool drawFullPatternSimulationResults = false;
|
constexpr bool drawFullPatternSimulationResults = false;
|
||||||
if (drawFullPatternSimulationResults) {
|
auto t1 = std::chrono::high_resolution_clock::now();
|
||||||
optimizationState.fullPatternSimulationJobs[0]->pMesh->registerForDrawing(
|
//#endif
|
||||||
ReducedModelOptimization::Colors::fullInitial);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
results.wasSuccessful = true;
|
results.wasSuccessful = true;
|
||||||
optimizationState.fullPatternResults.resize(totalNumberOfSimulationScenarios);
|
optimizationState.fullPatternResults.resize(totalNumberOfSimulationScenarios);
|
||||||
optimizationState.reducedPatternSimulationJobs.resize(totalNumberOfSimulationScenarios);
|
optimizationState.reducedPatternSimulationJobs.resize(totalNumberOfSimulationScenarios);
|
||||||
|
|
||||||
std::for_each(
|
std::for_each(
|
||||||
|
//#ifndef POLYSCOPE_DEFINED
|
||||||
std::execution::par_unseq,
|
std::execution::par_unseq,
|
||||||
|
//#endif
|
||||||
optimizationState.simulationScenarioIndices.begin(),
|
optimizationState.simulationScenarioIndices.begin(),
|
||||||
optimizationState.simulationScenarioIndices.end(),
|
optimizationState.simulationScenarioIndices.end(),
|
||||||
[&](const int &simulationScenarioIndex) {
|
[&](const int &simulationScenarioIndex) {
|
||||||
// for (int simulationScenarioIndex : optimizationState.simulationScenarioIndices) {
|
|
||||||
const std::shared_ptr<SimulationJob> &pFullPatternSimulationJob
|
const std::shared_ptr<SimulationJob> &pFullPatternSimulationJob
|
||||||
= optimizationState.fullPatternSimulationJobs[simulationScenarioIndex];
|
= optimizationState.fullPatternSimulationJobs[simulationScenarioIndex];
|
||||||
|
// std::cout << "Executing " << pFullPatternSimulationJob->getLabel() << std::endl;
|
||||||
|
|
||||||
std::filesystem::path jobResultsDirectoryPath(
|
std::filesystem::path jobResultsDirectoryPath(
|
||||||
std::filesystem::path(optimizationSettings.intermediateResultsDirectoryPath)
|
std::filesystem::path(optimizationSettings.intermediateResultsDirectoryPath)
|
||||||
|
@ -2050,7 +2116,7 @@ void ReducedModelOptimizer::optimize(
|
||||||
//#else
|
//#else
|
||||||
// constexpr bool recomputeFullPatternResults = true;
|
// constexpr bool recomputeFullPatternResults = true;
|
||||||
//#endif
|
//#endif
|
||||||
SimulationResults fullPatternResults;
|
SimulationResults patternDrmResults;
|
||||||
// if (!recomputeFullPatternResults && std::filesystem::exists(jobResultsDirectoryPath)) {
|
// if (!recomputeFullPatternResults && std::filesystem::exists(jobResultsDirectoryPath)) {
|
||||||
// fullPatternResults
|
// fullPatternResults
|
||||||
// .load(std::filesystem::path(jobResultsDirectoryPath).append("Results"),
|
// .load(std::filesystem::path(jobResultsDirectoryPath).append("Results"),
|
||||||
|
@ -2078,8 +2144,7 @@ void ReducedModelOptimizer::optimize(
|
||||||
|
|
||||||
//#else
|
//#else
|
||||||
DRMSimulationModel simulator;
|
DRMSimulationModel simulator;
|
||||||
fullPatternResults = simulator.executeSimulation(pFullPatternSimulationJob,
|
patternDrmResults = simulator.executeSimulation(pFullPatternSimulationJob, drmSettings);
|
||||||
simulationSettings);
|
|
||||||
// fullPatternResults.save(jobResultsDirectoryPath);
|
// fullPatternResults.save(jobResultsDirectoryPath);
|
||||||
// }
|
// }
|
||||||
//#endif
|
//#endif
|
||||||
|
@ -2090,64 +2155,90 @@ void ReducedModelOptimizer::optimize(
|
||||||
// simulationSettings.maxDRMIterations = 200000;
|
// simulationSettings.maxDRMIterations = 200000;
|
||||||
// fullPatternResults = simulator.executeSimulation(pFullPatternSimulationJob,
|
// fullPatternResults = simulator.executeSimulation(pFullPatternSimulationJob,
|
||||||
// simulationSettings_secondRound);
|
// simulationSettings_secondRound);
|
||||||
#ifdef POLYSCOPE_DEFINED
|
|
||||||
// std::cout << "Simulation job " << pFullPatternSimulationJob->getLabel()
|
|
||||||
// << " used viscous damping." << std::endl;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (!fullPatternResults.converged) {
|
if (!patternDrmResults.converged) {
|
||||||
results.wasSuccessful = false;
|
|
||||||
std::cerr << "Simulation job " << pFullPatternSimulationJob->getLabel()
|
|
||||||
<< " did not converge." << std::endl;
|
|
||||||
#ifdef POLYSCOPE_DEFINED
|
#ifdef POLYSCOPE_DEFINED
|
||||||
// DRMSimulationModel::Settings debugSimulationSettings;
|
|
||||||
// debugSimulationSettings.debugModeStep = 50;
|
|
||||||
// // // debugSimulationSettings.maxDRMIterations = 100000;
|
|
||||||
// debugSimulationSettings.shouldDraw = true;
|
|
||||||
// // debugSimulationSettings.drawingStep = debugSimulationSettings.debugModeStep;
|
|
||||||
// debugSimulationSettings.shouldCreatePlots = true;
|
|
||||||
// // // debugSimulationSettings.Dtini = 0.06;
|
|
||||||
// debugSimulationSettings.beVerbose = true;
|
|
||||||
// debugSimulationSettings.averageResidualForcesCriterionThreshold = 1e-5;
|
|
||||||
// debugSimulationSettings.maxDRMIterations = 100000;
|
|
||||||
// debugSimulationSettings.totalTranslationalKineticEnergyThreshold = 1e-8;
|
|
||||||
// debugSimulationSettings.viscousDampingFactor = 1e-2;
|
|
||||||
// // // debugSimulationSettings.totalExternalForcesNormPercentageTermination = 1e-3;
|
|
||||||
// // // debugSimulationSettings.shouldUseTranslationalKineticEnergyThreshold = true;
|
|
||||||
// auto debugResults = simulator.executeSimulation(pFullPatternSimulationJob,
|
|
||||||
// debugSimulationSettings);
|
|
||||||
// debugResults.setLabelPrefix("debugResults");
|
|
||||||
// debugResults.registerForDrawing();
|
|
||||||
// polyscope::show();
|
|
||||||
// debugResults.unregister();
|
|
||||||
std::filesystem::path outputPath(
|
std::filesystem::path outputPath(
|
||||||
std::filesystem::path("../nonConvergingJobs")
|
std::filesystem::path("../nonConvergingJobs")
|
||||||
.append(m_pFullPatternSimulationMesh->getLabel())
|
.append(m_pFullPatternSimulationMesh->getLabel())
|
||||||
.append("final_" + pFullPatternSimulationJob->getLabel()));
|
.append("final_" + pFullPatternSimulationJob->getLabel()));
|
||||||
std::filesystem::create_directories(outputPath);
|
std::filesystem::create_directories(outputPath);
|
||||||
pFullPatternSimulationJob->save(outputPath);
|
pFullPatternSimulationJob->save(outputPath);
|
||||||
simulationSettings.save(outputPath);
|
// drmSettings_secondTry.save(outputPath);
|
||||||
std::terminate();
|
|
||||||
return;
|
|
||||||
#endif
|
#endif
|
||||||
// }
|
//#ifdef POLYSCOPE_DEFINED
|
||||||
}
|
// SimulationResults fullPatternResults_linear;
|
||||||
#ifdef POLYSCOPE_DEFINED
|
// if (drawFullPatternSimulationResults) {
|
||||||
if (drawFullPatternSimulationResults) {
|
// LinearSimulationModel linearSimulator;
|
||||||
// SimulationResults fullPatternResults_linear = linearSimulator.executeSimulation(
|
// fullPatternResults_linear = linearSimulator.executeSimulation(
|
||||||
// pFullPatternSimulationJob);
|
// pFullPatternSimulationJob);
|
||||||
fullPatternResults.registerForDrawing(ReducedModelOptimization::Colors::fullDeformed,
|
|
||||||
true);
|
|
||||||
// fullPatternResults_linear.labelPrefix += "_linear";
|
// fullPatternResults_linear.labelPrefix += "_linear";
|
||||||
// fullPatternResults_linear.registerForDrawing(ReducedModelOptimization::Colors::fullDeformed,
|
// fullPatternResults_linear.registerForDrawing(std::array<double, 3>{0, 0, 255},
|
||||||
// true,
|
|
||||||
// true);
|
// true);
|
||||||
|
// std::cout << pFullPatternSimulationJob->getLabel()
|
||||||
|
// << " did not converge on the first try. Trying again.." << std::endl;
|
||||||
|
// }
|
||||||
|
//#endif
|
||||||
|
DRMSimulationModel::Settings drmSettings_secondTry = drmSettings;
|
||||||
|
// drmSettings_secondTry.shouldDraw = true;
|
||||||
|
// drmSettings_secondTry.debugModeStep = 20000;
|
||||||
|
// drmSettings_secondTry.shouldCreatePlots = true;
|
||||||
|
// drmSettings_secondTry.beVerbose = true;
|
||||||
|
drmSettings_secondTry.linearGuessForceScaleFactor = 1;
|
||||||
|
drmSettings_secondTry.viscousDampingFactor = 4e-8;
|
||||||
|
*drmSettings_secondTry.maxDRMIterations *= 5;
|
||||||
|
drmSettings_secondTry.useTotalRotationalKineticEnergyForKineticDamping = true;
|
||||||
|
// drmSettings.totalTranslationalKineticEnergyThreshold = std::nullopt;
|
||||||
|
// drmSettings.totalExternalForcesNormPercentageTermination = 1e-3;
|
||||||
|
drmSettings.totalTranslationalKineticEnergyThreshold = 1e-10;
|
||||||
|
// drmSettings_secondTry.gamma = 2;
|
||||||
|
// drmSettings_secondTry.xi = 0.98;
|
||||||
|
SimulationResults drmResults_secondTry
|
||||||
|
= simulator.executeSimulation(pFullPatternSimulationJob, drmSettings_secondTry);
|
||||||
|
|
||||||
|
if (drmResults_secondTry.converged) {
|
||||||
|
#ifdef POLYSCOPE_DEFINED
|
||||||
|
std::cout << "Simulation job " << pFullPatternSimulationJob->getLabel()
|
||||||
|
<< " converged after a second try." << std::endl;
|
||||||
|
#endif
|
||||||
|
patternDrmResults = drmResults_secondTry;
|
||||||
|
} else {
|
||||||
|
results.wasSuccessful = false;
|
||||||
|
std::cerr << "Simulation job " << pFullPatternSimulationJob->getLabel()
|
||||||
|
<< " of pattern " << pFullPatternSimulationJob->pMesh->getLabel()
|
||||||
|
<< " did not converge." << std::endl;
|
||||||
|
#ifdef POLYSCOPE_DEFINED
|
||||||
|
std::filesystem::path outputPath(
|
||||||
|
std::filesystem::path("../nonConvergingJobs")
|
||||||
|
.append(m_pFullPatternSimulationMesh->getLabel())
|
||||||
|
.append("final_" + pFullPatternSimulationJob->getLabel()));
|
||||||
|
std::filesystem::create_directories(outputPath);
|
||||||
|
pFullPatternSimulationJob->save(outputPath);
|
||||||
|
drmSettings_secondTry.save(outputPath);
|
||||||
|
|
||||||
|
if (drawFullPatternSimulationResults) {
|
||||||
|
optimizationState.fullPatternSimulationJobs[0]->pMesh->registerForDrawing(
|
||||||
|
ReducedModelOptimization::Colors::fullInitial);
|
||||||
|
pFullPatternSimulationJob->registerForDrawing(
|
||||||
|
optimizationState.fullPatternSimulationJobs[0]->pMesh->getLabel(), true);
|
||||||
|
patternDrmResults.registerForDrawing(std::array<double, 3>{0, 255, 0}, true);
|
||||||
|
// SimulationResults fullPatternResults_linear
|
||||||
|
// = linearSimulator.executeSimulation(pFullPatternSimulationJob);
|
||||||
|
// patternDrmResults.registerForDrawing(std::array<double, 3>{0, 255, 0}, true);
|
||||||
|
// fullPatternResults_linear.labelPrefix += "_linear";
|
||||||
|
// fullPatternResults_linear
|
||||||
|
// .registerForDrawing(std::array<double, 3>{0, 0, 255}, true);
|
||||||
polyscope::show();
|
polyscope::show();
|
||||||
fullPatternResults.unregister();
|
patternDrmResults.unregister();
|
||||||
// fullPatternResults_linear.unregister();
|
// fullPatternResults_linear.unregister();
|
||||||
|
optimizationState.fullPatternSimulationJobs[0]->pMesh->unregister();
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
optimizationState.fullPatternResults[simulationScenarioIndex] = fullPatternResults;
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
optimizationState.fullPatternResults[simulationScenarioIndex] = patternDrmResults;
|
||||||
SimulationJob reducedPatternSimulationJob;
|
SimulationJob reducedPatternSimulationJob;
|
||||||
reducedPatternSimulationJob.pMesh = m_pReducedPatternSimulationMesh;
|
reducedPatternSimulationJob.pMesh = m_pReducedPatternSimulationMesh;
|
||||||
computeReducedModelSimulationJob(*pFullPatternSimulationJob,
|
computeReducedModelSimulationJob(*pFullPatternSimulationJob,
|
||||||
|
@ -2156,12 +2247,41 @@ void ReducedModelOptimizer::optimize(
|
||||||
optimizationState.reducedPatternSimulationJobs[simulationScenarioIndex]
|
optimizationState.reducedPatternSimulationJobs[simulationScenarioIndex]
|
||||||
= std::make_shared<SimulationJob>(reducedPatternSimulationJob);
|
= std::make_shared<SimulationJob>(reducedPatternSimulationJob);
|
||||||
// std::cout << "Ran sim scenario:" << simulationScenarioIndex << std::endl;
|
// std::cout << "Ran sim scenario:" << simulationScenarioIndex << std::endl;
|
||||||
|
#ifdef POLYSCOPE_DEFINED
|
||||||
|
if (drawFullPatternSimulationResults) {
|
||||||
|
optimizationState.fullPatternSimulationJobs[0]->pMesh->registerForDrawing(
|
||||||
|
ReducedModelOptimization::Colors::fullInitial);
|
||||||
|
pFullPatternSimulationJob->registerForDrawing(optimizationState
|
||||||
|
.fullPatternSimulationJobs[0]
|
||||||
|
->pMesh->getLabel(),
|
||||||
|
true);
|
||||||
|
patternDrmResults.registerForDrawing(std::array<double, 3>{0, 255, 0}, true);
|
||||||
|
// SimulationResults fullPatternResults_linear
|
||||||
|
// = linearSimulator.executeSimulation(pFullPatternSimulationJob);
|
||||||
|
// patternDrmResults.registerForDrawing(std::array<double, 3>{0, 255, 0}, true);
|
||||||
|
// fullPatternResults_linear.labelPrefix += "_linear";
|
||||||
|
// fullPatternResults_linear
|
||||||
|
// .registerForDrawing(std::array<double, 3>{0, 0, 255}, true);
|
||||||
|
polyscope::show();
|
||||||
|
patternDrmResults.unregister();
|
||||||
|
// fullPatternResults_linear.unregister();
|
||||||
|
optimizationState.fullPatternSimulationJobs[0]->pMesh->unregister();
|
||||||
|
}
|
||||||
|
#endif
|
||||||
});
|
});
|
||||||
|
|
||||||
|
auto t2 = std::chrono::high_resolution_clock::now();
|
||||||
|
auto s_int = std::chrono::duration_cast<std::chrono::seconds>(t2 - t1);
|
||||||
|
std::cout << s_int.count() << std::endl;
|
||||||
|
results.wasSuccessful = false;
|
||||||
|
return;
|
||||||
#ifdef POLYSCOPE_DEFINED
|
#ifdef POLYSCOPE_DEFINED
|
||||||
|
std::cout << "Computed ground of truth pattern results in:" << s_int.count() << " seconds."
|
||||||
|
<< std::endl;
|
||||||
if (drawFullPatternSimulationResults) {
|
if (drawFullPatternSimulationResults) {
|
||||||
optimizationState.fullPatternSimulationJobs[0]->pMesh->unregister();
|
optimizationState.fullPatternSimulationJobs[0]->pMesh->unregister();
|
||||||
}
|
}
|
||||||
|
optimizationState.reducedPatternSimulationJobs[0]->pMesh->updateEigenEdgeAndVertices();
|
||||||
#endif
|
#endif
|
||||||
// if (optimizationState.optimizationSettings.normalizationStrategy
|
// if (optimizationState.optimizationSettings.normalizationStrategy
|
||||||
// == Settings::NormalizationStrategy::Epsilon) {
|
// == Settings::NormalizationStrategy::Epsilon) {
|
||||||
|
@ -2171,5 +2291,4 @@ void ReducedModelOptimizer::optimize(
|
||||||
std::cout << "Running reduced model optimization" << std::endl;
|
std::cout << "Running reduced model optimization" << std::endl;
|
||||||
#endif
|
#endif
|
||||||
runOptimization(optimizationSettings, results);
|
runOptimization(optimizationSettings, results);
|
||||||
results.notes = optimizationNotes;
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -117,7 +117,7 @@ public:
|
||||||
inline static std::array<std::string, ReducedModelOptimization::NumberOfOptimizationVariables>
|
inline static std::array<std::string, ReducedModelOptimization::NumberOfOptimizationVariables>
|
||||||
parameterLabels = {"E", "A", "I2", "I3", "J", "Theta", "R"};
|
parameterLabels = {"E", "A", "I2", "I3", "J", "Theta", "R"};
|
||||||
constexpr static std::array<double, ReducedModelOptimization::NumberOfBaseSimulationScenarios>
|
constexpr static std::array<double, ReducedModelOptimization::NumberOfBaseSimulationScenarios>
|
||||||
simulationScenariosResolution = {11, 11, 21, 21, 21, 21};
|
simulationScenariosResolution = {12, 12, 22, 22, 22, 22};
|
||||||
constexpr static std::array<double, ReducedModelOptimization::NumberOfBaseSimulationScenarios>
|
constexpr static std::array<double, ReducedModelOptimization::NumberOfBaseSimulationScenarios>
|
||||||
baseScenarioWeights = {1, 1, 2, 3, 2};
|
baseScenarioWeights = {1, 1, 2, 3, 2};
|
||||||
inline static int totalNumberOfSimulationScenarios
|
inline static int totalNumberOfSimulationScenarios
|
||||||
|
@ -150,7 +150,7 @@ public:
|
||||||
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,
|
||||||
PatternGeometry &fullPattern,
|
PatternGeometry &fullPattern,
|
||||||
PatternGeometry &reducedPattern,
|
ReducedModel &reducedPattern,
|
||||||
std::unordered_map<ReducedPatternVertexIndex, FullPatternVertexIndex>
|
std::unordered_map<ReducedPatternVertexIndex, FullPatternVertexIndex>
|
||||||
&reducedToFullInterfaceViMap,
|
&reducedToFullInterfaceViMap,
|
||||||
std::unordered_map<FullPatternVertexIndex, ReducedPatternVertexIndex>
|
std::unordered_map<FullPatternVertexIndex, ReducedPatternVertexIndex>
|
||||||
|
@ -263,7 +263,7 @@ public:
|
||||||
|
|
||||||
ReducedModelOptimization::Results optimize(
|
ReducedModelOptimization::Results optimize(
|
||||||
ConstPatternGeometry &fullPattern,
|
ConstPatternGeometry &fullPattern,
|
||||||
const ReducedModelOptimization::Settings &optimizatifullyonSettings);
|
const ReducedModelOptimization::Settings &optimizationSettings);
|
||||||
|
|
||||||
void optimize(ConstPatternGeometry &fullPattern,
|
void optimize(ConstPatternGeometry &fullPattern,
|
||||||
ReducedModelOptimization::Settings &optimizationSettings,
|
ReducedModelOptimization::Settings &optimizationSettings,
|
||||||
|
@ -285,7 +285,7 @@ private:
|
||||||
ReducedModelOptimization::S}));
|
ReducedModelOptimization::S}));
|
||||||
|
|
||||||
void initializePatterns(PatternGeometry &fullPattern,
|
void initializePatterns(PatternGeometry &fullPattern,
|
||||||
PatternGeometry &reducedPattern,
|
ReducedModel &reducedPattern,
|
||||||
const std::array<ReducedModelOptimization::xRange,
|
const std::array<ReducedModelOptimization::xRange,
|
||||||
ReducedModelOptimization::NumberOfOptimizationVariables>
|
ReducedModelOptimization::NumberOfOptimizationVariables>
|
||||||
&optimizationParameters);
|
&optimizationParameters);
|
||||||
|
@ -295,7 +295,7 @@ private:
|
||||||
Eigen::MatrixX3d &optimalDisplacementsOfReducedModel);
|
Eigen::MatrixX3d &optimalDisplacementsOfReducedModel);
|
||||||
void runOptimization(const ReducedModelOptimization::Settings &settings,
|
void runOptimization(const ReducedModelOptimization::Settings &settings,
|
||||||
ReducedModelOptimization::Results &results);
|
ReducedModelOptimization::Results &results);
|
||||||
void computeMaps(PatternGeometry &fullModel, PatternGeometry &reducedPattern);
|
void computeMaps(PatternGeometry &fullModel, ReducedModel &reducedModel);
|
||||||
void createSimulationMeshes(PatternGeometry &fullModel, PatternGeometry &reducedModel);
|
void createSimulationMeshes(PatternGeometry &fullModel, PatternGeometry &reducedModel);
|
||||||
void initializeOptimizationParameters(
|
void initializeOptimizationParameters(
|
||||||
const std::shared_ptr<SimulationMesh> &mesh,
|
const std::shared_ptr<SimulationMesh> &mesh,
|
||||||
|
|
Loading…
Reference in New Issue