Changed simulation scenarios for axial and shear

This commit is contained in:
Iason 2021-03-02 14:16:49 +02:00
parent 3d404a9153
commit 4a03c435c2
2 changed files with 42 additions and 55 deletions

View File

@ -783,6 +783,22 @@ ReducedModelOptimizer::createScenarios(
//// Axial
SimulationScenario scenarioName = SimulationScenario::Axial;
// NewMethod
// for (auto viPairIt = m_fullPatternOppositeInterfaceViMap.begin();
// viPairIt != m_fullPatternOppositeInterfaceViMap.end(); viPairIt++) {
// if (viPairIt != m_fullPatternOppositeInterfaceViMap.begin()) {
// CoordType forceDirection(1, 0, 0);
// const auto viPair = *viPairIt;
// nodalForces[viPair.first] =
// Vector6d({forceDirection[0], forceDirection[1], forceDirection[2],
// 0,
// 0, 0}) *
// forceMagnitude * 10;
// fixedVertices[viPair.second] =
// std::unordered_set<DoFType>{0, 1, 2, 3, 4, 5};
// }
// }
// OldMethod
for (const auto &viPair : m_fullPatternOppositeInterfaceViMap) {
CoordType forceDirection =
(pMesh->vert[viPair.first].cP() - pMesh->vert[viPair.second].cP())
@ -801,6 +817,22 @@ ReducedModelOptimizer::createScenarios(
scenarioName = SimulationScenario::Shear;
fixedVertices.clear();
nodalForces.clear();
// NewMethod
// for (auto viPairIt = m_fullPatternOppositeInterfaceViMap.begin();
// viPairIt != m_fullPatternOppositeInterfaceViMap.end(); viPairIt++) {
// if (viPairIt != m_fullPatternOppositeInterfaceViMap.begin()) {
// CoordType forceDirection(0, 1, 0);
// const auto viPair = *viPairIt;
// nodalForces[viPair.first] =
// Vector6d({forceDirection[0], forceDirection[1], forceDirection[2],
// 0,
// 0, 0}) *
// forceMagnitude * 10;
// fixedVertices[viPair.second] =
// std::unordered_set<DoFType>{0, 1, 2, 3, 4, 5};
// }
// }
// OldMethod
for (const auto &viPair : m_fullPatternOppositeInterfaceViMap) {
CoordType v =
(pMesh->vert[viPair.first].cP() - pMesh->vert[viPair.second].cP())
@ -913,9 +945,7 @@ ReducedModelOptimizer::createScenarios(
void ReducedModelOptimizer::computeObjectiveValueNormalizationFactors() {
assert(global.optimizationSettings.shouldNormalizeObjectiveValue);
if (global.optimizationSettings.normalizationStrategy ==
Settings::NormalizationStrategy::Epsilon ||
global.optimizationSettings.normalizationStrategy ==
Settings::NormalizationStrategy::EqualDisplacements) {
Settings::NormalizationStrategy::Epsilon) {
// Compute the sum of the displacement norms
std::vector<double> fullPatternDisplacementNormSum(
@ -946,49 +976,8 @@ void ReducedModelOptimizer::computeObjectiveValueNormalizationFactors() {
global.objectiveNormalizationValues[simulationScenarioIndex] = std::max(
fullPatternDisplacementNormSum[simulationScenarioIndex], epsilon);
// displacementNormSum;
} else { // NormalizationStrategy::EqualDisplacements
global.objectiveNormalizationValues[simulationScenarioIndex] =
fullPatternDisplacementNormSum[simulationScenarioIndex] /
fullPatternDisplacementNormSum[SimulationScenario::Shear];
}
}
} else if (global.optimizationSettings.normalizationStrategy ==
Settings::NormalizationStrategy::MaxDisplacement) {
for (int simulationScenarioIndex : global.simulationScenarioIndices) {
// Compute the quantities for normalizing the obj value
const double minB = global.optimizationSettings.xRanges[0].min;
const double maxRatio = global.optimizationSettings.xRanges[1].max;
const double minE = global.optimizationSettings.xRanges[2].min;
const double minHS = 0.3;
std::vector<double> mostFlexibleOptimizationParameters{minB, maxRatio,
minE, minHS};
if (global.optimizeInnerHexagonSize) {
updateMesh(4, mostFlexibleOptimizationParameters.data());
} else {
updateMesh(3, mostFlexibleOptimizationParameters.data());
}
reducedPatternMaximumDisplacementSimulationJobs[simulationScenarioIndex] =
global.reducedPatternSimulationJobs[simulationScenarioIndex]
->getCopy();
reducedPatternMaximumDisplacementSimulationJobs[simulationScenarioIndex]
.pMesh->setLabel("reduced_maxDisplacement");
SimulationResults reducedModelResults = simulator.executeSimulation(
global.reducedPatternSimulationJobs[simulationScenarioIndex]);
const double errorOfMaxDisplacedReduced = computeRawError(
reducedModelResults.displacements,
global.fullPatternDisplacements[simulationScenarioIndex],
global.reducedToFullInterfaceViMap);
const double errorOfNonDisplacedReduced = computeRawError(
std::vector<Vector6d>(reducedModelResults.displacements.size(),
Vector6d(0)),
global.fullPatternDisplacements[simulationScenarioIndex],
global.reducedToFullInterfaceViMap);
const double displacementMultiplier =
global.optimizationSettings.normalizationParameter;
global.objectiveNormalizationValues[simulationScenarioIndex] =
displacementMultiplier *
std::max(errorOfMaxDisplacedReduced, errorOfNonDisplacedReduced);
}
}
}

View File

@ -62,14 +62,9 @@ public:
struct Results;
struct Settings {
enum NormalizationStrategy {
NonNormalized,
Epsilon,
MaxDisplacement,
EqualDisplacements
};
enum NormalizationStrategy { NonNormalized, Epsilon };
inline static vector<std::string> normalizationStrategyStrings{
"NonNormalized", "Epsilon", "MaxDsiplacement", "EqualDisplacements"};
"NonNormalized", "Epsilon"};
std::vector<xRange> xRanges;
int numberOfFunctionCalls{100};
double solutionAccuracy{1e-2};
@ -115,8 +110,11 @@ public:
}
os << numberOfFunctionCalls;
os << solutionAccuracy;
os << normalizationStrategyStrings[normalizationStrategy] + "_" +
std::to_string(normalizationParameter);
if (normalizationStrategy == Epsilon) {
os << "Epsilon_" + std::to_string(normalizationParameter);
} else {
os << "NonNormalized";
}
}
};
struct Results {
@ -227,8 +225,8 @@ public:
const std::string screenshotFilename =
"/home/iason/Coding/Projects/Approximating shapes with flat "
"patterns/RodModelOptimizationForPatterns/Results/Images/" +
pFullPatternSimulationJob->pMesh->getLabel() + "_" +
simulationScenarioStrings[simulationJobIndex];
fullPatternSimulationJobs[0]->pMesh->getLabel() + "_" +
pFullPatternSimulationJob->getLabel();
polyscope::screenshot(screenshotFilename, false);
fullModelResults.unregister();
reducedModelResults.unregister();