|
@ -420,61 +420,6 @@ namespace ssim { |
|
|
|
|
|
|
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
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 nI = 0; nI < nN; ++nI) { |
|
|
|
|
|
Eigen::Vector3d p = TV.row(nI); |
|
|
|
|
|
for (int _i = 0; _i < DBCNum; ++_i) { |
|
|
|
|
|
if (DirichletBCs[_i].inDBC(p)) { |
|
|
|
|
|
DBC_nI(nDBC) = nI; |
|
|
|
|
|
isDBC(nI) = 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 nI = 0; nI < nN; ++nI) { |
|
|
|
|
|
Eigen::Vector3d p = TV.row(nI); |
|
|
|
|
|
for (int _i = 0; _i < NBCNum; ++_i) { |
|
|
|
|
|
if (NeumannBCs[_i].inNBC(p)) { |
|
|
|
|
|
load.segment<DIM_>(nI * DIM_) = NeumannBCs[_i].force; |
|
|
|
|
|
NBC_nI(nNBC) = nI; |
|
|
|
|
|
++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(); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// BC only apply on surface nodes
|
|
|
|
|
|
// void StaticSim::setBC() {
|
|
|
// void StaticSim::setBC() {
|
|
|
// spdlog::info("set Boundary Conditions");
|
|
|
// spdlog::info("set Boundary Conditions");
|
|
|
//
|
|
|
//
|
|
@ -483,13 +428,12 @@ namespace ssim { |
|
|
// DBC_nI.resize(nN);
|
|
|
// DBC_nI.resize(nN);
|
|
|
// isDBC.setZero(nN);
|
|
|
// isDBC.setZero(nN);
|
|
|
// int DBCNum = (int) DirichletBCs.size();
|
|
|
// int DBCNum = (int) DirichletBCs.size();
|
|
|
// for (int svI = 0; svI < SVI.size(); ++svI) {
|
|
|
// for (int nI = 0; nI < nN; ++nI) {
|
|
|
// int vI = SVI(svI);
|
|
|
// Eigen::Vector3d p = TV.row(nI);
|
|
|
// Eigen::Vector3d p = TV.row(vI);
|
|
|
|
|
|
// for (int _i = 0; _i < DBCNum; ++_i) {
|
|
|
// for (int _i = 0; _i < DBCNum; ++_i) {
|
|
|
// if (DirichletBCs[_i].inDBC(p)) {
|
|
|
// if (DirichletBCs[_i].inDBC(p)) {
|
|
|
// DBC_nI(nDBC) = vI;
|
|
|
// DBC_nI(nDBC) = nI;
|
|
|
// isDBC(vI) = 1;
|
|
|
// isDBC(nI) = 1;
|
|
|
// ++nDBC;
|
|
|
// ++nDBC;
|
|
|
//
|
|
|
//
|
|
|
// break;
|
|
|
// break;
|
|
@ -505,13 +449,12 @@ namespace ssim { |
|
|
// int nNBC = 0;
|
|
|
// int nNBC = 0;
|
|
|
// Eigen::VectorXi NBC_nI(nN);
|
|
|
// Eigen::VectorXi NBC_nI(nN);
|
|
|
// int NBCNum = (int) NeumannBCs.size();
|
|
|
// int NBCNum = (int) NeumannBCs.size();
|
|
|
// for (int svI = 0; svI < SVI.size(); ++svI) {
|
|
|
// for (int nI = 0; nI < nN; ++nI) {
|
|
|
// int vI = SVI(svI);
|
|
|
// Eigen::Vector3d p = TV.row(nI);
|
|
|
// Eigen::Vector3d p = TV.row(vI);
|
|
|
|
|
|
// for (int _i = 0; _i < NBCNum; ++_i) {
|
|
|
// for (int _i = 0; _i < NBCNum; ++_i) {
|
|
|
// if (NeumannBCs[_i].inNBC(p)) {
|
|
|
// if (NeumannBCs[_i].inNBC(p)) {
|
|
|
// load.segment<DIM_>(vI * DIM_) = NeumannBCs[_i].force;
|
|
|
// load.segment<DIM_>(nI * DIM_) = NeumannBCs[_i].force;
|
|
|
// NBC_nI(nNBC) = vI;
|
|
|
// NBC_nI(nNBC) = nI;
|
|
|
// ++nNBC;
|
|
|
// ++nNBC;
|
|
|
//
|
|
|
//
|
|
|
// break;
|
|
|
// break;
|
|
@ -531,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_
|
|
|