Finalized the simulation scenarios. Left out the torsion scenario.

This commit is contained in:
Iason 2020-12-14 11:07:43 +02:00
parent 4d4aa346b5
commit b0ba64d499
3 changed files with 177 additions and 166 deletions

View File

@ -49,56 +49,61 @@ int main(int argc, char *argv[]) {
singleBarReducedModelEdges);
singleBarReducedModel.setLabel("Single bar reduced model");
// std::vector<vcg::Point2i> CCWreducedModelEdges{vcg::Point2i(1, 5),
// vcg::Point2i(3, 5)};
// FlatPattern CWReducedModel(numberOfNodesPerSlot, CCWreducedModelEdges);
// CWReducedModel.setLabel("CW reduced model");
std::vector<vcg::Point2i> CCWreducedModelEdges{vcg::Point2i(1, 5),
vcg::Point2i(3, 5)};
FlatPattern CWReducedModel(numberOfNodesPerSlot, CCWreducedModelEdges);
CWReducedModel.setLabel("CW reduced model");
// std::vector<vcg::Point2i> CWreducedModelEdges{vcg::Point2i(1, 5),
// vcg::Point2i(3, 1)};
// FlatPattern CCWReducedModel(numberOfNodesPerSlot, CWreducedModelEdges);
// CCWReducedModel.setLabel("CCW reduced model");
std::vector<vcg::Point2i> CWreducedModelEdges{vcg::Point2i(1, 5),
vcg::Point2i(3, 1)};
FlatPattern CCWReducedModel(numberOfNodesPerSlot, CWreducedModelEdges);
CCWReducedModel.setLabel("CCW reduced model");
// std::vector<FlatPattern *> reducedModels{&singleBarReducedModel,
// &CWReducedModel,
// &CCWReducedModel};
std::vector<FlatPattern *> reducedModels{&singleBarReducedModel,
&CWReducedModel, &CCWReducedModel};
// ReducedModelOptimizer optimizer(numberOfNodesPerSlot);
// std::string fullPatternsTestSetDirectory =
// "/home/iason/Models/TestSet_validPatterns";
// for (const auto &entry :
// filesystem::directory_iterator(fullPatternsTestSetDirectory)) {
// const auto filepath =
// std::filesystem::path("/home/iason/Models/valid_6777.ply");
// // std::filesystem::path(
// // "/home/iason/Documents/PhD/Research/Pattern_enumerator/Results/"
// // "1v_0v_2e_1e_1c_6fan/3/Valid/431.ply");
// // std::filesystem::path(
// // "/home/iason/Models/TestSet_validPatterns/865.ply");
// // entry.path();
// const auto filepathString = filepath.string();
// // Use only the base triangle version
// const std::string tiledSuffix = "_tiled.ply";
// if (filepathString.compare(filepathString.size() - tiledSuffix.size(),
// tiledSuffix.size(), tiledSuffix) == 0) {
// continue;
// }
// FlatPattern pattern(filepathString);
// pattern.setLabel(filepath.stem().string());
// std::cout << "Testing Pattern:" << filepathString << std::endl;
// for (FlatPattern *pReducedModel : reducedModels) {
// // pReducedModel = reducedModels[1];
// std::unordered_set<size_t> optimizationExcludedEi;
// if (pReducedModel !=
// reducedModels[0]) { // assumes that the singleBar reduced model is
// // the
// // first in the reducedModels vector
// optimizationExcludedEi.insert(0);
// }
// optimizer.initialize(pattern, *pReducedModel, optimizationExcludedEi);
// Eigen::VectorXd optimalParameters = optimizer.optimize();
// }
// }
ReducedModelOptimizer optimizer(numberOfNodesPerSlot);
std::string fullPatternsTestSetDirectory =
"/home/iason/Models/TestSet_validPatterns";
for (const auto &entry :
filesystem::directory_iterator(fullPatternsTestSetDirectory)) {
const auto filepath =
// std::filesystem::path("/home/iason/Models/valid_6777.ply");
// std::filesystem::path(
// "/home/iason/Documents/PhD/Research/Pattern_enumerator/Results/"
// "1v_0v_2e_1e_1c_6fan/3/Valid/222.ply");
// std::filesystem::path(
// "/home/iason/Documents/PhD/Research/Pattern_enumerator/Results/"
// "1v_0v_2e_1e_1c_6fan/2/Valid/33.ply");
std::filesystem::path(
"/home/iason/Documents/PhD/Research/Pattern_enumerator/Results/"
"1v_0v_2e_1e_1c_6fan/3/Valid/431.ply");
// std::filesystem::path(
// "/home/iason/Models/TestSet_validPatterns/865.ply");
entry.path();
const auto filepathString = filepath.string();
// Use only the base triangle version
const std::string tiledSuffix = "_tiled.ply";
if (filepathString.compare(filepathString.size() - tiledSuffix.size(),
tiledSuffix.size(), tiledSuffix) == 0) {
continue;
}
FlatPattern pattern(filepathString);
pattern.setLabel(filepath.stem().string());
std::cout << "Testing Pattern:" << filepathString << std::endl;
for (FlatPattern *pReducedModel : reducedModels) {
// pReducedModel = reducedModels[1];
std::unordered_set<size_t> optimizationExcludedEi;
if (pReducedModel !=
reducedModels[0]) { // assumes that the singleBar reduced model is
// the
// first in the reducedModels vector
optimizationExcludedEi.insert(0);
}
optimizer.initialize(pattern, *pReducedModel, optimizationExcludedEi);
Eigen::VectorXd optimalParameters = optimizer.optimize();
}
}
// // Full model simulation
// std::unordered_map<VertexIndex, std::unordered_set<DoFType>>
@ -166,28 +171,56 @@ int main(int argc, char *argv[]) {
// }
// Beam
// registerWorldAxes();
VCGEdgeMesh mesh;
mesh.loadFromPly("/home/iason/Models/simple_beam_model_10elem_1m.ply");
// mesh.loadFromPly("/home/iason/Models/simple_beam_model_10elem_1m.ply");
mesh.loadFromPly("/home/iason/Coding/Projects/Approximating shapes with flat "
"patterns/RodModelOptimizationForPatterns/build/Debug/"
"Fanned_Single bar reduced model.ply");
// vcg::Matrix44d R;
// R.SetRotateDeg(45, {0, 0, 1});
// vcg::tri::UpdatePosition<VCGEdgeMesh>::Matrix(mesh, R);
// mesh.updateEigenEdgeAndVertices();
FormFinder formFinder;
formFinder.runUnitTests();
std::unordered_map<VertexIndex, std::unordered_set<DoFType>> fixedVertices;
fixedVertices[0] = std::unordered_set<DoFType>{0, 1, 2, 3, 4, 5};
std::unordered_map<VertexIndex, Vector6d> nodalForces{
{10, Vector6d({0, 0, 0, 0.00001, 0, 0})}};
fixedVertices[1] = std::unordered_set<DoFType>{2};
fixedVertices[2] = std::unordered_set<DoFType>{2};
fixedVertices[3] = std::unordered_set<DoFType>{1, 2};
fixedVertices[4] = std::unordered_set<DoFType>{2};
fixedVertices[5] = std::unordered_set<DoFType>{2};
fixedVertices[6] = std::unordered_set<DoFType>{0, 1, 2};
// Forced displacements
std::unordered_map<size_t, Eigen::Vector3d> nodalForcedDisplacements;
// nodalForcedDisplacements[10] = Eigen::Vector3d(0, 0.1, 0.1);
std::unordered_map<size_t, VectorType> nodalForcedNormal;
// CoordType v = (mesh.vert[10].cP() - mesh.vert[0].cP()).Normalize();
CoordType v14 = (mesh.vert[4].cP() - mesh.vert[0].cP()).Normalize();
CoordType v25 = (mesh.vert[5].cP() - mesh.vert[0].cP()).Normalize();
CoordType v36 = (mesh.vert[6].cP() - mesh.vert[0].cP()).Normalize();
const double forceMagnitude = 0.4;
std::unordered_map<VertexIndex, Vector6d> nodalForces{
// {4, Vector6d({0, 0, 0, v14[0], v14[1], 0}) * forceMagnitude},
// {1, Vector6d({0, 0, 0, -v14[0], -v14[1], 0}) * forceMagnitude},
// {5, Vector6d({0, 0, 0, v25[0], v25[1], 0}) * forceMagnitude},
// {2, Vector6d({0, 0, 0, -v25[0], -v25[1], 0}) * forceMagnitude},
// {6, Vector6d({0, 0, 0, v36[0], v36[1], 0}) * forceMagnitude},
{3, Vector6d({0, 0, 0, -v36[0], -v36[1], 0}) * forceMagnitude}};
// nodalForcedNormal[10] = v;
fixedVertices[10] = {0, 1, 2};
// nodalForcedNormal[0] = -v;
// fixedVertices[10] = {0, 1};
SimulationJob beamSimulationJob{std::make_shared<SimulationMesh>(mesh),
fixedVertices, nodalForces,
nodalForcedDisplacements, nodalForcedNormal};
fixedVertices,
nodalForces,
{},
{}};
beamSimulationJob.mesh->setBeamMaterial(0.3, 1);
beamSimulationJob.mesh->setBeamCrossSection(
RectangularBeamDimensions{0.002, 0.002});
// registerWorldAxes();
beamSimulationJob.registerForDrawing();
registerWorldAxes();
polyscope::show();
SimulationResults beamSimulationResults =
formFinder.executeSimulation(beamSimulationJob, true, true);
beamSimulationResults.simulationLabel = "Beam";

