29 个版本 (12 个重大变更)
| 0.13.0 | 2023 年 10 月 29 日 |
|---|---|
| 0.11.0 | 2023 年 10 月 23 日 |
#659 in 算法
200KB
942 行
QTruss
2D 桁架的简单有限元求解器。
入门指南
导入 maria-linalg
为了使用此包,您必须导入 Rust 包 maria-linalg 的最新版本。
创建节点列表
首先,您必须构建一个节点列表。每个节点都必须有一个位置和约束类型。有四种类型的约束。
Constraint::Pin. 0 个自由度。一个不可移动的铰链。Constraint::Free (force). 2 个自由度。一个带有应用force的自由节点,force类型为maria_linalg::Vector<2>。请注意,这个应用力可能为零。Constraint::HorizontalSlide (force). 1 个自由度。一个带有应用force的水平滑块铰链,force类型为maria_linalg::Vector<2>。请注意,这个应用力可能为零。此铰链在 X 方向上可以自由移动,但不能在 Y 方向上移动。Constraint::VerticalSlide (force). 1 个自由度。一个带有应用force的垂直滑块铰链,force类型为maria_linalg::Vector<2>。请注意,这个应用力可能为零。此铰链在 X 方向上可以自由移动,但不能在 Y 方向上移动。
根据以下方法构建节点。
use maria_linalg::Vector;
use qtruss::{Constraint, Node};
// Note that From<[f64; N]> is implemented for Vector<N>
let n0 = Node::new(
[0.0, 1.0].into(),
Constraint::Pin,
);
// Note that From<[f64; N]> is implemented for Vector<N>
let n1 = Node::new(
[0.0, 1.0].into(),
Constraint::HorizontalSlide ([-1.0, 0.0].into()),
);
构建桁架
节点构建完成后,将它们放置在数组中,如下所示。
let nodes = [
n0,
n1,
// All the nodes
];
您现在可以开始构建您的桁架。请注意,桁架应该是可变的(mut),因为您稍后还会添加元素。此外,Truss::solve函数将结果存储在Truss结构体内部。
请注意,必须定义三个通用常量。
N: usize。该桁架中的节点数量。K: usize。该桁架中的元素数量。F: usize。该桁架中的自由度数量。截至qopt的最新版本,您必须手动计算此值。通过将每个节点的自由度数相加来计算此值(有关enum Constraint的信息,请参阅上文)。
let mut truss = Truss::<N, K, F>::new(nodes);
创建元素
根据以下模式创建元素。
truss.add(n0, n1);
此函数有两个参数。
n0: usize。此元素连接的第一个节点的nodes中的索引。n1: usize。此元素连接的第二个节点的nodes中的索引。
请注意,此元素的区域和材料将在评估时传递。这允许在特定的优化问题上提高运行时。
对桁架中的每个元素调用Truss::add。
此函数返回Option<usize>。如果提供的节点编号有效,则返回变体Some以及此元素的索引。第一次调用Truss::add的索引为0,第二次调用的索引为1,依此类推。如果提供的节点编号无效(超出nodes的范围),则此函数返回变体None。
求解桁架
let (forces, displacements) = truss.solve(areas, materials).unwrap();
此函数有两个参数。
areas: [f64; K]。桁架中每个元素的区域。materials: [Material; K]。桁架中每个元素的材料。
确定杆件力
let force: Option<f64> = truss.internal_force(areas, materials, k);
此函数有三个参数。
areas: [f64; K]。桁架中每个元素的区域。materials: [Material; K]。桁架中每个元素的材料。k: usize。所需元素的索引。这由对Truss::add的调用次数确定。第一次调用对应于k = 0,第二次调用k = 1,依此类推。
当元素处于拉伸状态时,此函数为正;当元素处于压缩状态时,此函数为负。
如果force为变体None,则存在某种阻止qtruss求解您的桁架的情况。检查您的N、K和F值,并确保您的桁架完全约束。
确定节点位移
let displacement: Option<Vector<2>> = truss.displacement(areas, materials, n);
此函数有三个参数。
areas: [f64; K]。桁架中每个元素的区域。materials: [Material; K]。桁架中每个元素的材料。n: usize. 想要的节点在nodes中的索引。
如果 displacement 的类型是 None,则阻止 qtruss 解决你的桁架。检查你的 N、K 和 F 的值,并确保你的桁架完全约束。
确定总桁架刚度
let compliance: Option<f64> = truss.compliance(areas, materials);
此函数有两个参数。
areas: [f64; K]。桁架中每个元素的区域。materials: [Material; K]。桁架中每个元素的材料。
如果 compliance 的类型是 None,则阻止 qtruss 解决你的桁架。检查你的 N、K 和 F 的值,并确保你的桁架完全约束。
确定桁架体积
let volume: f64 = truss.volume(areas);
此函数有一个参数。
areas: [f64; K]。桁架中每个元素的区域。
确定桁架制造复杂性
let complexity: f64 = truss.volume(areas, maxarea, beta);
此函数有三个参数。
areas: [f64; K]。桁架中每个元素的区域。maxarea: f64. 每个单元的面积标准化项。这应该接近最大允许面积。beta: f64. 调整正则化Heaviside分布的项。
依赖项
~5–14MB
~190K SLoC