Finalized the simulation scenarios. Left out the torsion scenario.
This commit is contained in:
parent
4d4aa346b5
commit
b0ba64d499
145
src/main.cpp
145
src/main.cpp
|
|
@ -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";
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Reference in New Issue