diff --git a/CMakeLists.txt b/CMakeLists.txt index 0f6f09a..0c20328 100644 --- a/CMakeLists.txt +++ b/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) \ No newline at end of file +#add_compile_definitions(DEBUG_SSIM) \ No newline at end of file diff --git a/sim-test/rigid-test/rocker-arm/config.json.in b/sim-test/rigid-test/rocker-arm/config.json.in new file mode 100644 index 0000000..7506b15 --- /dev/null +++ b/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] + } + ] +} diff --git a/sim-test/rigid-test/rocker-arm/rocker-arm_.msh b/sim-test/rigid-test/rocker-arm/rocker-arm_.msh new file mode 100644 index 0000000..5eb2f50 Binary files /dev/null and b/sim-test/rigid-test/rocker-arm/rocker-arm_.msh differ diff --git a/src/viewer/UIStaticMenu.cpp b/src/viewer/UIStaticMenu.cpp index 973c625..11e3a37 100644 --- a/src/viewer/UIStaticMenu.cpp +++ b/src/viewer/UIStaticMenu.cpp @@ -171,10 +171,11 @@ namespace ipc::rigid { std::vector 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(); } diff --git a/src/viewer/UIStaticSimState.h b/src/viewer/UIStaticSimState.h index 2e8e0a9..6564d0c 100644 --- a/src/viewer/UIStaticSimState.h +++ b/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; } diff --git a/static_sim/StaticSim.cpp b/static_sim/StaticSim.cpp index f221286..028ef9b 100644 --- a/static_sim/StaticSim.cpp +++ b/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); diff --git a/static_sim/StaticSim.h b/static_sim/StaticSim.h index 1d257f3..b85b598 100644 --- a/static_sim/StaticSim.h +++ b/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