Browse Source

add updateBC

master
Chen Wei 2 years ago
parent
commit
90b2f952a4
  1. 2
      CMakeLists.txt
  2. 19
      sim-test/rigid-test/rocker-arm/config.json.in
  3. BIN
      sim-test/rigid-test/rocker-arm/rocker-arm_.msh
  4. 6
      src/viewer/UIStaticMenu.cpp
  5. 13
      src/viewer/UIStaticSimState.h
  6. 27
      static_sim/StaticSim.cpp
  7. 5
      static_sim/StaticSim.h

2
CMakeLists.txt

@ -367,4 +367,4 @@ add_subdirectory(sim-test/rigid-test)
# IPC link static simulation
target_link_libraries(rigid_ipc_sim PUBLIC StaticSim)
add_compile_definitions(DEBUG_SSIM)
#add_compile_definitions(DEBUG_SSIM)

19
sim-test/rigid-test/rocker-arm/config.json.in

@ -0,0 +1,19 @@
{
"material": [1e5, 0.3, 1e3],
"mshFilePath": "@LOCAL_DIR@/rocker-arm_.msh",
"DBC": [
{
"min": [-0.001, 0.8, 0.8],
"max": [1.001, 1.1, 1.1]
}
],
"NBC": [
{
"min": [-0.001, 0.25, -0.001],
"max": [1.001, 0.4, 0.1],
"force": [0, -10, 0]
}
]
}

BIN
sim-test/rigid-test/rocker-arm/rocker-arm_.msh

Binary file not shown.

6
src/viewer/UIStaticMenu.cpp

@ -171,10 +171,11 @@ namespace ipc::rigid {
std::vector<float> v_max_point = {(float) i_DBC.relMaxBBox.x(), (float) i_DBC.relMaxBBox.y(),
(float) i_DBC.relMaxBBox.z()};
ImGui::InputFloat3(("Dirichlet最小值 " + std::to_string(i + 1)).c_str(), v_min_point.data());
ImGui::InputFloat3(("Dirichlet最大值 " + std::to_string(i + 1)).c_str(), v_min_point.data());
ImGui::InputFloat3(("Dirichlet最大值 " + std::to_string(i + 1)).c_str(), v_max_point.data());
i_DBC.relMinBBox = {v_min_point[0], v_min_point[1], v_min_point[2]};
i_DBC.relMaxBBox = {v_max_point[0], v_max_point[1], v_max_point[2]};
}
sp_StaticSim_->updateBC();
}
@ -192,12 +193,13 @@ namespace ipc::rigid {
(float) i_NBC.force.z()};
ImGui::InputFloat3(("Neumann最小值 " + std::to_string(i + 1)).c_str(), v_min_point.data());
ImGui::InputFloat3(("Neumann最大值 " + std::to_string(i + 1)).c_str(), v_min_point.data());
ImGui::InputFloat3(("Neumann最大值 " + std::to_string(i + 1)).c_str(), v_max_point.data());
ImGui::InputFloat3(("Neumann力 " + std::to_string(i + 1)).c_str(), v_force.data());
i_NBC.relMinBBox = {v_min_point[0], v_min_point[1], v_min_point[2]};
i_NBC.relMaxBBox = {v_max_point[0], v_max_point[1], v_max_point[2]};
i_NBC.force={v_force[0],v_force[1],v_force[2]};
}
sp_StaticSim_->updateBC();
}

13
src/viewer/UIStaticSimState.h

@ -218,18 +218,19 @@ namespace ipc {
// Eigen::MatrixXd ends = starts.array() + 0.1 * longest_size * N.array();
// viewer->data().add_edges(starts, ends, Eigen::RowVector3d(0, 0, 1));
for (int i = 0; i < sp_StaticSim_->DirichletBCs.size(); ++i) {
auto [V, F] = get_V_F_from_bd_box(sp_StaticSim_->DirichletBCs[i].relMinBBox,
sp_StaticSim_->DirichletBCs[i].relMaxBBox);
auto [V, F] = get_V_F_from_bd_box(sp_StaticSim_->DirichletBCs[i].absMinBBox,
sp_StaticSim_->DirichletBCs[i].absMaxBBox);
viewer->data(i + 1).set_mesh(V, F);
viewer->data(i + 1).set_colors(Eigen::RowVector3d(1, 0, 0));
viewer->data(i + 1).set_colors(Eigen::RowVector4d(1, 0, 0, 0.5));
viewer->data(i + 1).is_visible = gui_ctrl_.is_visible_BC;
}
for (int i = 0; i < sp_StaticSim_->NeumannBCs.size(); ++i) {
auto [V, F] = get_V_F_from_bd_box(sp_StaticSim_->NeumannBCs[i].relMinBBox,
sp_StaticSim_->NeumannBCs[i].relMaxBBox);
auto [V, F] = get_V_F_from_bd_box(sp_StaticSim_->NeumannBCs[i].absMinBBox,
sp_StaticSim_->NeumannBCs[i].absMaxBBox);
viewer->data(i + 1 + sp_StaticSim_->DirichletBCs.size()).set_mesh(V, F);
viewer->data(i + 1 + sp_StaticSim_->DirichletBCs.size()).set_colors(Eigen::RowVector3d(0, 0, 1));
viewer->data(i + 1 + sp_StaticSim_->DirichletBCs.size()).set_colors(
Eigen::RowVector4d(0, 0, 1, 0.5));
viewer->data(i + 1 + sp_StaticSim_->DirichletBCs.size()).is_visible = gui_ctrl_.is_visible_BC;
}

27
static_sim/StaticSim.cpp

@ -65,6 +65,22 @@ namespace ssim {
void StaticSim::simulation() {
{ // update BC
Eigen::Vector3d modelMinBBox = TV.colwise().minCoeff();
Eigen::Vector3d modelMaxBBox = TV.colwise().maxCoeff();
for (auto &DBC: DirichletBCs) {
DBC.calcAbsBBox(modelMinBBox, modelMaxBBox);
}
for (auto &NBC: NeumannBCs) {
NBC.calcAbsBBox(modelMinBBox, modelMaxBBox);
}
setBC();
}
{ // update material
Utils::elasticMatrix(material_property_.Youngs_Modulus, material_property_.Poisson_ratio, D);
}
int ENUM_SIZE = SimTargetOption::Target::ENUM_SIZE;
map_target_to_evaluated_.clear();
map_target_to_evaluated_.resize(ENUM_SIZE);
@ -81,6 +97,17 @@ namespace ssim {
}
}
void StaticSim::updateBC() {
Eigen::Vector3d modelMinBBox = TV.colwise().minCoeff();
Eigen::Vector3d modelMaxBBox = TV.colwise().maxCoeff();
for (auto &DBC: DirichletBCs) {
DBC.calcAbsBBox(modelMinBBox, modelMaxBBox);
}
for (auto &NBC: NeumannBCs) {
NBC.calcAbsBBox(modelMinBBox, modelMaxBBox);
}
}
void StaticSim::prepare_surf_result() {
surf_U_.resize(SVI.size(), 3);
surf_stress_.resize(SVI.size(), 6);

5
static_sim/StaticSim.h

@ -62,6 +62,11 @@ namespace ssim {
void simulation();
/**
* update BC's absBBox
*/
void updateBC();
/**
* Given query points Q, compute their displacements and stress

Loading…
Cancel
Save