fix numerical issues in stability calculations
This commit is contained in:
parent
90e77f9135
commit
9cfde724f1
1 changed files with 10 additions and 1 deletions
|
@ -638,12 +638,14 @@ public:
|
||||||
|
|
||||||
auto compute_elastic_section_modulus = [&line_dir](
|
auto compute_elastic_section_modulus = [&line_dir](
|
||||||
const Vec3f ¢roid_accumulator, const Vec2f &second_moment_of_area_accumulator, const float &area) {
|
const Vec3f ¢roid_accumulator, const Vec2f &second_moment_of_area_accumulator, const float &area) {
|
||||||
if (area < EPSILON) return 0.0f;
|
|
||||||
Vec3f centroid = centroid_accumulator / area;
|
Vec3f centroid = centroid_accumulator / area;
|
||||||
Vec2f variance = (second_moment_of_area_accumulator / area
|
Vec2f variance = (second_moment_of_area_accumulator / area
|
||||||
- centroid.head<2>().cwiseProduct(centroid.head<2>()));
|
- centroid.head<2>().cwiseProduct(centroid.head<2>()));
|
||||||
variance = variance.cwiseProduct(line_dir.cwiseAbs());
|
variance = variance.cwiseProduct(line_dir.cwiseAbs());
|
||||||
float extreme_fiber_dist = variance.cwiseSqrt().norm();
|
float extreme_fiber_dist = variance.cwiseSqrt().norm();
|
||||||
|
if (extreme_fiber_dist < EPSILON) {
|
||||||
|
return 0.0f;
|
||||||
|
}
|
||||||
float elastic_section_modulus = area * (variance.x() + variance.y()) / extreme_fiber_dist;
|
float elastic_section_modulus = area * (variance.x() + variance.y()) / extreme_fiber_dist;
|
||||||
return elastic_section_modulus;
|
return elastic_section_modulus;
|
||||||
};
|
};
|
||||||
|
@ -663,6 +665,9 @@ public:
|
||||||
|
|
||||||
// section for bed calculations
|
// section for bed calculations
|
||||||
{
|
{
|
||||||
|
if (this->sticking_area < EPSILON)
|
||||||
|
return 1.0f;
|
||||||
|
|
||||||
Vec3f bed_centroid = this->sticking_centroid_accumulator / this->sticking_area;
|
Vec3f bed_centroid = this->sticking_centroid_accumulator / this->sticking_area;
|
||||||
float bed_yield_torque = compute_elastic_section_modulus(this->sticking_centroid_accumulator,
|
float bed_yield_torque = compute_elastic_section_modulus(this->sticking_centroid_accumulator,
|
||||||
this->sticking_second_moment_of_area_accumulator, this->sticking_area)
|
this->sticking_second_moment_of_area_accumulator, this->sticking_area)
|
||||||
|
@ -708,6 +713,9 @@ public:
|
||||||
|
|
||||||
//section for weak connection calculations
|
//section for weak connection calculations
|
||||||
{
|
{
|
||||||
|
if (connection.area < EPSILON)
|
||||||
|
return 1.0f;
|
||||||
|
|
||||||
Vec3f conn_centroid = connection.centroid_accumulator / connection.area;
|
Vec3f conn_centroid = connection.centroid_accumulator / connection.area;
|
||||||
float conn_yield_torque = compute_elastic_section_modulus(connection.centroid_accumulator,
|
float conn_yield_torque = compute_elastic_section_modulus(connection.centroid_accumulator,
|
||||||
connection.second_moment_of_area_accumulator, connection.area) * params.material_yield_strength;
|
connection.second_moment_of_area_accumulator, connection.area) * params.material_yield_strength;
|
||||||
|
@ -763,6 +771,7 @@ void debug_print_graph(const std::vector<LayerIslands> &islands_graph) {
|
||||||
std::cout << " volume: " << island.volume << std::endl;
|
std::cout << " volume: " << island.volume << std::endl;
|
||||||
std::cout << " sticking_area: " << island.sticking_area << std::endl;
|
std::cout << " sticking_area: " << island.sticking_area << std::endl;
|
||||||
std::cout << " connected_islands count: " << island.connected_islands.size() << std::endl;
|
std::cout << " connected_islands count: " << island.connected_islands.size() << std::endl;
|
||||||
|
std::cout << " lines count: " << island.external_lines.size() << std::endl;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
std::cout << "END OF GRAPH" << std::endl;
|
std::cout << "END OF GRAPH" << std::endl;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue