Refactoring. Added kinetic energy as a convergence criterion for the full pattern simulations
This commit is contained in:
parent
19d9fe434a
commit
f949c2d793
19
src/main.cpp
19
src/main.cpp
|
@ -114,21 +114,9 @@ int main(int argc, char *argv[]) {
|
||||||
auto elapsed = std::chrono::duration_cast<std::chrono::milliseconds>(end - start);
|
auto elapsed = std::chrono::duration_cast<std::chrono::milliseconds>(end - start);
|
||||||
optimizationResults.time = elapsed.count() / 1000.0;
|
optimizationResults.time = elapsed.count() / 1000.0;
|
||||||
|
|
||||||
// Export results
|
|
||||||
if (!optimizationResults.wasSuccessful) {
|
|
||||||
resultsOutputDir = crashedJobsDirPath.string();
|
|
||||||
} else {
|
|
||||||
resultsOutputDir = convergedJobsDirPath.string();
|
|
||||||
}
|
|
||||||
optimizationResults.save(resultsOutputDir, true);
|
|
||||||
|
|
||||||
// Write results in csv
|
|
||||||
csvFile csv_results({}, false);
|
|
||||||
// csvFile csv_results(std::filesystem::path(dirPath_thisOptimization)
|
|
||||||
// .append("results.csv")
|
|
||||||
// .string(),
|
|
||||||
// false);
|
|
||||||
if (optimizationResults.wasSuccessful) {
|
if (optimizationResults.wasSuccessful) {
|
||||||
|
resultsOutputDir = convergedJobsDirPath.string();
|
||||||
|
csvFile csv_results({}, false);
|
||||||
csv_results << "Name";
|
csv_results << "Name";
|
||||||
optimizationResults.writeHeaderTo(csv_results);
|
optimizationResults.writeHeaderTo(csv_results);
|
||||||
settings_optimization.writeHeaderTo(csv_results);
|
settings_optimization.writeHeaderTo(csv_results);
|
||||||
|
@ -137,7 +125,10 @@ int main(int argc, char *argv[]) {
|
||||||
optimizationResults.writeResultsTo(settings_optimization, csv_results);
|
optimizationResults.writeResultsTo(settings_optimization, csv_results);
|
||||||
settings_optimization.writeSettingsTo(csv_results);
|
settings_optimization.writeSettingsTo(csv_results);
|
||||||
csv_results << endrow;
|
csv_results << endrow;
|
||||||
|
} else {
|
||||||
|
resultsOutputDir = crashedJobsDirPath.string();
|
||||||
}
|
}
|
||||||
|
optimizationResults.save(resultsOutputDir, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
//#ifdef POLYSCOPE_DEFINED
|
//#ifdef POLYSCOPE_DEFINED
|
||||||
|
|
|
@ -4,6 +4,7 @@
|
||||||
#include "trianglepatterngeometry.hpp"
|
#include "trianglepatterngeometry.hpp"
|
||||||
#include "trianglepattterntopology.hpp"
|
#include "trianglepattterntopology.hpp"
|
||||||
#include <chrono>
|
#include <chrono>
|
||||||
|
#include <functional>
|
||||||
|
|
||||||
using namespace ReducedPatternOptimization;
|
using namespace ReducedPatternOptimization;
|
||||||
|
|
||||||
|
@ -459,8 +460,8 @@ void ReducedModelOptimizer::initializePatterns(PatternGeometry &fullPattern,
|
||||||
PatternGeometry &reducedPattern,
|
PatternGeometry &reducedPattern,
|
||||||
const int &optimizationParameters)
|
const int &optimizationParameters)
|
||||||
{
|
{
|
||||||
assert(fullPattern.VN() == reducedPattern.VN() &&
|
assert(fullPattern.VN() == reducedPattern.VN() && fullPattern.EN() >= reducedPattern.EN());
|
||||||
fullPattern.EN() >= reducedPattern.EN());
|
fullPatternNumberOfEdges = fullPattern.EN();
|
||||||
#if POLYSCOPE_DEFINED
|
#if POLYSCOPE_DEFINED
|
||||||
polyscope::removeAllStructures();
|
polyscope::removeAllStructures();
|
||||||
#endif
|
#endif
|
||||||
|
@ -873,6 +874,7 @@ ReducedModelOptimizer::getFullPatternMaxSimulationForces(
|
||||||
const std::vector<BaseSimulationScenario> &desiredBaseSimulationScenarioIndices)
|
const std::vector<BaseSimulationScenario> &desiredBaseSimulationScenarioIndices)
|
||||||
{
|
{
|
||||||
std::vector<std::pair<BaseSimulationScenario, double>> fullPatternSimulationScenarioMaxMagnitudes;
|
std::vector<std::pair<BaseSimulationScenario, double>> fullPatternSimulationScenarioMaxMagnitudes;
|
||||||
|
#ifdef POLYSCOPE_DEFINED
|
||||||
const std::filesystem::path forceMagnitudesDirectoryPath(std::filesystem::current_path()
|
const std::filesystem::path forceMagnitudesDirectoryPath(std::filesystem::current_path()
|
||||||
.parent_path()
|
.parent_path()
|
||||||
.append("IntermediateResults")
|
.append("IntermediateResults")
|
||||||
|
@ -890,8 +892,11 @@ ReducedModelOptimizer::getFullPatternMaxSimulationForces(
|
||||||
= static_cast<std::vector<std::pair<BaseSimulationScenario, double>>>(
|
= static_cast<std::vector<std::pair<BaseSimulationScenario, double>>>(
|
||||||
json.at("maxMagn"));
|
json.at("maxMagn"));
|
||||||
} else {
|
} else {
|
||||||
|
#endif
|
||||||
fullPatternSimulationScenarioMaxMagnitudes = computeFullPatternMaxSimulationForces(
|
fullPatternSimulationScenarioMaxMagnitudes = computeFullPatternMaxSimulationForces(
|
||||||
desiredBaseSimulationScenarioIndices);
|
desiredBaseSimulationScenarioIndices);
|
||||||
|
|
||||||
|
#ifdef POLYSCOPE_DEFINED
|
||||||
nlohmann::json json;
|
nlohmann::json json;
|
||||||
json["maxMagn"] = fullPatternSimulationScenarioMaxMagnitudes;
|
json["maxMagn"] = fullPatternSimulationScenarioMaxMagnitudes;
|
||||||
|
|
||||||
|
@ -899,6 +904,7 @@ ReducedModelOptimizer::getFullPatternMaxSimulationForces(
|
||||||
std::ofstream jsonFile(patternMaxForceMagnitudesFilePath.string());
|
std::ofstream jsonFile(patternMaxForceMagnitudesFilePath.string());
|
||||||
jsonFile << json;
|
jsonFile << json;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
assert(fullPatternSimulationScenarioMaxMagnitudes.size()
|
assert(fullPatternSimulationScenarioMaxMagnitudes.size()
|
||||||
== desiredBaseSimulationScenarioIndices.size());
|
== desiredBaseSimulationScenarioIndices.size());
|
||||||
|
|
||||||
|
@ -1069,10 +1075,10 @@ double fullPatternMaxSimulationForceRotationalObjective(const double &forceMagni
|
||||||
DRMSimulationModel simulator;
|
DRMSimulationModel simulator;
|
||||||
DRMSimulationModel::Settings settings;
|
DRMSimulationModel::Settings settings;
|
||||||
settings.totalExternalForcesNormPercentageTermination = 1e-2;
|
settings.totalExternalForcesNormPercentageTermination = 1e-2;
|
||||||
settings.totalTranslationalKineticEnergyThreshold = 1e-11;
|
settings.totalTranslationalKineticEnergyThreshold = 1e-9;
|
||||||
settings.shouldUseTranslationalKineticEnergyThreshold = true;
|
settings.shouldUseTranslationalKineticEnergyThreshold = true;
|
||||||
// settings.shouldDraw = true;
|
// settings.shouldDraw = true;
|
||||||
settings.useAverage = true;
|
// settings.useAverage = true;
|
||||||
|
|
||||||
// settings.isDebugMode = true;
|
// settings.isDebugMode = true;
|
||||||
// settings.drawingStep = 500;
|
// settings.drawingStep = 500;
|
||||||
|
@ -1084,17 +1090,31 @@ double fullPatternMaxSimulationForceRotationalObjective(const double &forceMagni
|
||||||
settings);
|
settings);
|
||||||
const double &desiredRotationAngle = global.desiredMaxRotationAngle;
|
const double &desiredRotationAngle = global.desiredMaxRotationAngle;
|
||||||
double error;
|
double error;
|
||||||
|
#ifdef POLYSCOPE_DEFINED
|
||||||
if (!results.converged) {
|
if (!results.converged) {
|
||||||
|
// std::cout << "Force used:" << forceMagnitude << std::endl;
|
||||||
error = std::numeric_limits<double>::max();
|
error = std::numeric_limits<double>::max();
|
||||||
|
// DRMSimulationModel::Settings debugSimulationSettings;
|
||||||
|
// debugSimulationSettings.isDebugMode = true;
|
||||||
|
// debugSimulationSettings.debugModeStep = 1000;
|
||||||
|
// // debugSimulationSettings.maxDRMIterations = 100000;
|
||||||
|
// debugSimulationSettings.shouldDraw = true;
|
||||||
|
// debugSimulationSettings.drawingStep = debugSimulationSettings.debugModeStep;
|
||||||
|
// debugSimulationSettings.shouldCreatePlots = true;
|
||||||
|
// // debugSimulationSettings.Dtini = 0.06;
|
||||||
|
// debugSimulationSettings.beVerbose = true;
|
||||||
|
// debugSimulationSettings.useAverage = true;
|
||||||
|
// // debugSimulationSettings.totalExternalForcesNormPercentageTermination = 1e-3;
|
||||||
|
// debugSimulationSettings.shouldUseTranslationalKineticEnergyThreshold = true;
|
||||||
|
// auto debugResults = simulator.executeSimulation(std::make_shared<SimulationJob>(job),
|
||||||
|
// debugSimulationSettings);
|
||||||
} else {
|
} else {
|
||||||
error = std::abs(
|
error = std::abs(
|
||||||
// results.displacements[global.fullPatternInterfaceViPairs[1].first].getTranslation().norm()
|
|
||||||
results.rotationalDisplacementQuaternion[global.interfaceViForComputingScenarioError]
|
results.rotationalDisplacementQuaternion[global.interfaceViForComputingScenarioError]
|
||||||
.angularDistance(Eigen::Quaterniond::Identity())
|
.angularDistance(Eigen::Quaterniond::Identity())
|
||||||
- desiredRotationAngle);
|
- desiredRotationAngle);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef POLYSCOPE_DEFINED
|
|
||||||
std::cout << "Force:" << forceMagnitude << " Error is:" << vcg::math::ToDeg(error) << std::endl;
|
std::cout << "Force:" << forceMagnitude << " Error is:" << vcg::math::ToDeg(error) << std::endl;
|
||||||
#endif
|
#endif
|
||||||
return error;
|
return error;
|
||||||
|
@ -1113,23 +1133,17 @@ double fullPatternMaxSimulationForceTranslationalObjective(const double &forceMa
|
||||||
DRMSimulationModel::Settings settings;
|
DRMSimulationModel::Settings settings;
|
||||||
// settings.totalResidualForcesNormThreshold = 1e-3;
|
// settings.totalResidualForcesNormThreshold = 1e-3;
|
||||||
settings.totalExternalForcesNormPercentageTermination = 1e-2;
|
settings.totalExternalForcesNormPercentageTermination = 1e-2;
|
||||||
settings.totalTranslationalKineticEnergyThreshold = 1e-10;
|
settings.totalTranslationalKineticEnergyThreshold = 1e-9;
|
||||||
settings.shouldUseTranslationalKineticEnergyThreshold = true;
|
settings.shouldUseTranslationalKineticEnergyThreshold = true;
|
||||||
// settings.totalTranslationalKineticEnergyThreshold = 1e-10;
|
// settings.useAverage = true;
|
||||||
|
// settings.totalTranslationalKineticEnergyThreshold = 1e-10;
|
||||||
// settings.shouldUseTranslationalKineticEnergyThreshold = true;
|
// settings.shouldUseTranslationalKineticEnergyThreshold = true;
|
||||||
// settings.shouldDraw = true;
|
// settings.shouldDraw = true;
|
||||||
// settings.isDebugMode = true;
|
// settings.isDebugMode = true;
|
||||||
// settings.drawingStep = 200000;
|
// settings.drawingStep = 200000;
|
||||||
// settings.beVerbose = true;
|
// settings.beVerbose = true;
|
||||||
// settings.debugModeStep = 200000;
|
// settings.debugModeStep = 200000;
|
||||||
settings.maxDRMIterations = 250000;
|
settings.maxDRMIterations = 100000;
|
||||||
#ifdef POLYSCOPE_DEFINED
|
|
||||||
// settings.shouldDraw = true;
|
|
||||||
// settings.isDebugMode = true;
|
|
||||||
// settings.drawingStep = 100000;
|
|
||||||
// settings.debugModeStep = 10000;
|
|
||||||
// settings.shouldCreatePlots = true;
|
|
||||||
#endif
|
|
||||||
SimulationResults results = simulator.executeSimulation(std::make_shared<SimulationJob>(job),
|
SimulationResults results = simulator.executeSimulation(std::make_shared<SimulationJob>(job),
|
||||||
settings);
|
settings);
|
||||||
const double &desiredDisplacementValue = global.desiredMaxDisplacementValue;
|
const double &desiredDisplacementValue = global.desiredMaxDisplacementValue;
|
||||||
|
@ -1138,7 +1152,6 @@ double fullPatternMaxSimulationForceTranslationalObjective(const double &forceMa
|
||||||
error = std::numeric_limits<double>::max();
|
error = std::numeric_limits<double>::max();
|
||||||
} else {
|
} else {
|
||||||
error = std::abs(
|
error = std::abs(
|
||||||
// results.displacements[global.fullPatternInterfaceViPairs[1].first].getTranslation().norm()
|
|
||||||
results.displacements[global.interfaceViForComputingScenarioError].getTranslation().norm()
|
results.displacements[global.interfaceViForComputingScenarioError].getTranslation().norm()
|
||||||
- desiredDisplacementValue);
|
- desiredDisplacementValue);
|
||||||
}
|
}
|
||||||
|
@ -1154,114 +1167,68 @@ double ReducedModelOptimizer::computeFullPatternMaxSimulationForce(
|
||||||
const BaseSimulationScenario &scenario)
|
const BaseSimulationScenario &scenario)
|
||||||
{
|
{
|
||||||
double forceMagnitude = 1;
|
double forceMagnitude = 1;
|
||||||
const double forceMagnitudeEpsilon = 1e-2;
|
|
||||||
double minimumError;
|
double minimumError;
|
||||||
double translationalOptimizationEpsilon;
|
double translationalOptimizationEpsilon;
|
||||||
dlib::function_evaluation result;
|
|
||||||
bool wasSuccessful = false;
|
bool wasSuccessful = false;
|
||||||
global.constructScenarioFunction = constructBaseScenarioFunctions[scenario];
|
global.constructScenarioFunction = constructBaseScenarioFunctions[scenario];
|
||||||
|
const double baseTriangleHeight = vcg::Distance(global.baseTriangle.cP(0),
|
||||||
|
(global.baseTriangle.cP(1)
|
||||||
|
+ global.baseTriangle.cP(2))
|
||||||
|
/ 2);
|
||||||
|
std::function<double(const double &)> objectiveFunction;
|
||||||
|
double objectiveEpsilon = translationalOptimizationEpsilon;
|
||||||
|
objectiveFunction = &fullPatternMaxSimulationForceTranslationalObjective;
|
||||||
|
global.interfaceViForComputingScenarioError = global.fullPatternInterfaceViPairs[1].first;
|
||||||
|
global.desiredMaxDisplacementValue = 0.1 * baseTriangleHeight;
|
||||||
|
double forceMagnitudeEpsilon = 1e-4;
|
||||||
|
|
||||||
switch (scenario) {
|
switch (scenario) {
|
||||||
case Axial:
|
case Axial:
|
||||||
global.desiredMaxDisplacementValue = 0.03
|
global.desiredMaxDisplacementValue = 0.03 * baseTriangleHeight;
|
||||||
* vcg::Distance(global.baseTriangle.cP(0),
|
|
||||||
(global.baseTriangle.cP(1)
|
|
||||||
+ global.baseTriangle.cP(2))
|
|
||||||
/ 2);
|
|
||||||
global.constructScenarioFunction = &ReducedModelOptimizer::constructAxialSimulationScenario;
|
|
||||||
global.interfaceViForComputingScenarioError = global.fullPatternInterfaceViPairs[1].first;
|
|
||||||
minimumError
|
|
||||||
= dlib::find_min_single_variable(&fullPatternMaxSimulationForceTranslationalObjective,
|
|
||||||
forceMagnitude,
|
|
||||||
1e-2,
|
|
||||||
1e2,
|
|
||||||
forceMagnitudeEpsilon);
|
|
||||||
translationalOptimizationEpsilon = 1e-2 * global.desiredMaxDisplacementValue;
|
|
||||||
wasSuccessful = minimumError < translationalOptimizationEpsilon;
|
|
||||||
break;
|
break;
|
||||||
case Shear:
|
case Shear:
|
||||||
global.desiredMaxDisplacementValue = 0.04
|
global.desiredMaxDisplacementValue = 0.04 * baseTriangleHeight;
|
||||||
* vcg::Distance(global.baseTriangle.cP(0),
|
|
||||||
(global.baseTriangle.cP(1)
|
|
||||||
+ global.baseTriangle.cP(2))
|
|
||||||
/ 2);
|
|
||||||
global.constructScenarioFunction = &ReducedModelOptimizer::constructShearSimulationScenario;
|
|
||||||
global.interfaceViForComputingScenarioError = global.fullPatternInterfaceViPairs[1].first;
|
|
||||||
minimumError
|
|
||||||
= dlib::find_min_single_variable(&fullPatternMaxSimulationForceTranslationalObjective,
|
|
||||||
forceMagnitude,
|
|
||||||
1e-2,
|
|
||||||
1e2,
|
|
||||||
forceMagnitudeEpsilon);
|
|
||||||
translationalOptimizationEpsilon = 1e-2 * global.desiredMaxDisplacementValue;
|
|
||||||
wasSuccessful = minimumError < translationalOptimizationEpsilon;
|
|
||||||
break;
|
break;
|
||||||
case Bending:
|
case Bending:
|
||||||
global.desiredMaxDisplacementValue = 0.1
|
|
||||||
* vcg::Distance(global.baseTriangle.cP(0),
|
|
||||||
(global.baseTriangle.cP(1)
|
|
||||||
+ global.baseTriangle.cP(2))
|
|
||||||
/ 2);
|
|
||||||
|
|
||||||
global.interfaceViForComputingScenarioError = global.fullPatternInterfaceViPairs[0].first;
|
global.interfaceViForComputingScenarioError = global.fullPatternInterfaceViPairs[0].first;
|
||||||
minimumError
|
|
||||||
= dlib::find_min_single_variable(&fullPatternMaxSimulationForceTranslationalObjective,
|
|
||||||
forceMagnitude,
|
|
||||||
1e-2,
|
|
||||||
1e2,
|
|
||||||
forceMagnitudeEpsilon);
|
|
||||||
translationalOptimizationEpsilon = 1e-2 * global.desiredMaxDisplacementValue;
|
|
||||||
wasSuccessful = minimumError < translationalOptimizationEpsilon;
|
|
||||||
break;
|
break;
|
||||||
case Dome:
|
case Dome:
|
||||||
forceMagnitude = 0.005;
|
global.desiredMaxRotationAngle = vcg::math::ToRad(35.0);
|
||||||
while (!wasSuccessful) {
|
objectiveFunction = &fullPatternMaxSimulationForceRotationalObjective;
|
||||||
global.desiredMaxRotationAngle = vcg::math::ToRad(35.0);
|
forceMagnitudeEpsilon *= 1e-2;
|
||||||
global.interfaceViForComputingScenarioError = global.fullPatternInterfaceViPairs[1].first;
|
objectiveEpsilon = vcg::math::ToRad(3.0);
|
||||||
minimumError
|
|
||||||
= dlib::find_min_single_variable(&fullPatternMaxSimulationForceRotationalObjective,
|
|
||||||
forceMagnitude,
|
|
||||||
1e-3,
|
|
||||||
0.5,
|
|
||||||
forceMagnitudeEpsilon);
|
|
||||||
wasSuccessful = minimumError < vcg::math::ToRad(3.0);
|
|
||||||
}
|
|
||||||
// result = dlib::find_min_global(&fullPatternMaxSimulationForceRotationalObjective,
|
|
||||||
// 1e-2,
|
|
||||||
// 1,
|
|
||||||
// dlib::max_function_calls(50));
|
|
||||||
// wasSuccessful = result.y < vcg::math::ToRad(3.0);
|
|
||||||
break;
|
break;
|
||||||
case Saddle:
|
case Saddle:
|
||||||
global.desiredMaxDisplacementValue = 0.1
|
|
||||||
* vcg::Distance(global.baseTriangle.cP(0),
|
|
||||||
(global.baseTriangle.cP(1)
|
|
||||||
+ global.baseTriangle.cP(2))
|
|
||||||
/ 2);
|
|
||||||
|
|
||||||
global.interfaceViForComputingScenarioError = global.fullPatternInterfaceViPairs[0].first;
|
global.interfaceViForComputingScenarioError = global.fullPatternInterfaceViPairs[0].first;
|
||||||
minimumError
|
|
||||||
= dlib::find_min_single_variable(&fullPatternMaxSimulationForceTranslationalObjective,
|
|
||||||
forceMagnitude,
|
|
||||||
1e-2,
|
|
||||||
1e2,
|
|
||||||
forceMagnitudeEpsilon);
|
|
||||||
translationalOptimizationEpsilon = 1e-2 * global.desiredMaxDisplacementValue;
|
|
||||||
wasSuccessful = minimumError < translationalOptimizationEpsilon;
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
minimumError = dlib::find_min_single_variable(objectiveFunction,
|
||||||
|
forceMagnitude,
|
||||||
|
1e-4,
|
||||||
|
1e4,
|
||||||
|
forceMagnitudeEpsilon,
|
||||||
|
1000);
|
||||||
|
wasSuccessful = minimumError < objectiveEpsilon;
|
||||||
|
|
||||||
#ifdef POLYSCOPE_DEFINED
|
#ifdef POLYSCOPE_DEFINED
|
||||||
std::cout << "Max " << ReducedPatternOptimization::baseSimulationScenarioNames[scenario]
|
std::cout << "Max " << ReducedPatternOptimization::baseSimulationScenarioNames[scenario]
|
||||||
<< " magnitude:" << forceMagnitude << std::endl;
|
<< " magnitude:" << forceMagnitude << std::endl;
|
||||||
if (!wasSuccessful)
|
|
||||||
std::cout << "Was not successfull" << std::endl;
|
|
||||||
#endif
|
|
||||||
if (!wasSuccessful) {
|
if (!wasSuccessful) {
|
||||||
const std::string debugMessage
|
SimulationJob job;
|
||||||
= ReducedPatternOptimization::baseSimulationScenarioNames[scenario]
|
job.pMesh = global.pFullPatternSimulationMesh;
|
||||||
+ " max scenario magnitude was not succefully determined.";
|
global.constructScenarioFunction(forceMagnitude, global.fullPatternInterfaceViPairs, job);
|
||||||
optimizationNotes.append(debugMessage);
|
std::cout << ReducedPatternOptimization::baseSimulationScenarioNames[scenario]
|
||||||
|
+ " max scenario magnitude was not succefully determined."
|
||||||
|
<< std::endl;
|
||||||
|
std::filesystem::path outputPath(
|
||||||
|
std::filesystem::path("../nonConvergingJobs")
|
||||||
|
.append(m_pFullPatternSimulationMesh->getLabel())
|
||||||
|
.append("mag_" + ReducedPatternOptimization::baseSimulationScenarioNames[scenario]));
|
||||||
|
std::filesystem::create_directories(outputPath);
|
||||||
|
job.save(outputPath);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
return forceMagnitude;
|
return forceMagnitude;
|
||||||
}
|
}
|
||||||
|
@ -1429,9 +1396,9 @@ void ReducedModelOptimizer::optimize(
|
||||||
results.baseTriangle = global.baseTriangle;
|
results.baseTriangle = global.baseTriangle;
|
||||||
|
|
||||||
DRMSimulationModel::Settings simulationSettings;
|
DRMSimulationModel::Settings simulationSettings;
|
||||||
simulationSettings.maxDRMIterations = 50000;
|
simulationSettings.maxDRMIterations = 100000;
|
||||||
simulationSettings.shouldUseTranslationalKineticEnergyThreshold = true;
|
simulationSettings.shouldUseTranslationalKineticEnergyThreshold = true;
|
||||||
simulationSettings.totalTranslationalKineticEnergyThreshold = 1e-10;
|
simulationSettings.totalTranslationalKineticEnergyThreshold = 1e-8;
|
||||||
// simulationSettings.beVerbose = true;
|
// simulationSettings.beVerbose = true;
|
||||||
// simulationSettings.shouldDraw = true;
|
// simulationSettings.shouldDraw = true;
|
||||||
// simulationSettings.isDebugMode = true;
|
// simulationSettings.isDebugMode = true;
|
||||||
|
@ -1455,24 +1422,30 @@ void ReducedModelOptimizer::optimize(
|
||||||
#ifdef POLYSCOPE_DEFINED
|
#ifdef POLYSCOPE_DEFINED
|
||||||
std::cout << "Simulation job " << pFullPatternSimulationJob->getLabel()
|
std::cout << "Simulation job " << pFullPatternSimulationJob->getLabel()
|
||||||
<< " did not converge." << std::endl;
|
<< " did not converge." << std::endl;
|
||||||
DRMSimulationModel::Settings debugSimulationSettings;
|
// DRMSimulationModel::Settings debugSimulationSettings;
|
||||||
debugSimulationSettings.isDebugMode = true;
|
// debugSimulationSettings.isDebugMode = true;
|
||||||
debugSimulationSettings.debugModeStep = 1000;
|
// debugSimulationSettings.debugModeStep = 1000;
|
||||||
// debugSimulationSettings.maxDRMIterations = 100000;
|
// // debugSimulationSettings.maxDRMIterations = 100000;
|
||||||
debugSimulationSettings.shouldDraw = true;
|
// debugSimulationSettings.shouldDraw = true;
|
||||||
debugSimulationSettings.drawingStep = debugSimulationSettings.debugModeStep;
|
// debugSimulationSettings.drawingStep = debugSimulationSettings.debugModeStep;
|
||||||
debugSimulationSettings.shouldCreatePlots = true;
|
// debugSimulationSettings.shouldCreatePlots = true;
|
||||||
// debugSimulationSettings.Dtini = 0.06;
|
// // debugSimulationSettings.Dtini = 0.06;
|
||||||
debugSimulationSettings.beVerbose = true;
|
// debugSimulationSettings.beVerbose = true;
|
||||||
debugSimulationSettings.useAverage = true;
|
// debugSimulationSettings.useAverage = true;
|
||||||
// debugSimulationSettings.totalExternalForcesNormPercentageTermination = 1e-3;
|
// // debugSimulationSettings.totalExternalForcesNormPercentageTermination = 1e-3;
|
||||||
debugSimulationSettings.shouldUseTranslationalKineticEnergyThreshold = true;
|
// // debugSimulationSettings.shouldUseTranslationalKineticEnergyThreshold = true;
|
||||||
auto debugResults = simulator.executeSimulation(pFullPatternSimulationJob,
|
// auto debugResults = simulator.executeSimulation(pFullPatternSimulationJob,
|
||||||
debugSimulationSettings);
|
// debugSimulationSettings);
|
||||||
debugResults.setLabelPrefix("debugResults");
|
// debugResults.setLabelPrefix("debugResults");
|
||||||
debugResults.registerForDrawing();
|
// debugResults.registerForDrawing();
|
||||||
polyscope::show();
|
// polyscope::show();
|
||||||
debugResults.unregister();
|
// debugResults.unregister();
|
||||||
|
std::filesystem::path outputPath(
|
||||||
|
std::filesystem::path("../nonConvergingJobs")
|
||||||
|
.append(m_pFullPatternSimulationMesh->getLabel())
|
||||||
|
.append("final_" + pFullPatternSimulationJob->getLabel()));
|
||||||
|
std::filesystem::create_directories(outputPath);
|
||||||
|
pFullPatternSimulationJob->save(outputPath);
|
||||||
#endif
|
#endif
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
@ -35,6 +35,7 @@ class ReducedModelOptimizer
|
||||||
SimulationJob &)>>
|
SimulationJob &)>>
|
||||||
constructBaseScenarioFunctions;
|
constructBaseScenarioFunctions;
|
||||||
std::vector<bool> scenarioIsSymmetrical;
|
std::vector<bool> scenarioIsSymmetrical;
|
||||||
|
int fullPatternNumberOfEdges;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
constexpr static std::array<int, 5> simulationScenariosResolution = {10, 10, 20, 20, 20};
|
constexpr static std::array<int, 5> simulationScenariosResolution = {10, 10, 20, 20, 20};
|
||||||
|
|
Loading…
Reference in New Issue