29 个版本 (12 个重大变更)

0.13.0 2023 年 10 月 29 日
0.11.0 2023 年 10 月 23 日

#659 in 算法

MIT 许可证

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求解您的桁架的情况。检查您的NKF值,并确保您的桁架完全约束。

确定节点位移

let displacement: Option<Vector<2>> = truss.displacement(areas, materials, n);

此函数有三个参数。

  • areas: [f64; K]。桁架中每个元素的区域。
  • materials: [Material; K]。桁架中每个元素的材料。
  • n: usize. 想要的节点在 nodes 中的索引。

如果 displacement 的类型是 None,则阻止 qtruss 解决你的桁架。检查你的 NKF 的值,并确保你的桁架完全约束。

确定总桁架刚度

let compliance: Option<f64> = truss.compliance(areas, materials);

此函数有两个参数。

  • areas: [f64; K]。桁架中每个元素的区域。
  • materials: [Material; K]。桁架中每个元素的材料。

如果 compliance 的类型是 None,则阻止 qtruss 解决你的桁架。检查你的 NKF 的值,并确保你的桁架完全约束。

确定桁架体积

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