Browse Source

change BC: only apply on surface

master
Chen Wei 2 years ago
parent
commit
eec868875a
  1. 130
      src/static_sim/StaticSim.cpp

130
src/static_sim/StaticSim.cpp

@ -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_

Loading…
Cancel
Save