diff --git a/sim-test/rigid-test/rearAxle-mod/config.json b/sim-test/rigid-test/rearAxle-mod/config.json index 4e98b13..9fb800c 100644 --- a/sim-test/rigid-test/rearAxle-mod/config.json +++ b/sim-test/rigid-test/rearAxle-mod/config.json @@ -4,21 +4,21 @@ "DBC": [ { - "min": [-0.1, 0.4, -0.1], - "max": [0.6, 0.6, 1.1] + "min": [-0.01, 0.4, 0.3], + "max": [0.07, 0.6, 0.6] } ], "NBC": [ { - "min": [-0.1, 0.8, -0.1], - "max": [1.1, 1.1, 1.1], - "force": [1, 0, 0] + "min": [0.3, -0.01, 0.2], + "max": [0.6, 0.05, 0.6], + "force": [0, 1, 0] }, { - "min": [-0.1, -0.1, -0.1], - "max": [1.1, 0.2, 1.1], - "force": [1, 0, 0] + "min": [0.3, 0.95, 0.2], + "max": [0.6, 1.01, 0.6], + "force": [0, -1, 0] } ] } diff --git a/sim-test/rigid-test/rearAxle-mod/config.json.in b/sim-test/rigid-test/rearAxle-mod/config.json.in index db267c8..ab4783e 100644 --- a/sim-test/rigid-test/rearAxle-mod/config.json.in +++ b/sim-test/rigid-test/rearAxle-mod/config.json.in @@ -4,21 +4,21 @@ "DBC": [ { - "min": [-0.1, 0.4, -0.1], - "max": [0.6, 0.6, 1.1] + "min": [-0.01, 0.4, 0.3], + "max": [0.07, 0.6, 0.6] } ], "NBC": [ { - "min": [-0.1, 0.8, -0.1], - "max": [1.1, 1.1, 1.1], - "force": [1, 0, 0] + "min": [0.3, -0.01, 0.2], + "max": [0.6, 0.05, 0.6], + "force": [0, 1, 0] }, { - "min": [-0.1, -0.1, -0.1], - "max": [1.1, 0.2, 1.1], - "force": [1, 0, 0] + "min": [0.3, 0.95, 0.2], + "max": [0.6, 1.01, 0.6], + "force": [0, -1, 0] } ] } diff --git a/src/static_sim/StaticSim.cpp b/src/static_sim/StaticSim.cpp index d3d8ac9..51bb387 100644 --- a/src/static_sim/StaticSim.cpp +++ b/src/static_sim/StaticSim.cpp @@ -361,6 +361,10 @@ namespace ssim { ); #endif + for (int dofI = 0; dofI < nDof; ++dofI) { + linSysSolver->addCoeff(dofI, dofI, 1e-5); + } + } 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(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(nI * DIM_).setZero(); + // } + // } + Model StaticSim::get_mesh() { if (mesh_.NumVertex() == 0) { // fill mesh_