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