2个版本

0.1.1 2024年1月30日
0.1.0 2024年1月30日

#604数学

MIT/Apache

180KB
2.5K SLoC

外表面

外表面为使用离散外微分学(DEC)数学框架对偏微分方程进行离散化提供构建块。这些构建块包括稀疏矩阵算子(外导数、霍奇星)和与任何维度的单纯形网格相关的矢量运算符(协链)。努力提供尽可能多的编译时检查和类型推断机会,以产生简洁且正确的代码。

此外,外表面在可选的visuals模块中提供了一些用于实时可视化的工具,与wgpu一起使用。

当前状态

这个库正在为作者的博士研究而构建,因此首先考虑的是它们的使用案例。主库已经在开发中取得了相当大的进展,实现了与偏微分方程相关的PyDEC的大部分功能,但尚未在许多情况下进行测试。还有一些已知的问题尚未解决。可视化crate目前相当有限,仅支持少数2D用例,但已考虑到最终扩展到3D的可能性。

示例

为了让您了解基本功能,以下代码实现了一个简单的声波模拟

use dexterior as dex;

// type aliases for simulation variables ease readability
type Pressure = dex::Cochain<0, dex::Primal>;
type Velocity = dex::Cochain<1, dex::Primal>;

// meshes can be loaded from files generated with `gmsh`
let msh_bytes = include_bytes!("./examples/meshes/2d_square_pi_x_pi.msh");
let mesh = dex::gmsh::load_trimesh_2d(msh_bytes).expect("Failed to load mesh");

let dt = 0.1;
// generic operator expressed with its input and output type.
// type inference figures out which dimensions of `star` and `d` we need
// to make this expression match the type
let p_step: dex::Op<Velocity, Pressure> =
    -dt * mesh.star() * mesh.d() * mesh.star();
// type inference also knows which `d` we mean here
// because we multiply `p` by this operator later
let v_step = dt * mesh.d();

// integrate an initial state function into discrete cochains
let mut p: Pressure = mesh.integrate_cochain(|v| {
    f64::sin(3.0 * v[0].x) * f64::sin(2.0 * v[0].y)
});
let mut v: Velocity = mesh.new_zero_cochain();

// step the simulation forward in time
for _step in 0..10 {
    p += &p_step * &v;
    v += &v_step * &p;
}

带有可视化的更完整版本在crates/dexterior/examples/membrane.rs中。如果您运行它,它应该看起来像这样(但为动画)

Simulation of a standing wave in a vibrating membrane with colors representing pressure and arrows pointing in the direction of velocity.

请注意,这些示例需要visuals功能,该功能默认未启用,因此您需要使用标志来启用它

cargo run --features visuals --example membrane
# or:
cargo run --all-features --example membrane

dexterior 主要受到了 Python 库 PyDEC 的启发,这是我所知的 DEC(离散微分几何)最全面实现。随附的论文 PyDEC: Software and Algorithms for Discretization of Exterior Calculus,由 Hirani 和 Bell (2012)撰写,对开发工作非常有帮助。

需要感谢的更多文章

关于 DEC 基础知识以及本仓库中声学示例的深入解释,请参阅我的硕士论文

针对新手或有复习需求的读者,提供以下额外推荐

许可证

许可协议为以下之一

任选其一。

贡献

除非你明确声明,否则任何有意提交以包含在你的作品中的贡献,根据 Apache-2.0 许可证定义,将如上双许可,不附加任何额外条款或条件。

依赖

~5–38MB
~600K SLoC