|
@ -361,6 +361,10 @@ namespace ssim { |
|
|
); |
|
|
); |
|
|
#endif |
|
|
#endif |
|
|
|
|
|
|
|
|
|
|
|
for (int dofI = 0; dofI < nDof; ++dofI) { |
|
|
|
|
|
linSysSolver->addCoeff(dofI, dofI, 1e-5); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
void StaticSim::solve() { |
|
|
void StaticSim::solve() { |
|
@ -470,6 +474,63 @@ namespace ssim { |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// BC only apply on surface nodes
|
|
|
|
|
|
// void StaticSim::setBC() {
|
|
|
|
|
|
// spdlog::info("set Boundary Conditions");
|
|
|
|
|
|
//
|
|
|
|
|
|
// // DBC
|
|
|
|
|
|
// int nDBC = 0;
|
|
|
|
|
|
// DBC_nI.resize(nN);
|
|
|
|
|
|
// isDBC.setZero(nN);
|
|
|
|
|
|
// int DBCNum = (int) DirichletBCs.size();
|
|
|
|
|
|
// for (int svI = 0; svI < SVI.size(); ++svI) {
|
|
|
|
|
|
// int vI = SVI(svI);
|
|
|
|
|
|
// Eigen::Vector3d p = TV.row(vI);
|
|
|
|
|
|
// for (int _i = 0; _i < DBCNum; ++_i) {
|
|
|
|
|
|
// if (DirichletBCs[_i].inDBC(p)) {
|
|
|
|
|
|
// DBC_nI(nDBC) = vI;
|
|
|
|
|
|
// isDBC(vI) = 1;
|
|
|
|
|
|
// ++nDBC;
|
|
|
|
|
|
//
|
|
|
|
|
|
// break;
|
|
|
|
|
|
// }
|
|
|
|
|
|
// }
|
|
|
|
|
|
// }
|
|
|
|
|
|
// DBC_nI.conservativeResize(nDBC);
|
|
|
|
|
|
// // Utils::writeOBJ(outputPath + "DBCV.obj", TV(DBC_nI, Eigen::all),
|
|
|
|
|
|
// // Eigen::VectorXi::LinSpaced(nDBC, 0, nDBC-1));
|
|
|
|
|
|
// // NBC
|
|
|
|
|
|
// load.resize(0);
|
|
|
|
|
|
// load.setZero(nDof);
|
|
|
|
|
|
// int nNBC = 0;
|
|
|
|
|
|
// Eigen::VectorXi NBC_nI(nN);
|
|
|
|
|
|
// int NBCNum = (int) NeumannBCs.size();
|
|
|
|
|
|
// for (int svI = 0; svI < SVI.size(); ++svI) {
|
|
|
|
|
|
// int vI = SVI(svI);
|
|
|
|
|
|
// Eigen::Vector3d p = TV.row(vI);
|
|
|
|
|
|
// for (int _i = 0; _i < NBCNum; ++_i) {
|
|
|
|
|
|
// if (NeumannBCs[_i].inNBC(p)) {
|
|
|
|
|
|
// load.segment<DIM_>(vI * DIM_) = NeumannBCs[_i].force;
|
|
|
|
|
|
// NBC_nI(nNBC) = vI;
|
|
|
|
|
|
// ++nNBC;
|
|
|
|
|
|
//
|
|
|
|
|
|
// break;
|
|
|
|
|
|
// }
|
|
|
|
|
|
// }
|
|
|
|
|
|
// }
|
|
|
|
|
|
// NBC_nI.conservativeResize(nNBC);
|
|
|
|
|
|
// // Utils::writeOBJ(outputPath + "NBCV.obj", TV(NBC_nI, Eigen::all),
|
|
|
|
|
|
// // Eigen::VectorXi::LinSpaced(nNBC, 0, nNBC-1));
|
|
|
|
|
|
//
|
|
|
|
|
|
// spdlog::info("#DBC nodes: {}, #NBC particles: {}", nDBC, nNBC);
|
|
|
|
|
|
//
|
|
|
|
|
|
// // ensure (DBC intersect NBC) = (empty)
|
|
|
|
|
|
// for (int i_ = 0; i_ < DBC_nI.size(); ++i_) {
|
|
|
|
|
|
// int nI = DBC_nI(i_);
|
|
|
|
|
|
// load.segment<DIM_>(nI * DIM_).setZero();
|
|
|
|
|
|
// }
|
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
Model StaticSim::get_mesh() { |
|
|
Model StaticSim::get_mesh() { |
|
|
if (mesh_.NumVertex() == 0) { |
|
|
if (mesh_.NumVertex() == 0) { |
|
|
// fill mesh_
|
|
|
// fill mesh_
|
|
|