Objective value takes into account the rotational displacemenets between the full and the reduced pattern.

This commit is contained in:
iasonmanolas 2021-03-30 12:35:00 +03:00
parent 4893f03667
commit 107a2ce66c
2 changed files with 75 additions and 33 deletions

View File

@ -56,7 +56,7 @@ int main(int argc, char *argv[]) {
settings_optimization.normalizationStrategy settings_optimization.normalizationStrategy
= ReducedModelOptimization::Settings::NormalizationStrategy::Epsilon; = ReducedModelOptimization::Settings::NormalizationStrategy::Epsilon;
settings_optimization.normalizationParameter = 0.0003; settings_optimization.normalizationParameter = 0.0003;
settings_optimization.solutionAccuracy = 0.01; settings_optimization.solutionAccuracy = 0.001;
// Optimize pair // Optimize pair
const std::string pairName = const std::string pairName =
@ -97,7 +97,7 @@ int main(int argc, char *argv[]) {
// .string(), // .string(),
// false); // false);
csv_results << "Name"; csv_results << "Name";
optimizationResults.writeHeaderTo(settings_optimization, csv_results); optimizationResults.writeHeaderTo(csv_results);
settings_optimization.writeHeaderTo(csv_results); settings_optimization.writeHeaderTo(csv_results);
csv_results << endrow; csv_results << endrow;
csv_results << pairName; csv_results << pairName;

View File

@ -13,7 +13,8 @@ struct GlobalOptimizationVariables {
std::vector<Eigen::MatrixX3d> g_optimalReducedModelDisplacements; std::vector<Eigen::MatrixX3d> g_optimalReducedModelDisplacements;
// std::vector<std::vector<Vector6d>> fullPatternDisplacements; // std::vector<std::vector<Vector6d>> fullPatternDisplacements;
std::vector<SimulationResults> fullPatternResults; std::vector<SimulationResults> fullPatternResults;
std::vector<double> objectiveNormalizationValues; std::vector<double> translationalDisplacementNormalizationValues;
std::vector<double> rotationalDisplacementNormalizationValues;
std::vector<std::shared_ptr<SimulationJob>> fullPatternSimulationJobs; std::vector<std::shared_ptr<SimulationJob>> fullPatternSimulationJobs;
std::vector<std::shared_ptr<SimulationJob>> reducedPatternSimulationJobs; std::vector<std::shared_ptr<SimulationJob>> reducedPatternSimulationJobs;
std::unordered_map<ReducedPatternVertexIndex, FullPatternVertexIndex> std::unordered_map<ReducedPatternVertexIndex, FullPatternVertexIndex>
@ -67,12 +68,6 @@ double ReducedModelOptimizer::computeRawDisplacementError(
reducedPatternDisplacements[reducedModelVi][0], reducedPatternDisplacements[reducedModelVi][0],
reducedPatternDisplacements[reducedModelVi][1], reducedPatternDisplacements[reducedModelVi][1],
reducedPatternDisplacements[reducedModelVi][2]); reducedPatternDisplacements[reducedModelVi][2]);
if (!std::isfinite(reducedVertexDisplacement[0]) ||
!std::isfinite(reducedVertexDisplacement[1]) ||
!std::isfinite(reducedVertexDisplacement[2])) {
std::cout << "Displacements are not finite" << std::endl;
std::terminate();
}
const VertexIndex fullModelVi = reducedFullViPair.second; const VertexIndex fullModelVi = reducedFullViPair.second;
Eigen::Vector3d fullVertexDisplacement( Eigen::Vector3d fullVertexDisplacement(
fullPatternDisplacements[fullModelVi][0], fullPatternDisplacements[fullModelVi][0],
@ -134,11 +129,24 @@ double ReducedModelOptimizer::objective(long n, const double *x) {
reducedModelResults.internalPotentialEnergy reducedModelResults.internalPotentialEnergy
- global.fullPatternResults[simulationScenarioIndex].internalPotentialEnergy); - global.fullPatternResults[simulationScenarioIndex].internalPotentialEnergy);
} else { } else {
simulationScenarioError = computeDisplacementError( const double translationalError = computeDisplacementError(
reducedModelResults.displacements, reducedModelResults.displacements,
global.fullPatternResults[simulationScenarioIndex].displacements, global.fullPatternResults[simulationScenarioIndex].displacements,
global.reducedToFullInterfaceViMap, global.reducedToFullInterfaceViMap,
global.objectiveNormalizationValues[simulationScenarioIndex]); global.translationalDisplacementNormalizationValues[simulationScenarioIndex]);
double rotationalError = 0;
for (const auto &reducedToFullInterfaceViPair : global.reducedToFullInterfaceViMap) {
const double vertexRotationalError
= global.fullPatternResults[simulationScenarioIndex]
.rotationalDisplacementQuaternion[reducedToFullInterfaceViPair.second]
.angularDistance(reducedModelResults.rotationalDisplacementQuaternion
[reducedToFullInterfaceViPair.first]);
rotationalError += vertexRotationalError;
}
simulationScenarioError += translationalError
+ rotationalError
/ global.rotationalDisplacementNormalizationValues
[simulationScenarioIndex];
} }
//#ifdef POLYSCOPE_DEFINED //#ifdef POLYSCOPE_DEFINED
// std::cout << "sim error:" << simulationScenarioError << std::endl; // std::cout << "sim error:" << simulationScenarioError << std::endl;
@ -549,10 +557,9 @@ void ReducedModelOptimizer::visualizeResults(
std::shared_ptr<SimulationMesh> pFullPatternSimulationMesh = std::shared_ptr<SimulationMesh> pFullPatternSimulationMesh =
fullPatternSimulationJobs[0]->pMesh; fullPatternSimulationJobs[0]->pMesh;
pFullPatternSimulationMesh->registerForDrawing(); pFullPatternSimulationMesh->registerForDrawing();
pFullPatternSimulationMesh->savePly(pFullPatternSimulationMesh->getLabel() + pFullPatternSimulationMesh->save(pFullPatternSimulationMesh->getLabel() + "_undeformed.ply");
"_undeformed.ply"); reducedPatternSimulationJobs[0]->pMesh->save(reducedPatternSimulationJobs[0]->pMesh->getLabel()
reducedPatternSimulationJobs[0]->pMesh->savePly( + "_undeformed.ply");
reducedPatternSimulationJobs[0]->pMesh->getLabel() + "_undeformed.ply");
double totalError = 0; double totalError = 0;
for (const int simulationScenarioIndex : simulationScenarios) { for (const int simulationScenarioIndex : simulationScenarios) {
const std::shared_ptr<SimulationJob> &pFullPatternSimulationJob = const std::shared_ptr<SimulationJob> &pFullPatternSimulationJob =
@ -570,8 +577,8 @@ void ReducedModelOptimizer::visualizeResults(
double normalizationFactor = 1; double normalizationFactor = 1;
if (global.optimizationSettings.normalizationStrategy != if (global.optimizationSettings.normalizationStrategy !=
ReducedModelOptimization::Settings::NormalizationStrategy::NonNormalized) { ReducedModelOptimization::Settings::NormalizationStrategy::NonNormalized) {
normalizationFactor = normalizationFactor
global.objectiveNormalizationValues[simulationScenarioIndex]; = global.translationalDisplacementNormalizationValues[simulationScenarioIndex];
} }
reducedModelResults.saveDeformedModel(); reducedModelResults.saveDeformedModel();
fullModelResults.saveDeformedModel(); fullModelResults.saveDeformedModel();
@ -680,10 +687,10 @@ ReducedModelOptimizer::runOptimization(const Settings &settings) {
std::chrono::duration_cast<std::chrono::milliseconds>(end - start); std::chrono::duration_cast<std::chrono::milliseconds>(end - start);
ReducedModelOptimization::Results results; ReducedModelOptimization::Results results;
results.numberOfSimulationCrashes = global.numOfSimulationCrashes; results.numberOfSimulationCrashes = global.numOfSimulationCrashes;
results.optimalXNameValuePairs.reserve(settings.xRanges.size()); results.optimalXNameValuePairs.resize(settings.xRanges.size());
for(int xVariableIndex=0;xVariableIndex<settings.xRanges.size();xVariableIndex++){ for(int xVariableIndex=0;xVariableIndex<settings.xRanges.size();xVariableIndex++){
results.optimalXNameValuePairs[settings.xRanges[xVariableIndex].label]= results.optimalXNameValuePairs[xVariableIndex]
global.minX[xVariableIndex]; = std::make_pair(settings.xRanges[xVariableIndex].label, global.minX[xVariableIndex]);
} }
results.objectiveValue = global.minY; results.objectiveValue = global.minY;
#ifdef POLYSCOPE_DEFINED #ifdef POLYSCOPE_DEFINED
@ -713,7 +720,7 @@ ReducedModelOptimizer::runOptimization(const Settings &settings) {
reducedModelResults.displacements, reducedModelResults.displacements,
global.fullPatternResults[simulationScenarioIndex].displacements, global.fullPatternResults[simulationScenarioIndex].displacements,
global.reducedToFullInterfaceViMap, global.reducedToFullInterfaceViMap,
global.objectiveNormalizationValues[simulationScenarioIndex]); global.translationalDisplacementNormalizationValues[simulationScenarioIndex]);
results.rawObjectiveValue += computeRawDisplacementError( results.rawObjectiveValue += computeRawDisplacementError(
reducedModelResults.displacements, reducedModelResults.displacements,
global.fullPatternResults[simulationScenarioIndex].displacements, global.fullPatternResults[simulationScenarioIndex].displacements,
@ -877,27 +884,61 @@ void ReducedModelOptimizer::computeObjectiveValueNormalizationFactors() {
Settings::NormalizationStrategy::Epsilon) { Settings::NormalizationStrategy::Epsilon) {
// Compute the sum of the displacement norms // Compute the sum of the displacement norms
std::vector<double> fullPatternDisplacementNormSum( std::vector<double> fullPatternTranslationalDisplacementNormSum(NumberOfSimulationScenarios);
NumberOfSimulationScenarios); std::vector<double> fullPatternAngularDistance(NumberOfSimulationScenarios);
for (int simulationScenarioIndex : global.simulationScenarioIndices) { for (int simulationScenarioIndex : global.simulationScenarioIndices) {
double displacementNormSum = 0; double translationalDisplacementNormSum = 0;
double angularDistanceSum = 0;
for (auto interfaceViPair : global.reducedToFullInterfaceViMap) { for (auto interfaceViPair : global.reducedToFullInterfaceViMap) {
const int fullPatternVi = interfaceViPair.second;
//If the full pattern vertex is translationally constrained dont take it into account
if (global.fullPatternSimulationJobs[simulationScenarioIndex]
->constrainedVertices.contains(fullPatternVi)) {
const std::unordered_set<int> constrainedDof
= global.fullPatternSimulationJobs[simulationScenarioIndex]
->constrainedVertices.at(fullPatternVi);
if (constrainedDof.contains(0) && constrainedDof.contains(1)
&& constrainedDof.contains(2)) {
continue;
}
}
const Vector6d &vertexDisplacement = global const Vector6d &vertexDisplacement = global
.fullPatternResults[simulationScenarioIndex] .fullPatternResults[simulationScenarioIndex]
.displacements[interfaceViPair.second]; .displacements[fullPatternVi];
displacementNormSum += vertexDisplacement.getTranslation().norm(); translationalDisplacementNormSum += vertexDisplacement.getTranslation().norm();
//If the full pattern vertex is rotationally constrained dont take it into account
if (global.fullPatternSimulationJobs[simulationScenarioIndex]
->constrainedVertices.contains(fullPatternVi)) {
const std::unordered_set<int> constrainedDof
= global.fullPatternSimulationJobs[simulationScenarioIndex]
->constrainedVertices.at(fullPatternVi);
if (constrainedDof.contains(3) && constrainedDof.contains(5)
&& constrainedDof.contains(4)) {
continue;
}
}
angularDistanceSum += global.fullPatternResults[simulationScenarioIndex]
.rotationalDisplacementQuaternion[fullPatternVi]
.angularDistance(Eigen::Quaterniond::Identity());
} }
fullPatternDisplacementNormSum[simulationScenarioIndex] = fullPatternTranslationalDisplacementNormSum[simulationScenarioIndex]
displacementNormSum; = translationalDisplacementNormSum;
fullPatternAngularDistance[simulationScenarioIndex] = angularDistanceSum;
} }
for (int simulationScenarioIndex : global.simulationScenarioIndices) { for (int simulationScenarioIndex : global.simulationScenarioIndices) {
if (global.optimizationSettings.normalizationStrategy == if (global.optimizationSettings.normalizationStrategy ==
Settings::NormalizationStrategy::Epsilon) { Settings::NormalizationStrategy::Epsilon) {
const double epsilon = const double epsilon_translationalDisplacement = global.optimizationSettings
global.optimizationSettings.normalizationParameter; .normalizationParameter;
global.objectiveNormalizationValues[simulationScenarioIndex] = std::max( global.translationalDisplacementNormalizationValues[simulationScenarioIndex]
fullPatternDisplacementNormSum[simulationScenarioIndex], epsilon); = std::max(fullPatternTranslationalDisplacementNormSum[simulationScenarioIndex],
epsilon_translationalDisplacement);
const double epsilon_rotationalDisplacement = vcg::math::ToRad(2.0);
global.rotationalDisplacementNormalizationValues[simulationScenarioIndex]
= std::max(fullPatternAngularDistance[simulationScenarioIndex],
epsilon_rotationalDisplacement);
} }
} }
} }
@ -919,7 +960,8 @@ Results ReducedModelOptimizer::optimize(
global.g_optimalReducedModelDisplacements.resize(NumberOfSimulationScenarios); global.g_optimalReducedModelDisplacements.resize(NumberOfSimulationScenarios);
global.reducedPatternSimulationJobs.resize(NumberOfSimulationScenarios); global.reducedPatternSimulationJobs.resize(NumberOfSimulationScenarios);
global.fullPatternResults.resize(NumberOfSimulationScenarios); global.fullPatternResults.resize(NumberOfSimulationScenarios);
global.objectiveNormalizationValues.resize(NumberOfSimulationScenarios); global.translationalDisplacementNormalizationValues.resize(NumberOfSimulationScenarios);
global.rotationalDisplacementNormalizationValues.resize(NumberOfSimulationScenarios);
global.minY = std::numeric_limits<double>::max(); global.minY = std::numeric_limits<double>::max();
global.numOfSimulationCrashes = 0; global.numOfSimulationCrashes = 0;
global.numberOfFunctionCalls = 0; global.numberOfFunctionCalls = 0;