View File

@ -10,7 +10,7 @@ const bool gShouldDraw = true;
FormFinder simulator;
Eigen::MatrixX3d g_optimalReducedModelDisplacements;
SimulationJob g_reducedPatternSimulationJob;
std::unordered_map<ReducedModelVertexIndex, FullModelVertexIndex>
std::unordered_map<ReducedPatternVertexIndex, FullPatternVertexIndex>
g_reducedToFullInterfaceViMap;
matplot::line_handle gPlotHandle;
std::vector<double> gObjectiveValueHistory;
@ -145,10 +145,10 @@ double ReducedModelOptimizer::objective(long n, const double *x) {
error += errorVector.norm();
}
gObjectiveValueHistory.push_back(error);
auto xPlot = matplot::linspace(0, gObjectiveValueHistory.size(),
gObjectiveValueHistory.size());
gPlotHandle = matplot::scatter(xPlot, gObjectiveValueHistory);
// gObjectiveValueHistory.push_back(error);
// auto xPlot = matplot::linspace(0, gObjectiveValueHistory.size(),
// gObjectiveValueHistory.size());
// gPlotHandle = matplot::scatter(xPlot, gObjectiveValueHistory);
return error;
}
@ -278,13 +278,15 @@ void ReducedModelOptimizer::computeMaps(
void ReducedModelOptimizer::createSimulationMeshes(FlatPattern &fullModel,
FlatPattern &reducedModel) {
pReducedModelElementalMesh = std::make_shared<SimulationMesh>(reducedModel);
pReducedModelElementalMesh->setBeamCrossSection(
m_pReducedPatternElementalMesh =
std::make_shared<SimulationMesh>(reducedModel);
m_pReducedPatternElementalMesh->setBeamCrossSection(
CrossSectionType{0.002, 0.002});
pReducedModelElementalMesh->setBeamMaterial(0.3, 1);
pFullModelElementalMesh = std::make_shared<SimulationMesh>(fullModel);
pFullModelElementalMesh->setBeamCrossSection(CrossSectionType{0.002, 0.002});
pFullModelElementalMesh->setBeamMaterial(0.3, 1);
m_pReducedPatternElementalMesh->setBeamMaterial(0.3, 1);
m_pFullModelElementalMesh = std::make_shared<SimulationMesh>(fullModel);
m_pFullModelElementalMesh->setBeamCrossSection(
CrossSectionType{0.002, 0.002});
m_pFullModelElementalMesh->setBeamMaterial(0.3, 1);
}
ReducedModelOptimizer::ReducedModelOptimizer(
@ -297,7 +299,7 @@ void ReducedModelOptimizer::initialize(
FlatPattern &fullPattern, FlatPattern &reducedPattern,
const std::unordered_set<size_t> &reducedModelExcludedEdges) {
assert(fullPattern.VN() == reducedPattern.VN() &&
fullPattern.EN() > reducedPattern.EN());
fullPattern.EN() >= reducedPattern.EN());
polyscope::removeAllStructures();
// Create copies of the input models
FlatPattern copyFullPattern;
@ -307,9 +309,6 @@ void ReducedModelOptimizer::initialize(
computeMaps(copyFullPattern, copyReducedPattern, reducedModelExcludedEdges);
createSimulationMeshes(copyFullPattern, copyReducedPattern);
initializeStiffnesses();
int i = 0;
i++;
}
void ReducedModelOptimizer::initializeStiffnesses() {
@ -324,7 +323,8 @@ void ReducedModelOptimizer::initializeStiffnesses() {
// e.firstBendingConstFactor *= stiffnessFactor;
// e.secondBendingConstFactor *= stiffnessFactor;
// }
g_initialParameters = pReducedModelElementalMesh->elements[0].properties.E;
g_initialParameters =
m_pReducedPatternElementalMesh->elements[0].properties.E;
// g_initialParameters(1) =
// pReducedModelElementalMesh->elements[0].properties.G;
// g_initialParameters(0, 0) =
@ -363,7 +363,7 @@ void ReducedModelOptimizer::computeReducedModelSimulationJob(
fullModelNodalForcedRotation.second;
}
simulationJobOfReducedModel = SimulationJob{pReducedModelElementalMesh,
simulationJobOfReducedModel = SimulationJob{m_pReducedPatternElementalMesh,
reducedModelFixedVertices,
reducedModelNodalForces,
{},
@ -383,8 +383,8 @@ void ReducedModelOptimizer::computeDesiredReducedModelDisplacements(
Eigen::MatrixX3d &optimalDisplacementsOfReducedModel) {
optimalDisplacementsOfReducedModel.resize(0, 3);
optimalDisplacementsOfReducedModel.resize(pReducedModelElementalMesh->VN(),
3);
optimalDisplacementsOfReducedModel.resize(
m_pReducedPatternElementalMesh->VN(), 3);
optimalDisplacementsOfReducedModel.setZero(
optimalDisplacementsOfReducedModel.rows(),
optimalDisplacementsOfReducedModel.cols());
@ -403,20 +403,21 @@ void ReducedModelOptimizer::computeDesiredReducedModelDisplacements(
Eigen::VectorXd ReducedModelOptimizer::optimizeForSimulationJob(
const SimulationJob &fullPatternSimulationJob) {
gObjectiveValueHistory.clear();
// fullPatternSimulationJob.registerForDrawing();
// polyscope::show();
gObjectiveValueHistory.clear();
fullPatternSimulationJob.mesh->savePly(
"Fanned_" + pFullModelElementalMesh->getLabel() + ".ply");
"Fanned_" + m_pFullModelElementalMesh->getLabel() + ".ply");
SimulationResults fullModelResults =
simulator.executeSimulation(fullPatternSimulationJob, false, true);
fullModelResults.simulationLabel = "fullModel";
fullModelResults.registerForDrawing(fullPatternSimulationJob);
registerWorldAxes();
polyscope::show();
computeDesiredReducedModelDisplacements(fullModelResults,
g_optimalReducedModelDisplacements);
computeReducedModelSimulationJob(fullPatternSimulationJob,
g_reducedPatternSimulationJob);
// fullModelSimulationJob.registerForDrawing();
// polyscope::show();
// gReducedPatternSimulationJob.registerForDrawing();
// polyscope::show();
fullModelResults.registerForDrawing(fullPatternSimulationJob);
@ -490,12 +491,31 @@ std::vector<SimulationJob> ReducedModelOptimizer::createScenarios(
std::vector<SimulationJob> scenarios;
std::unordered_map<VertexIndex, std::unordered_set<DoFType>> fixedVertices;
std::unordered_map<VertexIndex, Vector6d> nodalForces;
std::unordered_map<VertexIndex, VectorType> nodalForcedNormals;
const double forceMagnitude = 1;
// Assuming the patterns lays on the x-y plane
const CoordType patternPlaneNormal(0, 0, 1);
// Make the first interface node lay on the x axis
const size_t fullPatternFirstInterfaceNodeIndex =
m_fullPatternOppositeInterfaceViMap.begin()->second;
CoordType fullPatternFirstInterfaceNodePosition =
m_pFullModelElementalMesh->vert[fullPatternFirstInterfaceNodeIndex].cP();
const vcg::Matrix33d R = vcg::RotationMatrix(
fullPatternFirstInterfaceNodePosition,
CoordType(fullPatternFirstInterfaceNodePosition.Norm(), 0, 0), false);
std::for_each(m_pFullModelElementalMesh->vert.begin(),
m_pFullModelElementalMesh->vert.end(), [&](auto &v) {
v.P() = R * v.P();
v.N() = R * v.N();
});
std::for_each(m_pReducedPatternElementalMesh->vert.begin(),
m_pReducedPatternElementalMesh->vert.end(), [&](auto &v) {
v.P() = R * v.P();
v.N() = R * v.N();
});
m_pFullModelElementalMesh->updateEigenEdgeAndVertices();
m_pReducedPatternElementalMesh->updateEigenEdgeAndVertices();
// // Axial
// //// Axial
// for (const auto &viPair : m_fullPatternOppositeInterfaceViMap) {
// CoordType forceDirection =
// (pMesh->vert[viPair.first].cP() - pMesh->vert[viPair.second].cP())
@ -509,7 +529,7 @@ std::vector<SimulationJob> ReducedModelOptimizer::createScenarios(
// }
// scenarios.push_back({pMesh, fixedVertices, nodalForces, {}});
// // In-plane Bending
// //// In-plane Bending
// fixedVertices.clear();
// nodalForces.clear();
// for (const auto &viPair : m_fullPatternOppositeInterfaceViMap) {
@ -526,7 +546,7 @@ std::vector<SimulationJob> ReducedModelOptimizer::createScenarios(
// }
// scenarios.push_back({pMesh, fixedVertices, nodalForces, {}});
// // Torsion
// //// Torsion
// fixedVertices.clear();
// nodalForces.clear();
// for (auto viPairIt = m_fullPatternOppositeInterfaceViMap.begin();
@ -537,125 +557,83 @@ std::vector<SimulationJob> ReducedModelOptimizer::createScenarios(
// (pMesh->vert[viPair.first].cP() - pMesh->vert[viPair.second].cP())
// .Normalize();
// CoordType normalVDerivativeDir = (v ^ patternPlaneNormal).Normalize();
// fixedVertices[viPair.first] = std::unordered_set<DoFType>{0, 1, 2};
// nodalForcedNormals[viPair.first] = normalVDerivativeDir;
// } else {
// fixedVertices[viPair.first] =
// nodalForces[viPair.first] = Vector6d{
// 0, 0, 0, normalVDerivativeDir[0], normalVDerivativeDir[1], 0};
// fixedVertices[viPair.second] =
// std::unordered_set<DoFType>{0, 1, 2, 3, 4, 5};
// fixedVertices[viPair.first] = std::unordered_set<DoFType>{0, 1, 2};
// } else {
// fixedVertices[viPair.first] = std::unordered_set<DoFType>{0, 1, 2};
// fixedVertices[viPair.second] = std::unordered_set<DoFType>{0, 1, 2};
// }
// fixedVertices[viPair.second] =
// std::unordered_set<DoFType>{0, 1, 2, 3, 4, 5};
// }
// scenarios.push_back(
// {pMesh, fixedVertices, nodalForces, {}, nodalForcedNormals});
// scenarios.push_back({pMesh, fixedVertices, nodalForces});
// // Out - of - plane bending.Pull towards Z
// fixedVertices.clear();
// nodalForces.clear();
// for (const auto &viPair : m_fullPatternOppositeInterfaceViMap) {
// nodalForces[viPair.first] = Vector6d({0, 0, forceMagnitude, 0, 0, 0}) *
// 2; fixedVertices[viPair.second] =
// 1; fixedVertices[viPair.second] =
// std::unordered_set<DoFType>{0, 1, 2, 3, 4, 5};
// }
// scenarios.push_back({pMesh, fixedVertices, nodalForces, {}});
// Double
// fixedVertices.clear();
// nodalForces.clear();
// nodalForcedNormals.clear();
// int counter = 0;
// for (const auto &viPair : m_fullPatternOppositeInterfaceViMap) {
// CoordType v =
// (pMesh->vert[viPair.first].cP() - pMesh->vert[viPair.second].cP())
// .Normalize();
// nodalForcedNormals[viPair.first] = -v;
// if (counter++ == 1) {
// fixedVertices[viPair.first] = std::unordered_set<DoFType>{0};
// } else {
// fixedVertices[viPair.first] = std::unordered_set<DoFType>{0, 1, 2};
// }
// fixedVertices[viPair.second] = std::unordered_set<DoFType>{0, 1, 2};
// }
// scenarios.push_back(
// {pMesh, fixedVertices, nodalForces, {}, nodalForcedNormals});
// Double
fixedVertices.clear();
nodalForces.clear();
for (const auto &viPair : m_fullPatternOppositeInterfaceViMap) {
CoordType v =
(pMesh->vert[viPair.first].cP() - pMesh->vert[viPair.second].cP())
.Normalize();
CoordType momentDirection = patternPlaneNormal ^ v;
nodalForces[viPair.first] =
Vector6d({0, 0, 0, momentDirection[1], momentDirection[0], 0}) *
forceMagnitude;
fixedVertices[viPair.first] = std::unordered_set<DoFType>{2};
fixedVertices[viPair.second] = std::unordered_set<DoFType>{0, 1, 2};
}
scenarios.push_back({pMesh, fixedVertices, nodalForces, {}});
//// Saddle using moments
// //// Double using moments
// fixedVertices.clear();
// nodalForces.clear();
// for (auto viPairIt = m_fullPatternOppositeInterfaceViMap.begin();
// viPairIt != m_fullPatternOppositeInterfaceViMap.end(); viPairIt++) {
// const auto &viPair = *viPairIt;
// const auto viPair = *viPairIt;
// if (viPairIt == m_fullPatternOppositeInterfaceViMap.begin()) {
// fixedVertices[viPair.first] = std::unordered_set<DoFType>{0, 1, 2};
// fixedVertices[viPair.second] = std::unordered_set<DoFType>{1, 2};
// } else {
// fixedVertices[viPair.first] = std::unordered_set<DoFType>{2};
// fixedVertices[viPair.second] = std::unordered_set<DoFType>{2};
// }
// CoordType v =
// (pMesh->vert[viPair.first].cP() - pMesh->vert[viPair.second].cP())
// .Normalize();
// // CoordType momentDirection = (patternPlane ^ v).Normalize();
// if (viPairIt == m_fullPatternOppositeInterfaceViMap.begin()) {
// nodalForces[viPair.first] =
// Vector6d({0, 0, 0, v[0], v[1], 0}) * 5 * forceMagnitude;
// nodalForces[viPair.second] =
// Vector6d({0, 0, 0, -v[0], -v[1], 0}) * 5 * forceMagnitude;
// } else {
// fixedVertices[viPair.first] = std::unordered_set<DoFType>{2};
// // nodalForces[viPair.first] =
// // Vector6d({0, 0, 0, -v[0], -v[1], 0}) * 2 * forceMagnitude;
// fixedVertices[viPair.second] = std::unordered_set<DoFType>{2};
// nodalForces[viPair.first] =
// Vector6d({0, 0, 0, -v[0], -v[1], 0}) * 2 * forceMagnitude;
// nodalForces[viPair.second] =
// Vector6d({0, 0, 0, v[0], v[1], 0}) * 2 * forceMagnitude;
// }
// nodalForces[viPair.first] =
// Vector6d({0, 0, 0, v[0], v[1], 0}) * forceMagnitude * 0.1;
// nodalForces[viPair.second] =
// Vector6d({0, 0, 0, -v[0], -v[1], 0}) * forceMagnitude * 0.1;
// }
// scenarios.push_back({pMesh, fixedVertices, nodalForces, {}});
//// Saddle using forced normals
//// Saddle
fixedVertices.clear();
nodalForces.clear();
nodalForcedNormals.clear();
for (auto viPairIt = m_fullPatternOppositeInterfaceViMap.begin();
viPairIt != m_fullPatternOppositeInterfaceViMap.end(); viPairIt++) {
const auto &viPair = *viPairIt;
CoordType v =
(pMesh->vert[viPair.first].cP() - pMesh->vert[viPair.second].cP())
.Normalize();
// CoordType momentDirection = (patternPlane ^ v).Normalize();
if (viPairIt == m_fullPatternOppositeInterfaceViMap.begin()) {
nodalForcedNormals[viPair.first] = v;
nodalForcedNormals[viPair.second] = -v;
nodalForces[viPair.first] =
Vector6d({0, 0, 0, v[0], v[1], 0}) * 0.02 * forceMagnitude;
nodalForces[viPair.second] =
Vector6d({0, 0, 0, -v[0], -v[1], 0}) * 0.02 * forceMagnitude;
} else {
fixedVertices[viPair.first] = std::unordered_set<DoFType>{2};
fixedVertices[viPair.second] = std::unordered_set<DoFType>{0, 1, 2};
nodalForcedNormals[viPair.first] = -v;
nodalForcedNormals[viPair.second] = v;
nodalForces[viPair.first] =
Vector6d({0, 0, 0, -v[0], -v[1], 0}) * 0.01 * forceMagnitude;
nodalForces[viPair.second] =
Vector6d({0, 0, 0, v[0], v[1], 0}) * 0.01 * forceMagnitude;
}
fixedVertices[viPair.first] = std::unordered_set<DoFType>{0, 1, 2};
fixedVertices[viPair.second] = std::unordered_set<DoFType>{0, 1, 2};
}
scenarios.push_back(
{pMesh, fixedVertices, nodalForces, {}, nodalForcedNormals});
scenarios.push_back({pMesh, fixedVertices, nodalForces, {}});
return scenarios;
}
Eigen::VectorXd ReducedModelOptimizer::optimize() {
std::vector<SimulationJob> simulationJobs =
createScenarios(pFullModelElementalMesh);
createScenarios(m_pFullModelElementalMesh);
std::vector<Eigen::VectorXd> results;
for (const SimulationJob &job : simulationJobs) {
polyscope::removeAllStructures();

View File

@ -7,15 +7,15 @@
#include "matplot/matplot.h"
#include <Eigen/Dense>
using FullModelVertexIndex = VertexIndex;
using ReducedModelVertexIndex = VertexIndex;
using FullPatternVertexIndex = VertexIndex;
using ReducedPatternVertexIndex = VertexIndex;
class ReducedModelOptimizer {
std::shared_ptr<SimulationMesh> pReducedModelElementalMesh;
std::shared_ptr<SimulationMesh> pFullModelElementalMesh;
std::unordered_map<FullModelVertexIndex, ReducedModelVertexIndex>
std::shared_ptr<SimulationMesh> m_pReducedPatternElementalMesh;
std::shared_ptr<SimulationMesh> m_pFullModelElementalMesh;
std::unordered_map<FullPatternVertexIndex, ReducedPatternVertexIndex>
m_fullToReducedInterfaceViMap;
std::unordered_map<ReducedModelVertexIndex, ReducedModelVertexIndex>
std::unordered_map<FullPatternVertexIndex, FullPatternVertexIndex>
m_fullPatternOppositeInterfaceViMap;
std::unordered_map<size_t, size_t> nodeToSlot;
std::unordered_map<size_t, std::unordered_set<size_t>> slotToNode;